From 7024458c55c0baedfb29c2f9db213d3b0474c851 Mon Sep 17 00:00:00 2001 From: lexborisov Date: Tue, 21 Mar 2017 09:56:42 +0300 Subject: Merge branch 'master' into coverity_scan --- .gitignore | 5 +- .travis.yml | 15 - CHANGELOG.md | Bin 696 -> 2687 bytes INSTALL.md | 70 +- Makefile | 255 +- Makefile.bin.cfg | 53 + Makefile.cfg | 151 + README.md | 16 +- _config.yml | 1 - api_breaking_changes.md | 7 + devel/osx/Modest.xcodeproj/project.pbxproj | 393 +- .../UserInterfaceState.xcuserstate | Bin 134284 -> 149809 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 + .../xcschemes/Modest.xcscheme | 1 - devel/osx/Modest/main.c | 2306 ++++- documents/myhtml_life_cycle.xml | 1 - documents/myhtml_life_cycle_with_thread.png | Bin 132726 -> 0 bytes documents/myhtml_life_cycle_without_threads.png | Bin 56440 -> 0 bytes documents/myhtml_life_cycle_without_threads.xml | 1 - examples/Makefile | 103 +- examples/modest/Makefile.mk | 7 + examples/modest/css_property_to_node.c | 13 +- .../modest/css_real_and_default_property_to_node.c | 13 +- examples/modest/selectors_find_nodes_low_level.c | 17 +- examples/modest/selectors_prepare_low_level.c | 17 +- examples/modest/style_attr_low_level.c | 11 +- examples/mycss/Makefile.mk | 7 + examples/mycss/css_low_level.c | 11 +- examples/mycss/declaration_low_level.c | 9 +- .../mycss/detect_charset_encoding_high_level.c | 4 +- examples/mycss/example.h | 32 + examples/mycss/incoming_buffer_high_level.c | 28 +- examples/mycss/selectors_low_level.c | 9 +- examples/mycss/stylesheet_low_level.c | 7 +- examples/mycss/token_type_convert_high_level.c | 20 +- examples/mycss/tokenizer_buffer_high_level.c | 16 +- examples/mycss/tokenizer_chunk_high_level.c | 10 +- examples/mycss/tokenizer_high_level.c | 8 +- examples/myencoding/Makefile.mk | 7 + examples/myencoding/detect_encoding_by_trigrams.c | 131 + examples/myencoding/detect_encoding_in_meta.c | 102 + examples/myencoding/encoding_by_name.c | 47 + examples/myencoding/example.h | 32 + examples/myfont/Makefile.mk | 7 + examples/myfont/glyph_metrics.c | 20 +- examples/myhtml/Makefile.mk | 7 + examples/myhtml/attributes_high_level.c | 15 +- examples/myhtml/callback_tree_node_high_level.c | 6 +- examples/myhtml/chunks_high_level.c | 11 +- examples/myhtml/custom_tree_high_level.c | 22 +- examples/myhtml/detect_encoding_high_level.c | 128 - .../myhtml/detect_encoding_in_meta_high_level.c | 99 - examples/myhtml/encoding_by_name_high_level.c | 47 - examples/myhtml/example.h | 32 + examples/myhtml/fragment_high_level.c | 9 +- examples/myhtml/get_title_high_level.c | 6 +- examples/myhtml/get_title_low_level.c | 10 +- examples/myhtml/html2sexpr.c | 8 +- .../insert_in_appropriate_place_high_level.c | 9 +- examples/myhtml/modify_and_serialize.c | 9 +- examples/myhtml/nodes_by_attr_key_high_level.c | 16 +- examples/myhtml/nodes_by_attr_value_high_level.c | 16 +- examples/myhtml/parse_without_whitespace.c | 14 +- examples/myhtml/print_tree_high_level.c | 6 +- examples/myhtml/serialization_high_level.c | 12 +- examples/myhtml/string_manipulate_high_level.c | 19 +- examples/myhtml/tokenizer_colorize_high_level.c | 18 +- examples/myhtml/tokenizer_colorize_low_level.c | 14 +- examples/myurl/Makefile.mk | 7 + examples/myurl/url_data.c | 51 + examples/myurl/url_parse.c | 72 + examples/myurl/url_relative.c | 56 + include/modest/declaration.h | 2 +- include/modest/finder/finder.h | 6 +- include/modest/finder/match.h | 2 +- include/modest/finder/myosi.h | 2 +- include/modest/finder/pseudo_class.h | 2 +- include/modest/finder/resource.h | 2 +- include/modest/finder/thread.h | 13 +- include/modest/finder/type.h | 4 +- include/modest/glue.h | 2 +- include/modest/layer/layer.h | 6 +- include/modest/modest.h | 14 +- include/modest/myosi.h | 17 +- include/modest/node/node.h | 8 +- include/modest/node/property.h | 2 +- include/modest/node/raw_property.h | 2 +- include/modest/node/serialization.h | 6 +- include/modest/render/begin.h | 2 +- include/modest/render/binding.h | 2 +- include/modest/render/tree.h | 8 +- include/modest/render/tree_node.h | 6 +- include/modest/style/default.h | 2 +- include/modest/style/default_entries.h | 2 +- include/modest/style/default_resources.h | 2 +- include/modest/style/map.h | 2 +- include/modest/style/map_resource.h | 2 +- include/modest/style/raw.h | 4 +- include/modest/style/sheet.h | 4 +- include/modest/style/type.h | 6 +- include/mycore/incoming.h | 65 + include/mycore/myosi.h | 169 + include/mycore/mystring.h | 125 + include/mycore/mythread.h | 159 + include/mycore/perf.h | 49 + include/mycore/thread_queue.h | 110 + include/mycore/utils.h | 50 + include/mycore/utils/avl_tree.h | 68 + include/mycore/utils/mchar_async.h | 131 + include/mycore/utils/mcobject.h | 70 + include/mycore/utils/mcobject_async.h | 114 + include/mycore/utils/mcsimple.h | 61 + include/mycore/utils/mcsync.h | 75 + include/mycore/utils/mctree.h | 97 + include/mycore/utils/mhash.h | 75 + include/mycore/utils/resources.h | 317 + include/mycss/an_plus_b.h | 8 +- include/mycss/api.h | 59 +- include/mycss/check.h | 2 +- include/mycss/convert.h | 4 +- include/mycss/declaration/default.h | 2 +- include/mycss/declaration/default_entries.h | 2 +- include/mycss/declaration/default_resources.h | 2 +- include/mycss/declaration/entry.h | 4 +- include/mycss/declaration/entry_destroy.h | 2 +- .../mycss/declaration/entry_destroy_resources.h | 2 +- include/mycss/declaration/init.h | 8 +- include/mycss/declaration/myosi.h | 4 +- include/mycss/declaration/parser.h | 2 +- include/mycss/declaration/serialization.h | 48 +- .../mycss/declaration/serialization_resources.h | 2 +- include/mycss/declaration/state.h | 2 +- include/mycss/entry.h | 26 +- include/mycss/media/init.h | 6 +- include/mycss/media/myosi.h | 3 +- include/mycss/media/state.h | 2 +- include/mycss/mycss.h | 36 +- include/mycss/myosi.h | 13 +- include/mycss/mystring.h | 25 +- include/mycss/namespace/init.h | 12 +- include/mycss/namespace/myosi.h | 10 +- include/mycss/namespace/parser.h | 4 +- include/mycss/namespace/serialization.h | 6 +- include/mycss/namespace/state.h | 4 +- include/mycss/parser.h | 4 +- include/mycss/property/const.h | 2 +- include/mycss/property/init.h | 4 +- include/mycss/property/myosi.h | 2 +- include/mycss/property/parser.h | 4 +- include/mycss/property/resources.h | 2 +- include/mycss/property/resources_name.h | 2 +- include/mycss/property/serialization.h | 6 +- include/mycss/property/shared.h | 66 +- include/mycss/selectors/function.h | 2 +- include/mycss/selectors/function_parser.h | 2 +- include/mycss/selectors/function_resource.h | 2 +- include/mycss/selectors/init.h | 10 +- include/mycss/selectors/list.h | 2 +- include/mycss/selectors/myosi.h | 6 +- include/mycss/selectors/myosi_resource.h | 2 +- include/mycss/selectors/parser.h | 2 +- include/mycss/selectors/pseudo.h | 2 +- include/mycss/selectors/pseudo_resource.h | 2 +- include/mycss/selectors/serialization.h | 8 +- include/mycss/selectors/state.h | 4 +- include/mycss/selectors/value.h | 10 +- include/mycss/selectors/value_resource.h | 2 +- include/mycss/stack.h | 6 +- include/mycss/stylesheet.h | 8 +- include/mycss/tokenizer.h | 12 +- include/mycss/tokenizer_end.h | 2 +- include/mycss/tokenizer_global.h | 2 +- include/mycss/tokenizer_resource.h | 2 +- include/mycss/values/color.h | 2 +- include/mycss/values/color_const.h | 2 +- include/mycss/values/color_parser.h | 4 +- include/mycss/values/color_resources.h | 2 +- include/mycss/values/consume.h | 2 +- include/mycss/values/destroy.h | 2 +- include/mycss/values/image.h | 2 +- include/mycss/values/image_resources.h | 2 +- include/mycss/values/resources.h | 2 +- include/mycss/values/serialization.h | 32 +- include/mycss/values/units.h | 4 +- include/mycss/values/units_resources.h | 2 +- include/mycss/values/values.h | 48 +- include/myencoding/detect_resource.h | 5626 ++++++++++++ include/myencoding/encoding.h | 160 + include/myencoding/myosi.h | 114 + include/myencoding/mystring.h | 48 + include/myencoding/resource.h | 9377 ++++++++++++++++++++ include/myfont/cmap.h | 6 +- include/myfont/glyf.h | 14 +- include/myfont/head.h | 6 +- include/myfont/hhea.h | 4 +- include/myfont/hmtx.h | 4 +- include/myfont/loca.h | 6 +- include/myfont/maxp.h | 4 +- include/myfont/myfont.h | 33 +- include/myfont/myosi.h | 3 +- include/myfont/name.h | 6 +- include/myfont/os_2.h | 6 +- include/myfont/pclt.h | 4 +- include/myfont/vhea.h | 4 +- include/myfont/vmtx.h | 4 +- include/myhtml/api.h | 578 +- include/myhtml/api_encoding.h | 71 - include/myhtml/callback.h | 2 +- include/myhtml/charef.h | 2 +- include/myhtml/charef_resource.h | 2 +- include/myhtml/data_process.h | 24 +- include/myhtml/def.h | 2 +- include/myhtml/encoding.h | 163 - include/myhtml/encoding_detect_resource.h | 5626 ------------ include/myhtml/encoding_resource.h | 9330 ------------------- include/myhtml/incoming.h | 68 - include/myhtml/myhtml.h | 97 +- include/myhtml/mynamespace.h | 4 +- include/myhtml/mynamespace_resource.h | 2 +- include/myhtml/myosi.h | 260 +- include/myhtml/mystring.h | 128 +- include/myhtml/parser.h | 8 +- include/myhtml/rules.h | 6 +- include/myhtml/serialization.h | 14 +- include/myhtml/stream.h | 8 +- include/myhtml/tag.h | 20 +- include/myhtml/tag_const.h | 2 +- include/myhtml/thread.h | 224 - include/myhtml/token.h | 26 +- include/myhtml/tokenizer.h | 18 +- include/myhtml/tokenizer_doctype.h | 4 +- include/myhtml/tokenizer_end.h | 2 +- include/myhtml/tokenizer_script.h | 4 +- include/myhtml/tree.h | 46 +- include/myhtml/utils.h | 49 - include/myhtml/utils/avl_tree.h | 68 - include/myhtml/utils/mchar_async.h | 131 - include/myhtml/utils/mcobject.h | 70 - include/myhtml/utils/mcobject_async.h | 114 - include/myhtml/utils/mcsimple.h | 61 - include/myhtml/utils/mcsync.h | 81 - include/myhtml/utils/mctree.h | 97 - include/myhtml/utils/mhash.h | 65 - include/myhtml/utils/resources.h | 217 - include/myunicode/myosi.h | 35 + include/myurl/host.h | 105 + include/myurl/myosi.h | 83 + include/myurl/parser.h | 103 + include/myurl/path.h | 67 + include/myurl/punycode.h | 48 + include/myurl/resources.h | 180 + include/myurl/scheme.h | 78 + include/myurl/scheme_const.h | 43 + include/myurl/scheme_resources.h | 64 + include/myurl/serialization.h | 47 + include/myurl/url.h | 195 + include/myurl/utils.h | 73 + modest.pc.in | 10 + projects/CMakeLists.txt | 205 - source/modest/Makefile.mk | 21 +- source/modest/declaration.c | 2 +- source/modest/declaration.h | 2 +- source/modest/finder/finder.c | 16 +- source/modest/finder/finder.h | 6 +- source/modest/finder/match.c | 69 +- source/modest/finder/match.h | 2 +- source/modest/finder/myosi.h | 2 +- source/modest/finder/pseudo_class.c | 16 +- source/modest/finder/pseudo_class.h | 2 +- source/modest/finder/resource.h | 2 +- source/modest/finder/thread.c | 157 +- source/modest/finder/thread.h | 13 +- source/modest/finder/type.c | 4 +- source/modest/finder/type.h | 4 +- source/modest/glue.c | 2 +- source/modest/glue.h | 2 +- source/modest/layer/layer.c | 2 +- source/modest/layer/layer.h | 6 +- source/modest/modest.c | 28 +- source/modest/modest.h | 14 +- source/modest/myosi.h | 17 +- source/modest/node/node.c | 12 +- source/modest/node/node.h | 8 +- source/modest/node/property.c | 2 +- source/modest/node/property.h | 2 +- source/modest/node/raw_property.c | 2 +- source/modest/node/raw_property.h | 2 +- source/modest/node/serialization.c | 12 +- source/modest/node/serialization.h | 6 +- source/modest/render/begin.c | 2 +- source/modest/render/begin.h | 2 +- source/modest/render/binding.c | 2 +- source/modest/render/binding.h | 2 +- source/modest/render/tree.c | 12 +- source/modest/render/tree.h | 8 +- source/modest/render/tree_node.c | 4 +- source/modest/render/tree_node.h | 6 +- source/modest/style/default.c | 2 +- source/modest/style/default.h | 2 +- source/modest/style/default_entries.h | 2 +- source/modest/style/default_resources.h | 2 +- source/modest/style/map.c | 2 +- source/modest/style/map.h | 2 +- source/modest/style/map_resource.h | 2 +- source/modest/style/raw.c | 2 +- source/modest/style/raw.h | 4 +- source/modest/style/sheet.c | 4 +- source/modest/style/sheet.h | 4 +- source/modest/style/type.c | 4 +- source/modest/style/type.h | 6 +- source/mycore/Makefile.mk | 13 + source/mycore/incoming.c | 228 + source/mycore/incoming.h | 65 + source/mycore/myosi.c | 22 + source/mycore/myosi.h | 169 + source/mycore/mystring.c | 319 + source/mycore/mystring.h | 125 + source/mycore/mythread.c | 331 + source/mycore/mythread.h | 159 + source/mycore/perf.h | 49 + source/mycore/thread_queue.c | 654 ++ source/mycore/thread_queue.h | 110 + source/mycore/utils.c | 183 + source/mycore/utils.h | 50 + source/mycore/utils/avl_tree.c | 353 + source/mycore/utils/avl_tree.h | 68 + source/mycore/utils/mchar_async.c | 851 ++ source/mycore/utils/mchar_async.h | 131 + source/mycore/utils/mcobject.c | 194 + source/mycore/utils/mcobject.h | 70 + source/mycore/utils/mcobject_async.c | 486 + source/mycore/utils/mcobject_async.h | 114 + source/mycore/utils/mcsimple.c | 125 + source/mycore/utils/mcsimple.h | 61 + source/mycore/utils/mcsync.c | 99 + source/mycore/utils/mcsync.h | 75 + source/mycore/utils/mctree.c | 292 + source/mycore/utils/mctree.h | 97 + source/mycore/utils/mhash.c | 275 + source/mycore/utils/mhash.h | 75 + source/mycore/utils/resources.h | 317 + source/mycss/Makefile.mk | 19 +- source/mycss/an_plus_b.c | 114 +- source/mycss/an_plus_b.h | 8 +- source/mycss/api.h | 59 +- source/mycss/check.c | 8 +- source/mycss/check.h | 2 +- source/mycss/convert.c | 18 +- source/mycss/convert.h | 4 +- source/mycss/declaration/default.c | 2 +- source/mycss/declaration/default.h | 2 +- source/mycss/declaration/default_entries.h | 2 +- source/mycss/declaration/default_resources.h | 2 +- source/mycss/declaration/entry.c | 4 +- source/mycss/declaration/entry.h | 4 +- source/mycss/declaration/entry_destroy.c | 2 +- source/mycss/declaration/entry_destroy.h | 2 +- source/mycss/declaration/entry_destroy_resources.h | 2 +- source/mycss/declaration/init.c | 14 +- source/mycss/declaration/init.h | 8 +- source/mycss/declaration/myosi.h | 4 +- source/mycss/declaration/parser.c | 6 +- source/mycss/declaration/parser.h | 2 +- source/mycss/declaration/serialization.c | 60 +- source/mycss/declaration/serialization.h | 48 +- source/mycss/declaration/serialization_resources.h | 2 +- source/mycss/declaration/state.c | 10 +- source/mycss/declaration/state.h | 2 +- source/mycss/entry.c | 64 +- source/mycss/entry.h | 26 +- source/mycss/media/init.c | 10 +- source/mycss/media/init.h | 6 +- source/mycss/media/myosi.h | 3 +- source/mycss/media/state.h | 2 +- source/mycss/mycss.c | 48 +- source/mycss/mycss.h | 36 +- source/mycss/myosi.h | 13 +- source/mycss/mystring.c | 74 +- source/mycss/mystring.h | 25 +- source/mycss/namespace/init.c | 44 +- source/mycss/namespace/init.h | 12 +- source/mycss/namespace/myosi.h | 10 +- source/mycss/namespace/parser.c | 10 +- source/mycss/namespace/parser.h | 4 +- source/mycss/namespace/serialization.c | 8 +- source/mycss/namespace/serialization.h | 6 +- source/mycss/namespace/state.c | 16 +- source/mycss/namespace/state.h | 4 +- source/mycss/parser.c | 8 +- source/mycss/parser.h | 4 +- source/mycss/property/const.h | 2 +- source/mycss/property/init.c | 16 +- source/mycss/property/init.h | 4 +- source/mycss/property/myosi.h | 2 +- source/mycss/property/parser.c | 140 +- source/mycss/property/parser.h | 4 +- source/mycss/property/parser_background.c | 46 +- source/mycss/property/parser_image.c | 40 +- source/mycss/property/parser_text_decoration.c | 16 +- source/mycss/property/parser_url.c | 4 +- source/mycss/property/resources.h | 2 +- source/mycss/property/resources_name.h | 2 +- source/mycss/property/serialization.c | 6 +- source/mycss/property/serialization.h | 6 +- source/mycss/property/shared.c | 108 +- source/mycss/property/shared.h | 66 +- source/mycss/selectors/function.c | 10 +- source/mycss/selectors/function.h | 2 +- source/mycss/selectors/function_parser.c | 20 +- source/mycss/selectors/function_parser.h | 2 +- source/mycss/selectors/function_resource.h | 2 +- source/mycss/selectors/init.c | 20 +- source/mycss/selectors/init.h | 10 +- source/mycss/selectors/list.c | 2 +- source/mycss/selectors/list.h | 2 +- source/mycss/selectors/myosi.h | 6 +- source/mycss/selectors/myosi_resource.h | 2 +- source/mycss/selectors/parser.c | 32 +- source/mycss/selectors/parser.h | 2 +- source/mycss/selectors/pseudo.c | 10 +- source/mycss/selectors/pseudo.h | 2 +- source/mycss/selectors/pseudo_resource.h | 2 +- source/mycss/selectors/serialization.c | 14 +- source/mycss/selectors/serialization.h | 8 +- source/mycss/selectors/state.c | 44 +- source/mycss/selectors/state.h | 4 +- source/mycss/selectors/value.c | 22 +- source/mycss/selectors/value.h | 10 +- source/mycss/selectors/value_resource.h | 2 +- source/mycss/stack.c | 16 +- source/mycss/stack.h | 6 +- source/mycss/stylesheet.c | 16 +- source/mycss/stylesheet.h | 8 +- source/mycss/tokenizer.c | 42 +- source/mycss/tokenizer.h | 12 +- source/mycss/tokenizer_end.c | 2 +- source/mycss/tokenizer_end.h | 2 +- source/mycss/tokenizer_global.c | 8 +- source/mycss/tokenizer_global.h | 2 +- source/mycss/tokenizer_resource.h | 2 +- source/mycss/values/color.c | 16 +- source/mycss/values/color.h | 2 +- source/mycss/values/color_const.h | 2 +- source/mycss/values/color_parser.c | 152 +- source/mycss/values/color_parser.h | 4 +- source/mycss/values/color_resources.h | 2 +- source/mycss/values/consume.c | 20 +- source/mycss/values/consume.h | 2 +- source/mycss/values/destroy.c | 40 +- source/mycss/values/destroy.h | 2 +- source/mycss/values/image.c | 30 +- source/mycss/values/image.h | 2 +- source/mycss/values/image_resources.h | 2 +- source/mycss/values/resources.h | 2 +- source/mycss/values/serialization.c | 188 +- source/mycss/values/serialization.h | 32 +- source/mycss/values/units.c | 10 +- source/mycss/values/units.h | 4 +- source/mycss/values/units_resources.h | 2 +- source/mycss/values/values.c | 2 +- source/mycss/values/values.h | 48 +- source/myencoding/Makefile.mk | 13 + source/myencoding/detect.c | 947 ++ source/myencoding/detect_resource.h | 5626 ++++++++++++ source/myencoding/encoding.c | 1244 +++ source/myencoding/encoding.h | 160 + source/myencoding/myosi.h | 114 + source/myencoding/mystring.c | 89 + source/myencoding/mystring.h | 48 + source/myencoding/resource.h | 9377 ++++++++++++++++++++ source/myfont/Makefile.mk | 21 +- source/myfont/cmap.c | 40 +- source/myfont/cmap.h | 6 +- source/myfont/glyf.c | 48 +- source/myfont/glyf.h | 14 +- source/myfont/head.c | 8 +- source/myfont/head.h | 6 +- source/myfont/hhea.c | 8 +- source/myfont/hhea.h | 4 +- source/myfont/hmtx.c | 8 +- source/myfont/hmtx.h | 4 +- source/myfont/loca.c | 14 +- source/myfont/loca.h | 6 +- source/myfont/maxp.c | 12 +- source/myfont/maxp.h | 4 +- source/myfont/myfont.c | 172 +- source/myfont/myfont.h | 33 +- source/myfont/myosi.c | 2 +- source/myfont/myosi.h | 3 +- source/myfont/name.c | 14 +- source/myfont/name.h | 6 +- source/myfont/os_2.c | 14 +- source/myfont/os_2.h | 6 +- source/myfont/pclt.c | 8 +- source/myfont/pclt.h | 4 +- source/myfont/vhea.c | 8 +- source/myfont/vhea.h | 4 +- source/myfont/vmtx.c | 10 +- source/myfont/vmtx.h | 4 +- source/myhtml/Makefile.mk | 21 +- source/myhtml/api.h | 578 +- source/myhtml/api_encoding.h | 71 - source/myhtml/callback.c | 2 +- source/myhtml/callback.h | 2 +- source/myhtml/charef.c | 2 +- source/myhtml/charef.h | 2 +- source/myhtml/charef_resource.h | 2 +- source/myhtml/data_process.c | 54 +- source/myhtml/data_process.h | 24 +- source/myhtml/def.h | 2 +- source/myhtml/encoding.c | 1222 --- source/myhtml/encoding.h | 163 - source/myhtml/encoding_detect.c | 948 -- source/myhtml/encoding_detect_resource.h | 5626 ------------ source/myhtml/encoding_resource.h | 9330 ------------------- source/myhtml/incoming.c | 232 - source/myhtml/incoming.h | 68 - source/myhtml/myhtml.c | 409 +- source/myhtml/myhtml.h | 97 +- source/myhtml/mynamespace.c | 10 +- source/myhtml/mynamespace.h | 4 +- source/myhtml/mynamespace_resource.h | 2 +- source/myhtml/myosi.c | 50 - source/myhtml/myosi.h | 260 +- source/myhtml/mystring.c | 449 +- source/myhtml/mystring.h | 128 +- source/myhtml/parser.c | 66 +- source/myhtml/parser.h | 8 +- source/myhtml/perf.c | 288 - source/myhtml/rules.c | 69 +- source/myhtml/rules.h | 6 +- source/myhtml/serialization.c | 326 +- source/myhtml/serialization.h | 14 +- source/myhtml/stream.c | 26 +- source/myhtml/stream.h | 8 +- source/myhtml/tag.c | 45 +- source/myhtml/tag.h | 20 +- source/myhtml/tag_const.h | 2 +- source/myhtml/tag_init.c | 12 +- source/myhtml/thread.c | 1185 --- source/myhtml/thread.h | 224 - source/myhtml/token.c | 294 +- source/myhtml/token.h | 26 +- source/myhtml/tokenizer.c | 122 +- source/myhtml/tokenizer.h | 18 +- source/myhtml/tokenizer_doctype.c | 6 +- source/myhtml/tokenizer_doctype.h | 4 +- source/myhtml/tokenizer_end.c | 2 +- source/myhtml/tokenizer_end.h | 2 +- source/myhtml/tokenizer_script.c | 18 +- source/myhtml/tokenizer_script.h | 4 +- source/myhtml/tree.c | 440 +- source/myhtml/tree.h | 46 +- source/myhtml/utils.c | 201 - source/myhtml/utils.h | 49 - source/myhtml/utils/avl_tree.c | 353 - source/myhtml/utils/avl_tree.h | 68 - source/myhtml/utils/mchar_async.c | 770 -- source/myhtml/utils/mchar_async.h | 131 - source/myhtml/utils/mcobject.c | 194 - source/myhtml/utils/mcobject.h | 70 - source/myhtml/utils/mcobject_async.c | 475 - source/myhtml/utils/mcobject_async.h | 114 - source/myhtml/utils/mcsimple.c | 125 - source/myhtml/utils/mcsimple.h | 61 - source/myhtml/utils/mcsync.c | 155 - source/myhtml/utils/mcsync.h | 81 - source/myhtml/utils/mctree.c | 285 - source/myhtml/utils/mctree.h | 97 - source/myhtml/utils/mhash.c | 267 - source/myhtml/utils/mhash.h | 65 - source/myhtml/utils/resources.h | 217 - source/myport/posix/Makefile.mk | 9 + source/myport/posix/Rules.mk | 27 + source/myport/posix/mycore/io.c | 69 + source/myport/posix/mycore/memory.c | 42 + source/myport/posix/mycore/perf.c | 136 + source/myport/posix/mycore/thread.c | 160 + source/myport/posix/mycore/utils/mcsync.c | 149 + source/myport/windows_nt/Makefile.mk | 9 + source/myport/windows_nt/Rules.mk | 21 + source/myport/windows_nt/mycore/io.c | 71 + source/myport/windows_nt/mycore/memory.c | 42 + source/myport/windows_nt/mycore/perf.c | 92 + source/myport/windows_nt/mycore/thread.c | 131 + source/myport/windows_nt/mycore/utils/mcsync.c | 117 + source/myunicode/Makefile.mk | 13 + source/myunicode/myosi.c | 36 + source/myunicode/myosi.h | 35 + source/myurl/Makefile.mk | 13 + source/myurl/host.c | 631 ++ source/myurl/host.h | 105 + source/myurl/myosi.c | 38 + source/myurl/myosi.h | 83 + source/myurl/parser.c | 1164 +++ source/myurl/parser.h | 103 + source/myurl/parser_end.c | 347 + source/myurl/path.c | 286 + source/myurl/path.h | 67 + source/myurl/punycode.c | 395 + source/myurl/punycode.h | 48 + source/myurl/resources.h | 180 + source/myurl/scheme.c | 104 + source/myurl/scheme.h | 78 + source/myurl/scheme_const.h | 43 + source/myurl/scheme_resources.h | 64 + source/myurl/serialization.c | 221 + source/myurl/serialization.h | 47 + source/myurl/url.c | 649 ++ source/myurl/url.h | 195 + source/myurl/utils.c | 461 + source/myurl/utils.h | 73 + test/Makefile | 110 +- test/mycore/Makefile.mk | 7 + test/mycore/data/encoding/detect_meta.html | 736 ++ test/mycore/encoding_detect_meta.c | 178 + test/mycore/utils/avl_tree.c | 798 ++ test/mycss/Makefile.mk | 9 + test/mycss/declaration.c | 66 +- test/myencoding/Makefile.mk | 9 + test/myencoding/data/encoding/detect_meta.html | 736 ++ test/myencoding/encoding_detect_meta.c | 178 + test/myhtml/Makefile.mk | 7 + test/myhtml/commoncrawl.c | 294 + test/myhtml/data/encoding/detect_meta.html | 736 -- test/myhtml/encoding_detect_meta.c | 178 - test/myhtml/utils/avl_tree.c | 798 -- test/myurl/Makefile.mk | 9 + test/myurl/data/fragment.test | 25 + test/myurl/data/hostname.test | 19 + test/myurl/data/ipv4.test | 161 + test/myurl/data/ipv6.test | 176 + test/myurl/data/mailto.test | 28 + test/myurl/data/miscellaneous.test | 43 + test/myurl/data/path.test | 183 + test/myurl/data/port.test | 34 + test/myurl/data/query.test | 26 + test/myurl/data/relative.test | 208 + test/myurl/data/relative_win.test | 77 + test/myurl/data/scheme.test | 100 + test/myurl/url.c | 514 ++ utils/MyHTML/encoding_name.pl | 29 +- utils/MyHTML/url_resources.pl | 66 +- 643 files changed, 60948 insertions(+), 47570 deletions(-) create mode 100644 Makefile.bin.cfg create mode 100644 Makefile.cfg delete mode 100644 _config.yml delete mode 100644 documents/myhtml_life_cycle.xml delete mode 100644 documents/myhtml_life_cycle_with_thread.png delete mode 100644 documents/myhtml_life_cycle_without_threads.png delete mode 100644 documents/myhtml_life_cycle_without_threads.xml create mode 100644 examples/modest/Makefile.mk create mode 100644 examples/mycss/Makefile.mk create mode 100644 examples/mycss/example.h create mode 100644 examples/myencoding/Makefile.mk create mode 100644 examples/myencoding/detect_encoding_by_trigrams.c create mode 100644 examples/myencoding/detect_encoding_in_meta.c create mode 100644 examples/myencoding/encoding_by_name.c create mode 100644 examples/myencoding/example.h create mode 100644 examples/myfont/Makefile.mk create mode 100644 examples/myhtml/Makefile.mk delete mode 100644 examples/myhtml/detect_encoding_high_level.c delete mode 100644 examples/myhtml/detect_encoding_in_meta_high_level.c delete mode 100644 examples/myhtml/encoding_by_name_high_level.c create mode 100644 examples/myhtml/example.h create mode 100644 examples/myurl/Makefile.mk create mode 100644 examples/myurl/url_data.c create mode 100644 examples/myurl/url_parse.c create mode 100644 examples/myurl/url_relative.c create mode 100644 include/mycore/incoming.h create mode 100644 include/mycore/myosi.h create mode 100644 include/mycore/mystring.h create mode 100644 include/mycore/mythread.h create mode 100644 include/mycore/perf.h create mode 100644 include/mycore/thread_queue.h create mode 100644 include/mycore/utils.h create mode 100644 include/mycore/utils/avl_tree.h create mode 100644 include/mycore/utils/mchar_async.h create mode 100644 include/mycore/utils/mcobject.h create mode 100644 include/mycore/utils/mcobject_async.h create mode 100644 include/mycore/utils/mcsimple.h create mode 100644 include/mycore/utils/mcsync.h create mode 100644 include/mycore/utils/mctree.h create mode 100644 include/mycore/utils/mhash.h create mode 100644 include/mycore/utils/resources.h create mode 100644 include/myencoding/detect_resource.h create mode 100644 include/myencoding/encoding.h create mode 100644 include/myencoding/myosi.h create mode 100644 include/myencoding/mystring.h create mode 100644 include/myencoding/resource.h delete mode 100644 include/myhtml/api_encoding.h delete mode 100644 include/myhtml/encoding.h delete mode 100644 include/myhtml/encoding_detect_resource.h delete mode 100644 include/myhtml/encoding_resource.h delete mode 100644 include/myhtml/incoming.h delete mode 100644 include/myhtml/thread.h delete mode 100644 include/myhtml/utils.h delete mode 100644 include/myhtml/utils/avl_tree.h delete mode 100644 include/myhtml/utils/mchar_async.h delete mode 100644 include/myhtml/utils/mcobject.h delete mode 100644 include/myhtml/utils/mcobject_async.h delete mode 100644 include/myhtml/utils/mcsimple.h delete mode 100644 include/myhtml/utils/mcsync.h delete mode 100644 include/myhtml/utils/mctree.h delete mode 100644 include/myhtml/utils/mhash.h delete mode 100644 include/myhtml/utils/resources.h create mode 100644 include/myunicode/myosi.h create mode 100644 include/myurl/host.h create mode 100644 include/myurl/myosi.h create mode 100644 include/myurl/parser.h create mode 100644 include/myurl/path.h create mode 100644 include/myurl/punycode.h create mode 100644 include/myurl/resources.h create mode 100644 include/myurl/scheme.h create mode 100644 include/myurl/scheme_const.h create mode 100644 include/myurl/scheme_resources.h create mode 100644 include/myurl/serialization.h create mode 100644 include/myurl/url.h create mode 100644 include/myurl/utils.h create mode 100644 modest.pc.in delete mode 100644 projects/CMakeLists.txt create mode 100644 source/mycore/Makefile.mk create mode 100644 source/mycore/incoming.c create mode 100644 source/mycore/incoming.h create mode 100644 source/mycore/myosi.c create mode 100644 source/mycore/myosi.h create mode 100644 source/mycore/mystring.c create mode 100644 source/mycore/mystring.h create mode 100644 source/mycore/mythread.c create mode 100644 source/mycore/mythread.h create mode 100644 source/mycore/perf.h create mode 100644 source/mycore/thread_queue.c create mode 100644 source/mycore/thread_queue.h create mode 100644 source/mycore/utils.c create mode 100644 source/mycore/utils.h create mode 100644 source/mycore/utils/avl_tree.c create mode 100644 source/mycore/utils/avl_tree.h create mode 100644 source/mycore/utils/mchar_async.c create mode 100644 source/mycore/utils/mchar_async.h create mode 100644 source/mycore/utils/mcobject.c create mode 100644 source/mycore/utils/mcobject.h create mode 100644 source/mycore/utils/mcobject_async.c create mode 100644 source/mycore/utils/mcobject_async.h create mode 100644 source/mycore/utils/mcsimple.c create mode 100644 source/mycore/utils/mcsimple.h create mode 100644 source/mycore/utils/mcsync.c create mode 100644 source/mycore/utils/mcsync.h create mode 100644 source/mycore/utils/mctree.c create mode 100644 source/mycore/utils/mctree.h create mode 100644 source/mycore/utils/mhash.c create mode 100644 source/mycore/utils/mhash.h create mode 100644 source/mycore/utils/resources.h create mode 100644 source/myencoding/Makefile.mk create mode 100644 source/myencoding/detect.c create mode 100644 source/myencoding/detect_resource.h create mode 100644 source/myencoding/encoding.c create mode 100644 source/myencoding/encoding.h create mode 100644 source/myencoding/myosi.h create mode 100644 source/myencoding/mystring.c create mode 100644 source/myencoding/mystring.h create mode 100644 source/myencoding/resource.h delete mode 100644 source/myhtml/api_encoding.h delete mode 100644 source/myhtml/encoding.c delete mode 100644 source/myhtml/encoding.h delete mode 100644 source/myhtml/encoding_detect.c delete mode 100644 source/myhtml/encoding_detect_resource.h delete mode 100644 source/myhtml/encoding_resource.h delete mode 100644 source/myhtml/incoming.c delete mode 100644 source/myhtml/incoming.h delete mode 100644 source/myhtml/myosi.c delete mode 100644 source/myhtml/perf.c delete mode 100644 source/myhtml/thread.c delete mode 100644 source/myhtml/thread.h delete mode 100644 source/myhtml/utils.c delete mode 100644 source/myhtml/utils.h delete mode 100644 source/myhtml/utils/avl_tree.c delete mode 100644 source/myhtml/utils/avl_tree.h delete mode 100644 source/myhtml/utils/mchar_async.c delete mode 100644 source/myhtml/utils/mchar_async.h delete mode 100644 source/myhtml/utils/mcobject.c delete mode 100644 source/myhtml/utils/mcobject.h delete mode 100644 source/myhtml/utils/mcobject_async.c delete mode 100644 source/myhtml/utils/mcobject_async.h delete mode 100644 source/myhtml/utils/mcsimple.c delete mode 100644 source/myhtml/utils/mcsimple.h delete mode 100644 source/myhtml/utils/mcsync.c delete mode 100644 source/myhtml/utils/mcsync.h delete mode 100644 source/myhtml/utils/mctree.c delete mode 100644 source/myhtml/utils/mctree.h delete mode 100644 source/myhtml/utils/mhash.c delete mode 100644 source/myhtml/utils/mhash.h delete mode 100644 source/myhtml/utils/resources.h create mode 100644 source/myport/posix/Makefile.mk create mode 100644 source/myport/posix/Rules.mk create mode 100644 source/myport/posix/mycore/io.c create mode 100644 source/myport/posix/mycore/memory.c create mode 100644 source/myport/posix/mycore/perf.c create mode 100644 source/myport/posix/mycore/thread.c create mode 100644 source/myport/posix/mycore/utils/mcsync.c create mode 100644 source/myport/windows_nt/Makefile.mk create mode 100644 source/myport/windows_nt/Rules.mk create mode 100644 source/myport/windows_nt/mycore/io.c create mode 100644 source/myport/windows_nt/mycore/memory.c create mode 100644 source/myport/windows_nt/mycore/perf.c create mode 100644 source/myport/windows_nt/mycore/thread.c create mode 100644 source/myport/windows_nt/mycore/utils/mcsync.c create mode 100644 source/myunicode/Makefile.mk create mode 100644 source/myunicode/myosi.c create mode 100644 source/myunicode/myosi.h create mode 100644 source/myurl/Makefile.mk create mode 100644 source/myurl/host.c create mode 100644 source/myurl/host.h create mode 100644 source/myurl/myosi.c create mode 100644 source/myurl/myosi.h create mode 100644 source/myurl/parser.c create mode 100644 source/myurl/parser.h create mode 100644 source/myurl/parser_end.c create mode 100644 source/myurl/path.c create mode 100644 source/myurl/path.h create mode 100644 source/myurl/punycode.c create mode 100644 source/myurl/punycode.h create mode 100644 source/myurl/resources.h create mode 100644 source/myurl/scheme.c create mode 100644 source/myurl/scheme.h create mode 100644 source/myurl/scheme_const.h create mode 100644 source/myurl/scheme_resources.h create mode 100644 source/myurl/serialization.c create mode 100644 source/myurl/serialization.h create mode 100644 source/myurl/url.c create mode 100644 source/myurl/url.h create mode 100644 source/myurl/utils.c create mode 100644 source/myurl/utils.h create mode 100644 test/mycore/Makefile.mk create mode 100644 test/mycore/data/encoding/detect_meta.html create mode 100644 test/mycore/encoding_detect_meta.c create mode 100644 test/mycore/utils/avl_tree.c create mode 100644 test/mycss/Makefile.mk create mode 100644 test/myencoding/Makefile.mk create mode 100644 test/myencoding/data/encoding/detect_meta.html create mode 100644 test/myencoding/encoding_detect_meta.c create mode 100644 test/myhtml/Makefile.mk create mode 100644 test/myhtml/commoncrawl.c delete mode 100644 test/myhtml/data/encoding/detect_meta.html delete mode 100644 test/myhtml/encoding_detect_meta.c delete mode 100644 test/myhtml/utils/avl_tree.c create mode 100644 test/myurl/Makefile.mk create mode 100644 test/myurl/data/fragment.test create mode 100644 test/myurl/data/hostname.test create mode 100644 test/myurl/data/ipv4.test create mode 100644 test/myurl/data/ipv6.test create mode 100644 test/myurl/data/mailto.test create mode 100644 test/myurl/data/miscellaneous.test create mode 100644 test/myurl/data/path.test create mode 100644 test/myurl/data/port.test create mode 100644 test/myurl/data/query.test create mode 100644 test/myurl/data/relative.test create mode 100644 test/myurl/data/relative_win.test create mode 100644 test/myurl/data/scheme.test create mode 100644 test/myurl/url.c diff --git a/.gitignore b/.gitignore index 496ee2c..c2365ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ -.DS_Store \ No newline at end of file +.DS_Store +*.o +*.exe +*~ diff --git a/.travis.yml b/.travis.yml index 6b9b061..a058837 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,19 +3,4 @@ compiler: - clang - gcc install: false - -env: - global: - - secure: "gNSRCjo+hi14yLpCDEmwZfzy0DFoOR+9BmkdpJhTK8NjUvIy+RmFtXgT98QHgh+fow8v/YXl8hSnyDT2+oSmsKN9P113ssgYihwoB4IuIBLSIrAf9KPfhIh6LZC23lKltQUrP9yPo3jzdD1dte1xv2tKRImDZ1Cze987EjDBbSwuVP/Gj3JlWMAafEPrh48jCM/O4DXR4podcd1biXbyX8+lbYJSFVaIq0SuagzK5Kjv8nDAFYlNk27RdhQGemmZOsM5xQM4PpgKpcQVHh0YuObCryf/O+orCDh7dOu9QlbMijabYxz/Jx7fZ1mLQGm7Kj6ETdCcf80MrrDechjJgh7uyFE/+VPDfkdaSCm1vMJCNBRgFSM0bxXqtLAyNs9TNOIJ3TUv3M4eN98Feh7I3ip9eTU/0R36HKU7sk+yotmOuAMDaMikbTQ2UuHekKev3TD0dA5O6xatyDF3jCnTJ+8aYQ096A79ZSabWUiLe6IyV/NauqSfY+mOz2NA+TxqzW92HqStdvmeOuSqCGdkGi3o2z77jEez795l2bqnIziuZhojfxjtvc/ryaZaBMYWqjSlOzRcix/SwIt8ccDCXJ4F/aNi16mYuDdL5c2mQaxtZ5Xz1IZduU87f6pWHdhLPoRMqpd/XChJVwKSFxbKmRWynUfHTcwJePSSyn5GRNA=" - -addons: - coverity_scan: - project: - name: "lexborisov/Modest" - description: "Build submitted via Travis CI" - notification_email: lex.borisov@gmail.com - build_command_prepend: "" - build_command: "make -j4" - branch_pattern: coverity_scan - script: make -j4 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 6340e65..e27ca9b 100644 Binary files a/CHANGELOG.md and b/CHANGELOG.md differ diff --git a/INSTALL.md b/INSTALL.md index c8ac12e..0464370 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,51 +1,47 @@ # Modest: Build and Installation -## make +## GNU Make -In root directory: +In root directory of project (`/`): ```bash make +make test +sudo make install ``` -If successful copy lib/* and include/* at the right place for you - Flags that can be passed to make: -- `MODEST_OPTIMIZATION_LEVEL=-O2` set compiler optimization level. Default: -O2 -- `MODEST_BUILD_WITHOUT_THREADS=YES` build without POSIX Threads. Default: NO - -*for example* -```bash -make MODEST_BUILD_WITHOUT_THREADS=NO -``` - -and copy to the right place for you +- `prefix`, default /usr/local +- `OS`, if not defined try to get from "uname -s" +- `PROJECT_OPTIMIZATION_LEVEL`, default -O2 +- `MyCORE_BUILD_WITHOUT_THREADS`, YES or (NO or undefined), default undefined +- `MyCORE_BUILD_DEBUG`, YES or (NO or undefined), default undefined +- `MyCORE_WITH_PERF`, YES or (NO or undefined), default undefined, try build with timers (rdtsc or some), OS dependent, may not work on some systems, +- `PROJECT_INSTALL_HEADER`, default "include" +- `PROJECT_INSTALL_LIBRARY`, default "lib" +- `PROJECT_INSTALL_WITHOUT_HEADERS`, YES or (NO or undefined), default undefined + +*for example*: ```bash -cp lib/* /usr/local/lib -cp -r include/* /usr/local/include -``` - -## cmake - -In `project` directory: -```bash -cmake . -make +make -j4 prefix=/usr MyCORE_BUILD_WITHOUT_THREADS=YES sudo make install ``` -Flags that can be passed to CMake: -- `MODEST_OPTIMIZATION_LEVEL=-O2` set compiler optimization level. Default: -O2 -- `CMAKE_INSTALL_LIBDIR=lib` set path to install created library. Default: lib -- `MODEST_BUILD_SHARED=ON` build shared library. Default: ON -- `MODEST_BUILD_STATIC=ON` build static library. Default: ON -- `MODEST_INSTALL_HEADER=OFF` install header files. Default OFF -- `MODEST_BUILD_WITHOUT_THREADS=YES` build without POSIX Threads. Default: NO -- `MODEST_EXTERN_MALLOC=my_malloc_func` set extern malloc function. Default: UNDEFINED -- `MODEST_EXTERN_REALLOC=my_realloc_func` set extern realloc function. Default: UNDEFINED -- `MODEST_EXTERN_CALLOC=my_calloc_func` set extern calloc function. Default: UNDEFINED -- `MODEST_EXTERN_FREE=my_free_func` set extern free function. Default: UNDEFINED - -*for example* +Makefile rules: +- `all` —- build all components (libraries, examples, tests) (default) +- `library` -- build only static and shared library +- `shared` -- build only shared library +- `static` -- build only static library +- `clean` -- clean up current build directory +- `clone` -- copy all headers from source to include directories and modify local include (`#include "..."`) to global (`#include <...>`) +- `clean_api` -- remove all headers from include directory +- `create` -- create directories for binary, libraries, tests +- `test` -- run all tests +- `modules` -- print modules name, description, dependencies +- `install` -- install libraries and headers on your system +- `uninstall` -- delete libraries and headers on your system +- `make-pc-file` -- create pkg-config file + +*for example*: ```bash -cmake . -DCMAKE_INSTALL_LIBDIR=lib64 -DMODEST_INSTALL_HEADER=ON +make shared ``` diff --git a/Makefile b/Makefile index 2a8d87c..504fd0d 100644 --- a/Makefile +++ b/Makefile @@ -1,83 +1,206 @@ TARGET := source SRCDIR := source -TSTDIR := test CC ?= gcc -LIBNAME := modest -LIBPOSTFIX := .so -LIBSTATIC_POSTFIX := _static -LIB_TMP := lib -INCLUDE_TMP := include -BIN_TMP := bin - -MODEST_OPTIMIZATION_LEVEL ?= -O2 - -CFLAGS ?= -Wall -Werror -CFLAGS += $(MODEST_OPTIMIZATION_LEVEL) -Wno-unused-variable -fPIC --std=c99 -I$(SRCDIR) - -ifdef MODEST_BUILD_DEBUG - CFLAGS += -g +# make rules +# all —- build all components (libraries, examples, tests) (default) +# library -- build only static and shared library +# shared -- build only shared library +# static -- build only static library +# clean -- clean up current build directory +# clone -- copy all headers from source to include directories and modify local include (#include "...") to global (#include <...>) +# clean_api -- remove all headers from include directory +# create -- create directories for binary, libraries, tests +# install -- install libraries and headers on your system +# uninstall -- delete libraries and headers on your system +# test -- run all tests +# modules -- print modules list: Module name, Description, Dependencies +# make-pc-file -- create pkg-config file +# +# ARGS +# prefix, default /usr/local +# OS, if not defined try to get from "uname -s" +# PROJECT_OPTIMIZATION_LEVEL, default -O2 +# MyCORE_BUILD_WITHOUT_THREADS, YES or (NO or undefined), default undefined +# MyCORE_BUILD_DEBUG, YES or (NO or undefined), default undefined +# MyCORE_WITH_PERF, YES or (NO or undefined), default undefined, try build with timers (rdtsc or some), OS dependent, may not work on some systems, +# PROJECT_INSTALL_HEADER, default "include" +# PROJECT_INSTALL_LIBRARY, default "lib" +# PROJECT_INSTALL_WITHOUT_HEADERS, YES or (NO or undefined), default undefined +# +# If OS build rules not exists we try make library with POSIX threads + +.DEFAULT_GOAL := all + +DESCRIPTION := fast HTML renderer library with no outside dependency + +#******************** +# other Makefile +#*************** +include Makefile.cfg + +#******************** +# Build +#*************** +MODEST_BUILD_MODULES ?= $(dir $(wildcard $(SRCDIR)/*/)) +MODEST_BUILD_MODULES := $(patsubst %myport/,%myport/$(strip $(MODEST_PORT_NAME))/,$(MODEST_BUILD_MODULES)) +MODEST_BUILD_MODULES_LIST := $(foreach dir,$(MODEST_BUILD_MODULES),$(word 2, $(subst $(MODEST_DIR_SEPARATOR), , $(dir))) ) +MODEST_BUILD_MODULES_LIST_WITHOUT_PORT := $(strip $(foreach dir,$(MODEST_BUILD_MODULES_LIST),$(patsubst myport,,$(dir)))) +MODEST_BUILD_MODULES_MAKEFILES_LIST := $(foreach dir,$(MODEST_BUILD_MODULES),$(dir)Makefile.mk) + +#******************** +# Targets +#*************** +MODEST_BUILD_MODULES_TARGET := $(MODEST_BUILD_MODULES_LIST) +MODEST_BUILD_MODULES_TARGET_ALL := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$(dir)_all) +MODEST_BUILD_MODULES_TARGET_CLEAN := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$(dir)_clean) $(myport_clean) +MODEST_BUILD_MODULES_TARGET_CLONE := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$(dir)_clone) + +#******************** +# Utils +#*************** +MODEST_UTILS_HDRS = $(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.h)) +MODEST_UTILS_OBJS = $(patsubst %.c,%.o,$(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.c))) +MODEST_UTILS_HDRS_CLONE_CMND = $(foreach path,$(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.h)), cp $(path) $(patsubst $(SRCDIR)%,$(INCLUDE_DIR_API)%,$(path)) $(MODEST_UTILS_NEW_LINE)) +MODEST_UTILS_HDRS_CLONE_GDIR = $(foreach dir,$2,$(INCLUDE_DIR_API)/$1/$(dir)/) +MODEST_UTILS_HDRS_CLONE_DIRS = $(foreach dir,$(strip $(patsubst %./,%,$(foreach path,$(call MODEST_UTILS_HDRS_CLONE_GDIR,$1,$2),$(dir $(path))))),mkdir -p $(dir) $(MODEST_UTILS_NEW_LINE)) +MODEST_UTILS_HDRS_CLONE = $(info Clone for $1) $(call MODEST_UTILS_HDRS_CLONE_DIRS,$1,$2) $(MODEST_UTILS_NEW_LINE) $(call MODEST_UTILS_HDRS_CLONE_CMND,$1,$2) + +#******************** +# MyPORT +#*************** +MyPORT_SELECTED_PORT = myport/$(strip $(MODEST_PORT_NAME)) + +#******************** +# Include all modules Makefile.mk +#*************** +include $(MODEST_BUILD_MODULES_MAKEFILES_LIST) + +#******************** +# Modules info +#*************** +MODEST_BUILD_MODULES_INFO_DEP = $(foreach dep,$(strip $($1_dependencies)), $(dep)) +MODEST_BUILD_MODULES_INFO := $(foreach name,$(MODEST_BUILD_MODULES_LIST_WITHOUT_PORT),$(MODEST_UTILS_NEW_LINE)Module: $(name)$(MODEST_UTILS_NEW_LINE)Description: $($(name)_description)$(MODEST_UTILS_NEW_LINE)Dependencies:$(call MODEST_BUILD_MODULES_INFO_DEP,$(name))$(MODEST_UTILS_NEW_LINE)) + +#******************** +# Set ARGS for flags +#*************** +MODEST_CFLAGS += -DMODEST_BUILD_OS=$(MODEST_BUILD_OS) +MODEST_CFLAGS += -DMODEST_PORT_NAME=$(MODEST_PORT_NAME) +MODEST_CFLAGS += $(patsubst -DMY%,-DMy%,$(call MODEST_UTILS_TO_UPCASE,-DMyCORE_OS_$(MODEST_BUILD_OS))) + +override CFLAGS += $(MODEST_CFLAGS) +override LDFLAGS += $(MODEST_LDFLAGS) + +#******************** +# Objects +#*************** +MODEST_BUILD_OBJECT_SHARED ?= $(CC) -shared $(LDFLAGS) $(MODEST_LDFLAGS) $1 -o $2 +MODEST_BUILD_OBJECT_STATIC ?= $(AR) crus $2 $1 +MODEST_BUILD_OBJECT_MODULES := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$($(dir)_objs)) +MODEST_BUILD_OBJECT_MODULES := $(foreach dir,$(MODEST_BUILD_MODULES_TARGET),$($(dir)_objs)) + +#******************** +# Sub Directories +#*************** +BUILD_SUB_DIRS := examples $(TEST_DIR) + +#******************** +# Install +#*************** +PROJECT_INSTALL_LIBRARY := lib +PROJECT_INSTALL_HEADER := include + +libdir ?= $(prefix)/$(PROJECT_INSTALL_LIBRARY) +includedir ?= $(prefix)/$(PROJECT_INSTALL_HEADER) + +MODEST_INSTALL_CREATE_DIR := mkdir -p $(prefix)/$(PROJECT_INSTALL_LIBRARY) +MODEST_INSTALL_COMMAND := $(MODEST_INSTALL_CREATE_DIR) $(MODEST_UTILS_NEW_LINE) cp -av $(LIB_DIR_BASE)/* $(libdir) + +ifneq ($(PROJECT_INSTALL_WITHOUT_HEADERS),YES) + MODEST_INSTALL_CREATE_DIR += $(prefix)/$(PROJECT_INSTALL_HEADER) + MODEST_INSTALL_COMMAND += $(MODEST_UTILS_NEW_LINE) cp -av $(INCLUDE_DIR_API)/* $(includedir) endif -MODEST_BUILD_WITHOUT_THREADS ?= NO -ifeq ($(MODEST_BUILD_WITHOUT_THREADS),YES) - $(info Build without POSIX Threads) - CFLAGS += -DMODEST_BUILD_WITHOUT_THREADS -DMyHTML_BUILD_WITHOUT_THREADS -else - $(info Build with POSIX Threads) - CFLAGS += -pthread -endif +#******************** +# Uninstall +#*************** +MODEST_UNINSTALL_MK_COMMAND := +MODEST_UNINSTALL_FILE := uninstal.mk -ifeq ($(OS),Windows_NT) -else - UNAM := $(shell uname -s) - ifeq ($(UNAM),Darwin) - LIBPOSTFIX := .dylib - else - CFLAGS += -D_POSIX_C_SOURCE=199309L - endif +ifneq ($(PROJECT_INSTALL_WITHOUT_HEADERS),YES) + MODEST_UNINSTALL_HEADERS := $(foreach name,$(MODEST_BUILD_MODULES_LIST_WITHOUT_PORT),rm -rf $(includedir)/$(name) \$$(MODEST_UTILS_NEW_LINE)) endif -SRCS := -HDRS := -EXTDIRS := examples test - -all: create shared static - for f in $(EXTDIRS); do $(MAKE) -C $$f all; done - -include $(TARGET)/myhtml/Makefile.mk -include $(TARGET)/mycss/Makefile.mk -include $(TARGET)/myfont/Makefile.mk -include $(TARGET)/modest/Makefile.mk - -OBJS := $(patsubst %.c,%.o,$(SRCS)) - -shared: $(OBJS) - $(CC) -shared $(LDFLAGS) $(OBJS) -o $(LIB_TMP)/lib$(LIBNAME)$(LIBPOSTFIX) - -static: shared - $(AR) crus $(LIB_TMP)/lib$(LIBNAME)$(LIBSTATIC_POSTFIX).a $(OBJS) +MODEST_UNINSTALL_LIBRARY := $(foreach path,$(wildcard $(LIB_DIR_BASE)/lib*),rm -rf $(libdir)/$(notdir $(path)) \$$(MODEST_UTILS_NEW_LINE)) +MODEST_UNINSTALL_COMMAND = echo "MODEST_UNINSTALL_MK_COMMAND = $(MODEST_UNINSTALL_HEADERS) $(MODEST_UNINSTALL_LIBRARY)" > $(MODEST_UNINSTALL_FILE) + +-include $(MODEST_UNINSTALL_FILE) + +#******************** +# PKG-CONFIG +#*************** +MODEST_PKG_CONFIG_FILE := modest.pc +MODEST_PKG_CONFIG_CFLAGS := $(foreach name,$(MODEST_BUILD_MODULES_LIST_WITHOUT_PORT),-I$\{includedir}/$(name)) +MODEST_PKG_CONFIG_PROCESS = \ +$(SED) \ +-e 's,@version\@,$(PROJECT_VERSION_STRING),g' \ +-e 's,@prefix\@,$(prefix),g' \ +-e 's,@exec_prefix\@,$(exec_prefix),g' \ +-e 's,@libdir\@,$(PROJECT_INSTALL_LIBRARY),g' \ +-e 's,@includedir\@,$(PROJECT_INSTALL_HEADER),g' \ +-e 's,@cflags\@,$(MODEST_PKG_CONFIG_CFLAGS),g' \ +-e 's,@libname\@,$(LIB_NAME),g' \ +-e 's,@description\@,$(DESCRIPTION),g' \ +$1 > $2 + +#******************** +# Target options +#*************** +all: library + for f in $(BUILD_SUB_DIRS); do $(MAKE) -C $$f all; done + +library: shared static + +shared: make-pc-file create $(MODEST_BUILD_MODULES_TARGET_ALL) + $(call MODEST_BUILD_OBJECT_SHARED,$(MODEST_BUILD_OBJECT_MODULES),$(call MODEST_LIBRARY_WITH_VERSION)) + $(call MODEST_BUILD_SHARED_AFTER) + +static: make-pc-file create $(MODEST_BUILD_MODULES_TARGET_ALL) + $(call MODEST_BUILD_OBJECT_STATIC,$(MODEST_BUILD_OBJECT_MODULES),$(call MODEST_LIBRARY_STATIC)) + $(call MODEST_BUILD_STATIC_AFTER) + +clean: $(MODEST_BUILD_MODULES_TARGET_CLEAN) + rm -f $(call MODEST_LIBRARY_WITH_VERSION) && rm -f $(call MODEST_LIBRARY_STATIC) + rm -rf $(TEST_DIR_BASE) + $(call MODEST_BUILD_CLEAN_AFTER) + for f in $(BUILD_SUB_DIRS); do $(MAKE) -C $$f clean; done + +clone: clean_api $(MODEST_BUILD_MODULES_TARGET_CLONE) + $(call MODEST_CLONE_SED_HEADER_COMMAND) + find $(INCLUDE_DIR_API) -name "*.h.bak" -exec rm -f {} \; + +clean_api: + rm -rf $(INCLUDE_DIR_API) create: - mkdir -p lib bin + mkdir -p $(BINARY_DIR_BASE) $(LIB_DIR_BASE) $(TEST_DIR_BASE) + +install: + $(MODEST_INSTALL_COMMAND) + $(MODEST_UNINSTALL_COMMAND) -clean: - for f in $(EXTDIRS); do $(MAKE) -C $$f clean; done - rm -f $(OBJS) - rm -f $(LIB_TMP)/* - rm -f $(BIN_TMP)/* +uninstall: + $(MODEST_UNINSTALL_MK_COMMAND) -clean_include: - rm -rf $(INCLUDE_TMP) +test: library + $(MAKE) -C $(TEST_DIR) run -clone: create clean_include myhtml_clone mycss_clone modest_clone myfont_clone - find include -name "*.h" -exec sed -i '.bak' -E 's/^[ \t]*#[ \t]*include[ \t]*"([^"]+)"/#include <\1>/g' {} \; - find include -name "*.h.bak" -exec rm -f {} \; +make-pc-file: + $(call MODEST_PKG_CONFIG_PROCESS,$(MODEST_PKG_CONFIG_FILE).in, $(MODEST_PKG_CONFIG_FILE)) -test: - test/mycss/declaration test/mycss/data/declaration - test/myhtml/utils/avl_tree - test/myhtml/encoding_detect_meta test/myhtml/data/encoding/detect_meta.html +modules: + $(info $(MODEST_BUILD_MODULES_INFO)) -.PHONY: all clean clone test \ No newline at end of file +.PHONY: all clean clone test $(MODEST_BUILD_MODULES_TARGET_ALL) diff --git a/Makefile.bin.cfg b/Makefile.bin.cfg new file mode 100644 index 0000000..ec40261 --- /dev/null +++ b/Makefile.bin.cfg @@ -0,0 +1,53 @@ +BINARY_BUILD_OS := UNDEF + +# library config +BINARY_PATH_RELATIVE ?= . +include $(BINARY_PATH_RELATIVE)/Makefile.cfg + +# uses +BINARY_LIBRARIES += $(BINARY_PATH_RELATIVE)/$(call MODEST_LIBRARY_STATIC) + +# flags +BINARY_OPTIMIZATION_LEVEL ?= -O2 +BINARY_CFLAGS += -I$(BINARY_PATH_RELATIVE)/$(INCLUDE_DIR_API) +BINARY_LDFLAGS += +BINARY_BUILD_OS ?= UNDEF + +#******************************* +# Windows_NT +#******************* +ifeq ($(OS),Windows_NT) + BINARY_CFLAGS += -Wno-unused-variable -Wno-unused-function -std=c99 + + BINARY_BUILD_OS := $(OS) +endif +# end of Windows_NT + +#******************************* +# Darwin, Mac OS X +#******************* +ifeq ($(OS),Darwin) + BINARY_CFLAGS += -fPIC + BINARY_CFLAGS += $(BINARY_OPTIMIZATION_LEVEL) -Wno-unused-variable -Wno-unused-function -std=c99 + + BINARY_BUILD_OS := $(OS) +endif +# end of Darwin, Mac OS X + +#******************************* +# POSIX +#******************* +ifeq ($(BINARY_BUILD_OS),UNDEF) + BINARY_CFLAGS += -fPIC + BINARY_CFLAGS += -D_POSIX_C_SOURCE=199309L + BINARY_CFLAGS += $(BINARY_OPTIMIZATION_LEVEL) -Wno-unused-variable -Wno-unused-function -std=c99 + BINARY_LIBRARIES += -lm + +# build without threads +ifneq ($(MODEST_BUILD_WITHOUT_THREADS),YES) + BINARY_LIBRARIES += -pthread +endif + + BINARY_BUILD_OS := $(OS) +endif +# end of POSIX diff --git a/Makefile.cfg b/Makefile.cfg new file mode 100644 index 0000000..92d425d --- /dev/null +++ b/Makefile.cfg @@ -0,0 +1,151 @@ +MODEST_BUILD_OS := UNDEF + +#******************** +# Version +#*************** +PROJECT_VERSION_MAJOR := 0 +PROJECT_VERSION_MINOR := 0 +PROJECT_VERSION_PATCH := 6 + +PROJECT_VERSION_STRING := $(PROJECT_VERSION_MAJOR).$(PROJECT_VERSION_MINOR).$(PROJECT_VERSION_PATCH) + +#******************** +# Flags +#*************** +MODEST_CFLAGS ?= -Wall -Werror -pipe -pedantic +MODEST_LFLAGS ?= + +#******************** +# Include +#*************** +# include dirs +INCLUDE_DIR := $(TARGET) +INCLUDE_DIR_API := include + +#******************** +# Libraries +#*************** +# lib name +LIB_NAME := modest +LIB_NAME_SUFFIX := .so +LIB_NAME_SUFFIX_STATIC := _static.a + +# lib dirs +LIB_DIR_BASE := lib + +# This variables used with "call" $(call MODEST_LIBRARY_WITH_VERSION), +# for use actual variables like a LIB_NAME_SUFFIX +MODEST_LIBRARY_NAME ?= lib$(LIB_NAME)$(LIB_NAME_SUFFIX) +MODEST_LIBRARY_NAME_STATIC ?=lib$(LIB_NAME)$(LIB_NAME_SUFFIX_STATIC) +MODEST_LIBRARY_NAME_WITH_VERSION = lib$(LIB_NAME)-$(PROJECT_VERSION_STRING)$(LIB_NAME_SUFFIX) + +MODEST_LIBRARY ?= $(LIB_DIR_BASE)/$(MODEST_LIBRARY_NAME) +MODEST_LIBRARY_STATIC ?= $(LIB_DIR_BASE)/$(MODEST_LIBRARY_NAME_STATIC) +MODEST_LIBRARY_WITH_VERSION = $(LIB_DIR_BASE)/$(MODEST_LIBRARY_NAME_WITH_VERSION) + +MODEST_LIBRARY_WITH_VERSION_MAJOR = $(LIB_DIR_BASE)/lib$(LIB_NAME)-$(PROJECT_VERSION_MAJOR)$(LIB_NAME_SUFFIX) +MODEST_LIBRARY_WITH_VERSION_MAJOR_MINOR = $(LIB_DIR_BASE)/lib$(LIB_NAME)-$(PROJECT_VERSION_MAJOR).$(PROJECT_VERSION_MINOR)$(LIB_NAME_SUFFIX) + +#******************** +# Binaries +#*************** +# binaries dirs +BINARY_DIR_BASE := bin + +#******************** +# Test +#*************** +TEST_DIR := test +TEST_DIR_BASE := test_suite + +#******************** +# Build +#*************** +MODEST_SOURCE ?= $(SRCDIR) +MODEST_BUILD_SHARED_AFTER := +MODEST_BUILD_STATIC_AFTER := + +MODEST_BUILD_CLEAN_AFTER := + +#******************** +# DEFAULT +#*************** +SED ?= sed + +MODEST_DIR_SEPARATOR ?= / + +# flags +PROJECT_OPTIMIZATION_LEVEL ?= -O2 +MODEST_CFLAGS += -I$(INCLUDE_DIR) +MODEST_LDFLAGS += + +OS ?= $(shell uname -s) +prefix ?= /usr/local +exec_prefix ?= $(prefix) + +MODEST_CLONE_SED_HEADER_COMMAND = find $(INCLUDE_DIR_API) -name "*.h" -exec sed -i.bak -e 's,\s*\#\s*include\s*"\([^"]*\)",\#include <\1>,g' {} \; + +#******************** +# Set -D +#*************** +ifeq ($(MyCORE_BUILD_DEBUG),YES) + override PROJECT_OPTIMIZATION_LEVEL := + MODEST_CFLAGS += -g3 -ggdb3 -O0 -fno-omit-frame-pointer -DMyCORE_BUILD_DEBUG +endif + +ifeq ($(MyCORE_BUILD_WITHOUT_THREADS),YES) + MODEST_CFLAGS += -DMyCORE_BUILD_WITHOUT_THREADS +endif + +ifeq ($(MyCORE_WITH_PERF),YES) + MODEST_CFLAGS += -DMyCORE_WITH_PERF +endif + +#******************** +# Utils +#*************** +define MODEST_UTILS_NEW_LINE + + +endef +MODEST_UTILS_TO_UPCASE = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1)))))))))))))))))))))))))) + +#******************************* +# Load platform specific rules for build +# We try to include all Rules.mk file in /source/myport/*/Rules.mk +#******************* +ifndef MODEST_PORT_NAME + MYPORT_BUILD_RULES := $(foreach path,$(wildcard $(MODEST_SOURCE)/myport/*/),$(dir $(path))Rules.mk) + -include $(MYPORT_BUILD_RULES) +else + MYPORT_BUILD_RULES := $(MODEST_SOURCE)/myport/$(MODEST_PORT_NAME)/Rules.mk + -include $(MYPORT_BUILD_RULES) +endif # def MODEST_PORT_NAME + +#******************************* +# POSIX +#******************* +ifeq ($(MODEST_BUILD_OS),UNDEF) + MODEST_CFLAGS += -fPIC + MODEST_CFLAGS += -D_POSIX_C_SOURCE=199309L + MODEST_CFLAGS += $(PROJECT_OPTIMIZATION_LEVEL) -Wno-unused-variable -Wno-unused-function -std=c99 + + MODEST_BUILD_SHARED_AFTER += ln -sf $(call MODEST_LIBRARY_NAME_WITH_VERSION) $(call MODEST_LIBRARY) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_SHARED_AFTER += ln -sf $(call MODEST_LIBRARY_NAME_WITH_VERSION) $(call MODEST_LIBRARY_WITH_VERSION_MAJOR) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_SHARED_AFTER += ln -sf $(call MODEST_LIBRARY_NAME_WITH_VERSION) $(call MODEST_LIBRARY_WITH_VERSION_MAJOR_MINOR) $(MODEST_UTILS_NEW_LINE) + + MODEST_BUILD_CLEAN_AFTER += rm -f $(call MODEST_LIBRARY) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_CLEAN_AFTER += rm -f $(call MODEST_LIBRARY_WITH_VERSION_MAJOR) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_CLEAN_AFTER += rm -f $(call MODEST_LIBRARY_WITH_VERSION_MAJOR_MINOR) $(MODEST_UTILS_NEW_LINE) + +# build without threads +ifneq ($(MyCORE_BUILD_WITHOUT_THREADS),YES) + MODEST_LDFLAGS += -pthread +endif + + # Need set + MODEST_BUILD_OS := $(OS) + # this name eq source/myport/ + MODEST_PORT_NAME := posix +endif +# end of POSIX diff --git a/README.md b/README.md index d526bb6..c75e150 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,25 @@ Modest is a fast HTML renderer implemented as a pure C99 library with no outside * Mailing List: [https://groups.google.com/forum/#!forum/modest-engine](https://groups.google.com/forum/#!forum/modest-engine) * IRC: [#modest-engine on `irc.freenode.net `](http://webchat.freenode.net?channels=%23modest-engine) -* Or you can ask questions on [stackoverflow.com](https://stackoverflow.com/questions/ask?tags=modest) by modest tag * Public [tracker by trello](https://trello.com/b/sdqpT8Ep/modest) ## Now ```text -The current version is 0.0.5 - devel +The current version is 0.0.6 - devel ``` +## Features + +* MyCORE — base module, it is used by all other modules +* MyHTML — HTML parser by [specification](https://html.spec.whatwg.org/multipage/) +* MyCSS —  CSS parser and modules by [specification](https://drafts.csswg.org/) +* MyENCODING — work with character encodings, detecting encoding, convert encodings by [specification](https://encoding.spec.whatwg.org/) +* MyFONT — work with font, metrics, calculating size and more by [specification](https://www.microsoft.com/en-us/Typography/SpecificationsOverview.aspx) +* MyURL — URL parser by [specification](https://url.spec.whatwg.org/) +* MyPORT — system depended code: threads (if build with threads, default), work with memory, io, timers +* Modest — calculating, compare, renderer + ## Introduction [Introduction](https://lexborisov.github.io/Modest/) @@ -42,7 +52,7 @@ Alexander Borisov ## COPYRIGHT AND LICENSE -Copyright (C) 2015-2016 Alexander Borisov +Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c419263..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman \ No newline at end of file diff --git a/api_breaking_changes.md b/api_breaking_changes.md index 0efa133..f807f0c 100644 --- a/api_breaking_changes.md +++ b/api_breaking_changes.md @@ -1,3 +1,10 @@ +0.0.5 => 0.0.6 +=========== +* MyHTML split to MyHTML and MyCORE +* Removed all io print functions to file: ```myhtml_tree_print_by_node```, ```myhtml_tree_print_node_children```, ```myhtml_tree_print_node```; Use serializations instead of their +* If you use encoding enum, like ```MyHTML_ENCODING_UTF8```, now it ```MyENCODING_UTF_8```, i.e ```MyHTML_ENCODING_* => MyENCODING_*``` +* Functions migrated to MyCORE from MyHTML: ```myhtml_incoming_buffer_*``` => ```mycore_incoming_buffer_*```, ```myhtml_string*``` => ```mycore_string*```, ```myhtml_utils*``` => ```mycore_utils*``` + 0.0.1 => 0.0.4 =========== Removed all depending on the Tree. Now you can get a tree of nodes ```myhtml_node_tree``` diff --git a/devel/osx/Modest.xcodeproj/project.pbxproj b/devel/osx/Modest.xcodeproj/project.pbxproj index 7ee968f..4fd9526 100644 --- a/devel/osx/Modest.xcodeproj/project.pbxproj +++ b/devel/osx/Modest.xcodeproj/project.pbxproj @@ -18,8 +18,16 @@ 0E0C91961DB1064E007A0501 /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0C91941DB1064E007A0501 /* serialization.c */; }; 0E0C91991DB107E7007A0501 /* property.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0C91971DB107E7007A0501 /* property.c */; }; 0E0C919C1DB10866007A0501 /* raw_property.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0C919A1DB10866007A0501 /* raw_property.c */; }; - 0E0D5D011E003A5E00EBFDD6 /* avl_tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0D5CFF1E003A5E00EBFDD6 /* avl_tree.c */; }; - 0E0D738C1E2F67DB00FC97DE /* mhash.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0D738A1E2F67DB00FC97DE /* mhash.c */; }; + 0E10FEE11E5F720200242B61 /* host.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FECB1E5F720200242B61 /* host.c */; }; + 0E10FEE21E5F720200242B61 /* myosi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FECD1E5F720200242B61 /* myosi.c */; }; + 0E10FEE31E5F720200242B61 /* parser_end.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FECF1E5F720200242B61 /* parser_end.c */; }; + 0E10FEE41E5F720200242B61 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FED01E5F720200242B61 /* parser.c */; }; + 0E10FEE51E5F720200242B61 /* path.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FED21E5F720200242B61 /* path.c */; }; + 0E10FEE61E5F720200242B61 /* punycode.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FED41E5F720200242B61 /* punycode.c */; }; + 0E10FEE71E5F720200242B61 /* scheme.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FED91E5F720200242B61 /* scheme.c */; }; + 0E10FEE81E5F720200242B61 /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FEDB1E5F720200242B61 /* serialization.c */; }; + 0E10FEE91E5F720200242B61 /* url.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FEDD1E5F720200242B61 /* url.c */; }; + 0E10FEEA1E5F720200242B61 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E10FEDF1E5F720200242B61 /* utils.c */; }; 0E4B525C1DC13BBB0095026A /* parser_text_decoration.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4B525A1DC13BBB0095026A /* parser_text_decoration.c */; }; 0E5AA4BD1DA9689700FF5358 /* shared.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E5AA4BB1DA9689700FF5358 /* shared.c */; }; 0E5E2AAB1DC53CC1007836AB /* entry_destroy.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E5E2AA91DC53CC1007836AB /* entry_destroy.c */; }; @@ -83,34 +91,20 @@ 0E750FE71D9AF27F00337E9B /* callback.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FA41D9AF27F00337E9B /* callback.c */; }; 0E750FE81D9AF27F00337E9B /* charef.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FA71D9AF27F00337E9B /* charef.c */; }; 0E750FE91D9AF27F00337E9B /* data_process.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FA91D9AF27F00337E9B /* data_process.c */; }; - 0E750FEA1D9AF27F00337E9B /* encoding_detect.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FAD1D9AF27F00337E9B /* encoding_detect.c */; }; - 0E750FEB1D9AF27F00337E9B /* encoding.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FAF1D9AF27F00337E9B /* encoding.c */; }; - 0E750FEC1D9AF27F00337E9B /* incoming.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FB11D9AF27F00337E9B /* incoming.c */; }; 0E750FED1D9AF27F00337E9B /* myhtml.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FB31D9AF27F00337E9B /* myhtml.c */; }; 0E750FEE1D9AF27F00337E9B /* mynamespace.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FB61D9AF27F00337E9B /* mynamespace.c */; }; - 0E750FEF1D9AF27F00337E9B /* myosi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FB81D9AF27F00337E9B /* myosi.c */; }; - 0E750FF01D9AF27F00337E9B /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FBA1D9AF27F00337E9B /* mystring.c */; }; 0E750FF11D9AF27F00337E9B /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FBC1D9AF27F00337E9B /* parser.c */; }; - 0E750FF21D9AF27F00337E9B /* perf.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FBE1D9AF27F00337E9B /* perf.c */; }; 0E750FF31D9AF27F00337E9B /* rules.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FBF1D9AF27F00337E9B /* rules.c */; }; 0E750FF41D9AF27F00337E9B /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FC11D9AF27F00337E9B /* serialization.c */; }; 0E750FF51D9AF27F00337E9B /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FC31D9AF27F00337E9B /* stream.c */; }; 0E750FF61D9AF27F00337E9B /* tag_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FC61D9AF27F00337E9B /* tag_init.c */; }; 0E750FF71D9AF27F00337E9B /* tag.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FC71D9AF27F00337E9B /* tag.c */; }; - 0E750FF81D9AF27F00337E9B /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FC91D9AF27F00337E9B /* thread.c */; }; 0E750FF91D9AF27F00337E9B /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FCB1D9AF27F00337E9B /* token.c */; }; 0E750FFA1D9AF27F00337E9B /* tokenizer_doctype.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FCD1D9AF27F00337E9B /* tokenizer_doctype.c */; }; 0E750FFB1D9AF27F00337E9B /* tokenizer_end.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FCF1D9AF27F00337E9B /* tokenizer_end.c */; }; 0E750FFC1D9AF27F00337E9B /* tokenizer_script.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FD11D9AF27F00337E9B /* tokenizer_script.c */; }; 0E750FFD1D9AF27F00337E9B /* tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FD31D9AF27F00337E9B /* tokenizer.c */; }; 0E750FFE1D9AF27F00337E9B /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FD51D9AF27F00337E9B /* tree.c */; }; - 0E750FFF1D9AF27F00337E9B /* mchar_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FD81D9AF27F00337E9B /* mchar_async.c */; }; - 0E7510001D9AF27F00337E9B /* mcobject.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FDA1D9AF27F00337E9B /* mcobject.c */; }; - 0E7510011D9AF27F00337E9B /* mcobject_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FDC1D9AF27F00337E9B /* mcobject_async.c */; }; - 0E7510021D9AF27F00337E9B /* mcsimple.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FDE1D9AF27F00337E9B /* mcsimple.c */; }; - 0E7510031D9AF27F00337E9B /* mcsync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FE01D9AF27F00337E9B /* mcsync.c */; }; - 0E7510041D9AF27F00337E9B /* mctree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FE21D9AF27F00337E9B /* mctree.c */; }; - 0E7510051D9AF27F00337E9B /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FE51D9AF27F00337E9B /* utils.c */; }; 0E79EE951DC8E270004FF5DC /* stack.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E79EE931DC8E270004FF5DC /* stack.c */; }; 0E7F78351DD3E0D5003B6053 /* begin.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E7F78331DD3E0D5003B6053 /* begin.c */; }; 0E7F78381DD3E2E5003B6053 /* glue.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E7F78361DD3E2E5003B6053 /* glue.c */; }; @@ -124,6 +118,28 @@ 0EF2D5ED1E01E04A000570B6 /* declaration.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF2D5EB1E01E04A000570B6 /* declaration.c */; }; 0EF2D5F21E01E089000570B6 /* default.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF2D5F01E01E089000570B6 /* default.c */; }; 0EF2D5F71E01E0BD000570B6 /* default.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF2D5F51E01E0BD000570B6 /* default.c */; }; + 0EF5D1581E680D880048E3D1 /* incoming.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D14D1E680D880048E3D1 /* incoming.c */; }; + 0EF5D15A1E680D880048E3D1 /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1511E680D880048E3D1 /* mystring.c */; }; + 0EF5D15C1E680D880048E3D1 /* mythread.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1541E680D880048E3D1 /* mythread.c */; }; + 0EF5D15D1E680D880048E3D1 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1561E680D880048E3D1 /* utils.c */; }; + 0EF5D1701E680DA50048E3D1 /* avl_tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1601E680DA50048E3D1 /* avl_tree.c */; }; + 0EF5D1711E680DA50048E3D1 /* mchar_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1621E680DA50048E3D1 /* mchar_async.c */; }; + 0EF5D1721E680DA50048E3D1 /* mcobject_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1641E680DA50048E3D1 /* mcobject_async.c */; }; + 0EF5D1731E680DA50048E3D1 /* mcobject.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1661E680DA50048E3D1 /* mcobject.c */; }; + 0EF5D1741E680DA50048E3D1 /* mcsimple.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1681E680DA50048E3D1 /* mcsimple.c */; }; + 0EF5D1751E680DA50048E3D1 /* mcsync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D16A1E680DA50048E3D1 /* mcsync.c */; }; + 0EF5D1761E680DA50048E3D1 /* mctree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D16C1E680DA50048E3D1 /* mctree.c */; }; + 0EF5D1771E680DA50048E3D1 /* mhash.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D16E1E680DA50048E3D1 /* mhash.c */; }; + 0EF5D1791E680EA10048E3D1 /* myosi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1781E680EA10048E3D1 /* myosi.c */; }; + 0EF5D17F1E6819E80048E3D1 /* detect.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D17B1E6819E80048E3D1 /* detect.c */; }; + 0EF5D1801E6819E80048E3D1 /* encoding.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D17D1E6819E80048E3D1 /* encoding.c */; }; + 0EF5D1841E6822BD0048E3D1 /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1821E6822BD0048E3D1 /* mystring.c */; }; + 0EF5D1871E68362D0048E3D1 /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1851E68362D0048E3D1 /* mystring.c */; }; + 0EF5D19E1E6AE8BF0048E3D1 /* thread_queue.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D19C1E6AE8BF0048E3D1 /* thread_queue.c */; }; + 0EF5D1A71E6DDDC20048E3D1 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1A31E6DDDC20048E3D1 /* thread.c */; }; + 0EF5D1A81E6DDDC20048E3D1 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1A41E6DDDC20048E3D1 /* io.c */; }; + 0EF5D1A91E6DDDC20048E3D1 /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1A51E6DDDC20048E3D1 /* memory.c */; }; + 0EF5D1AC1E6DDDCD0048E3D1 /* mcsync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF5D1AB1E6DDDCD0048E3D1 /* mcsync.c */; }; 0EF68DCE1DBF6CF000B0DEA4 /* color_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF68DCC1DBF6CF000B0DEA4 /* color_parser.c */; }; 0EF808A31D9FF3BC001AF6EF /* sheet.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF808A11D9FF3BC001AF6EF /* sheet.c */; }; 0EF808A61DA08BBE001AF6EF /* map.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF808A41DA08BBE001AF6EF /* map.c */; }; @@ -167,10 +183,28 @@ 0E0C91981DB107E7007A0501 /* property.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = property.h; path = ../../../source/modest/node/property.h; sourceTree = ""; }; 0E0C919A1DB10866007A0501 /* raw_property.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raw_property.c; path = ../../../source/modest/node/raw_property.c; sourceTree = ""; }; 0E0C919B1DB10866007A0501 /* raw_property.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = raw_property.h; path = ../../../source/modest/node/raw_property.h; sourceTree = ""; }; - 0E0D5CFF1E003A5E00EBFDD6 /* avl_tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = avl_tree.c; sourceTree = ""; }; - 0E0D5D001E003A5E00EBFDD6 /* avl_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = avl_tree.h; sourceTree = ""; }; - 0E0D738A1E2F67DB00FC97DE /* mhash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mhash.c; sourceTree = ""; }; - 0E0D738B1E2F67DB00FC97DE /* mhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mhash.h; sourceTree = ""; }; + 0E10FECB1E5F720200242B61 /* host.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = host.c; path = ../../source/myurl/host.c; sourceTree = ""; }; + 0E10FECC1E5F720200242B61 /* host.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = host.h; path = ../../source/myurl/host.h; sourceTree = ""; }; + 0E10FECD1E5F720200242B61 /* myosi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myosi.c; path = ../../source/myurl/myosi.c; sourceTree = ""; }; + 0E10FECE1E5F720200242B61 /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/myurl/myosi.h; sourceTree = ""; }; + 0E10FECF1E5F720200242B61 /* parser_end.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser_end.c; path = ../../source/myurl/parser_end.c; sourceTree = ""; }; + 0E10FED01E5F720200242B61 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/myurl/parser.c; sourceTree = ""; }; + 0E10FED11E5F720200242B61 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/myurl/parser.h; sourceTree = ""; }; + 0E10FED21E5F720200242B61 /* path.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = path.c; path = ../../source/myurl/path.c; sourceTree = ""; }; + 0E10FED31E5F720200242B61 /* path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path.h; path = ../../source/myurl/path.h; sourceTree = ""; }; + 0E10FED41E5F720200242B61 /* punycode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = punycode.c; path = ../../source/myurl/punycode.c; sourceTree = ""; }; + 0E10FED51E5F720200242B61 /* punycode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = punycode.h; path = ../../source/myurl/punycode.h; sourceTree = ""; }; + 0E10FED61E5F720200242B61 /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../source/myurl/resources.h; sourceTree = ""; }; + 0E10FED71E5F720200242B61 /* scheme_const.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = scheme_const.h; path = ../../source/myurl/scheme_const.h; sourceTree = ""; }; + 0E10FED81E5F720200242B61 /* scheme_resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = scheme_resources.h; path = ../../source/myurl/scheme_resources.h; sourceTree = ""; }; + 0E10FED91E5F720200242B61 /* scheme.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = scheme.c; path = ../../source/myurl/scheme.c; sourceTree = ""; }; + 0E10FEDA1E5F720200242B61 /* scheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = scheme.h; path = ../../source/myurl/scheme.h; sourceTree = ""; }; + 0E10FEDB1E5F720200242B61 /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = serialization.c; path = ../../source/myurl/serialization.c; sourceTree = ""; }; + 0E10FEDC1E5F720200242B61 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = serialization.h; path = ../../source/myurl/serialization.h; sourceTree = ""; }; + 0E10FEDD1E5F720200242B61 /* url.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = url.c; path = ../../source/myurl/url.c; sourceTree = ""; }; + 0E10FEDE1E5F720200242B61 /* url.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = url.h; path = ../../source/myurl/url.h; sourceTree = ""; }; + 0E10FEDF1E5F720200242B61 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../source/myurl/utils.c; sourceTree = ""; }; + 0E10FEE01E5F720200242B61 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../source/myurl/utils.h; sourceTree = ""; }; 0E4B525A1DC13BBB0095026A /* parser_text_decoration.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parser_text_decoration.c; sourceTree = ""; }; 0E5AA4BB1DA9689700FF5358 /* shared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = shared.c; sourceTree = ""; }; 0E5AA4BC1DA9689700FF5358 /* shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shared.h; sourceTree = ""; }; @@ -309,7 +343,6 @@ 0E750F7D1D9AF27200337E9B /* units_resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = units_resources.h; sourceTree = ""; }; 0E750F7E1D9AF27200337E9B /* values.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = values.c; sourceTree = ""; }; 0E750F7F1D9AF27200337E9B /* values.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = values.h; sourceTree = ""; }; - 0E750FA21D9AF27F00337E9B /* api_encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api_encoding.h; path = ../../source/myhtml/api_encoding.h; sourceTree = ""; }; 0E750FA31D9AF27F00337E9B /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api.h; path = ../../source/myhtml/api.h; sourceTree = ""; }; 0E750FA41D9AF27F00337E9B /* callback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = callback.c; path = ../../source/myhtml/callback.c; sourceTree = ""; }; 0E750FA51D9AF27F00337E9B /* callback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = callback.h; path = ../../source/myhtml/callback.h; sourceTree = ""; }; @@ -319,25 +352,14 @@ 0E750FA91D9AF27F00337E9B /* data_process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = data_process.c; path = ../../source/myhtml/data_process.c; sourceTree = ""; }; 0E750FAA1D9AF27F00337E9B /* data_process.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = data_process.h; path = ../../source/myhtml/data_process.h; sourceTree = ""; }; 0E750FAB1D9AF27F00337E9B /* def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = def.h; path = ../../source/myhtml/def.h; sourceTree = ""; }; - 0E750FAC1D9AF27F00337E9B /* encoding_detect_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_detect_resource.h; path = ../../source/myhtml/encoding_detect_resource.h; sourceTree = ""; }; - 0E750FAD1D9AF27F00337E9B /* encoding_detect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding_detect.c; path = ../../source/myhtml/encoding_detect.c; sourceTree = ""; }; - 0E750FAE1D9AF27F00337E9B /* encoding_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_resource.h; path = ../../source/myhtml/encoding_resource.h; sourceTree = ""; }; - 0E750FAF1D9AF27F00337E9B /* encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding.c; path = ../../source/myhtml/encoding.c; sourceTree = ""; }; - 0E750FB01D9AF27F00337E9B /* encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding.h; path = ../../source/myhtml/encoding.h; sourceTree = ""; }; - 0E750FB11D9AF27F00337E9B /* incoming.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = incoming.c; path = ../../source/myhtml/incoming.c; sourceTree = ""; }; - 0E750FB21D9AF27F00337E9B /* incoming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = incoming.h; path = ../../source/myhtml/incoming.h; sourceTree = ""; }; 0E750FB31D9AF27F00337E9B /* myhtml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myhtml.c; path = ../../source/myhtml/myhtml.c; sourceTree = ""; }; 0E750FB41D9AF27F00337E9B /* myhtml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myhtml.h; path = ../../source/myhtml/myhtml.h; sourceTree = ""; }; 0E750FB51D9AF27F00337E9B /* mynamespace_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mynamespace_resource.h; path = ../../source/myhtml/mynamespace_resource.h; sourceTree = ""; }; 0E750FB61D9AF27F00337E9B /* mynamespace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mynamespace.c; path = ../../source/myhtml/mynamespace.c; sourceTree = ""; }; 0E750FB71D9AF27F00337E9B /* mynamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mynamespace.h; path = ../../source/myhtml/mynamespace.h; sourceTree = ""; }; - 0E750FB81D9AF27F00337E9B /* myosi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myosi.c; path = ../../source/myhtml/myosi.c; sourceTree = ""; }; 0E750FB91D9AF27F00337E9B /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/myhtml/myosi.h; sourceTree = ""; }; - 0E750FBA1D9AF27F00337E9B /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../source/myhtml/mystring.c; sourceTree = ""; }; - 0E750FBB1D9AF27F00337E9B /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../source/myhtml/mystring.h; sourceTree = ""; }; 0E750FBC1D9AF27F00337E9B /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/myhtml/parser.c; sourceTree = ""; }; 0E750FBD1D9AF27F00337E9B /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/myhtml/parser.h; sourceTree = ""; }; - 0E750FBE1D9AF27F00337E9B /* perf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = perf.c; path = ../../source/myhtml/perf.c; sourceTree = ""; }; 0E750FBF1D9AF27F00337E9B /* rules.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rules.c; path = ../../source/myhtml/rules.c; sourceTree = ""; }; 0E750FC01D9AF27F00337E9B /* rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rules.h; path = ../../source/myhtml/rules.h; sourceTree = ""; }; 0E750FC11D9AF27F00337E9B /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = serialization.c; path = ../../source/myhtml/serialization.c; sourceTree = ""; }; @@ -348,8 +370,6 @@ 0E750FC61D9AF27F00337E9B /* tag_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tag_init.c; path = ../../source/myhtml/tag_init.c; sourceTree = ""; }; 0E750FC71D9AF27F00337E9B /* tag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tag.c; path = ../../source/myhtml/tag.c; sourceTree = ""; }; 0E750FC81D9AF27F00337E9B /* tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag.h; path = ../../source/myhtml/tag.h; sourceTree = ""; }; - 0E750FC91D9AF27F00337E9B /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../../source/myhtml/thread.c; sourceTree = ""; }; - 0E750FCA1D9AF27F00337E9B /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread.h; path = ../../source/myhtml/thread.h; sourceTree = ""; }; 0E750FCB1D9AF27F00337E9B /* token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = token.c; path = ../../source/myhtml/token.c; sourceTree = ""; }; 0E750FCC1D9AF27F00337E9B /* token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = token.h; path = ../../source/myhtml/token.h; sourceTree = ""; }; 0E750FCD1D9AF27F00337E9B /* tokenizer_doctype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_doctype.c; path = ../../source/myhtml/tokenizer_doctype.c; sourceTree = ""; }; @@ -362,21 +382,6 @@ 0E750FD41D9AF27F00337E9B /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer.h; path = ../../source/myhtml/tokenizer.h; sourceTree = ""; }; 0E750FD51D9AF27F00337E9B /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tree.c; path = ../../source/myhtml/tree.c; sourceTree = ""; }; 0E750FD61D9AF27F00337E9B /* tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tree.h; path = ../../source/myhtml/tree.h; sourceTree = ""; }; - 0E750FD81D9AF27F00337E9B /* mchar_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mchar_async.c; sourceTree = ""; }; - 0E750FD91D9AF27F00337E9B /* mchar_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mchar_async.h; sourceTree = ""; }; - 0E750FDA1D9AF27F00337E9B /* mcobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mcobject.c; sourceTree = ""; }; - 0E750FDB1D9AF27F00337E9B /* mcobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mcobject.h; sourceTree = ""; }; - 0E750FDC1D9AF27F00337E9B /* mcobject_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mcobject_async.c; sourceTree = ""; }; - 0E750FDD1D9AF27F00337E9B /* mcobject_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mcobject_async.h; sourceTree = ""; }; - 0E750FDE1D9AF27F00337E9B /* mcsimple.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mcsimple.c; sourceTree = ""; }; - 0E750FDF1D9AF27F00337E9B /* mcsimple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mcsimple.h; sourceTree = ""; }; - 0E750FE01D9AF27F00337E9B /* mcsync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mcsync.c; sourceTree = ""; }; - 0E750FE11D9AF27F00337E9B /* mcsync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mcsync.h; sourceTree = ""; }; - 0E750FE21D9AF27F00337E9B /* mctree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mctree.c; sourceTree = ""; }; - 0E750FE31D9AF27F00337E9B /* mctree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mctree.h; sourceTree = ""; }; - 0E750FE41D9AF27F00337E9B /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resources.h; sourceTree = ""; }; - 0E750FE51D9AF27F00337E9B /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../source/myhtml/utils.c; sourceTree = ""; }; - 0E750FE61D9AF27F00337E9B /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../source/myhtml/utils.h; sourceTree = ""; }; 0E79EE931DC8E270004FF5DC /* stack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stack.c; path = ../../source/mycss/stack.c; sourceTree = ""; }; 0E79EE941DC8E270004FF5DC /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stack.h; path = ../../source/mycss/stack.h; sourceTree = ""; }; 0E7F782C1DD3DF6C003B6053 /* layer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = layer.h; path = ../../../source/modest/layer/layer.h; sourceTree = ""; }; @@ -407,6 +412,49 @@ 0EF2D5F41E01E0BD000570B6 /* default_resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = default_resources.h; sourceTree = ""; }; 0EF2D5F51E01E0BD000570B6 /* default.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = default.c; sourceTree = ""; }; 0EF2D5F61E01E0BD000570B6 /* default.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = default.h; sourceTree = ""; }; + 0EF5D14D1E680D880048E3D1 /* incoming.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = incoming.c; path = ../../source/mycore/incoming.c; sourceTree = ""; }; + 0EF5D14E1E680D880048E3D1 /* incoming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = incoming.h; path = ../../source/mycore/incoming.h; sourceTree = ""; }; + 0EF5D1501E680D880048E3D1 /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycore/myosi.h; sourceTree = ""; }; + 0EF5D1511E680D880048E3D1 /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../source/mycore/mystring.c; sourceTree = ""; }; + 0EF5D1521E680D880048E3D1 /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../source/mycore/mystring.h; sourceTree = ""; }; + 0EF5D1541E680D880048E3D1 /* mythread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mythread.c; path = ../../source/mycore/mythread.c; sourceTree = ""; }; + 0EF5D1551E680D880048E3D1 /* mythread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mythread.h; path = ../../source/mycore/mythread.h; sourceTree = ""; }; + 0EF5D1561E680D880048E3D1 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../source/mycore/utils.c; sourceTree = ""; }; + 0EF5D1571E680D880048E3D1 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../source/mycore/utils.h; sourceTree = ""; }; + 0EF5D15F1E680DA50048E3D1 /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../source/mycore/utils/resources.h; sourceTree = ""; }; + 0EF5D1601E680DA50048E3D1 /* avl_tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = avl_tree.c; path = ../../source/mycore/utils/avl_tree.c; sourceTree = ""; }; + 0EF5D1611E680DA50048E3D1 /* avl_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = avl_tree.h; path = ../../source/mycore/utils/avl_tree.h; sourceTree = ""; }; + 0EF5D1621E680DA50048E3D1 /* mchar_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mchar_async.c; path = ../../source/mycore/utils/mchar_async.c; sourceTree = ""; }; + 0EF5D1631E680DA50048E3D1 /* mchar_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mchar_async.h; path = ../../source/mycore/utils/mchar_async.h; sourceTree = ""; }; + 0EF5D1641E680DA50048E3D1 /* mcobject_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcobject_async.c; path = ../../source/mycore/utils/mcobject_async.c; sourceTree = ""; }; + 0EF5D1651E680DA50048E3D1 /* mcobject_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcobject_async.h; path = ../../source/mycore/utils/mcobject_async.h; sourceTree = ""; }; + 0EF5D1661E680DA50048E3D1 /* mcobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcobject.c; path = ../../source/mycore/utils/mcobject.c; sourceTree = ""; }; + 0EF5D1671E680DA50048E3D1 /* mcobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcobject.h; path = ../../source/mycore/utils/mcobject.h; sourceTree = ""; }; + 0EF5D1681E680DA50048E3D1 /* mcsimple.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsimple.c; path = ../../source/mycore/utils/mcsimple.c; sourceTree = ""; }; + 0EF5D1691E680DA50048E3D1 /* mcsimple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcsimple.h; path = ../../source/mycore/utils/mcsimple.h; sourceTree = ""; }; + 0EF5D16A1E680DA50048E3D1 /* mcsync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsync.c; path = ../../source/mycore/utils/mcsync.c; sourceTree = ""; }; + 0EF5D16B1E680DA50048E3D1 /* mcsync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcsync.h; path = ../../source/mycore/utils/mcsync.h; sourceTree = ""; }; + 0EF5D16C1E680DA50048E3D1 /* mctree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mctree.c; path = ../../source/mycore/utils/mctree.c; sourceTree = ""; }; + 0EF5D16D1E680DA50048E3D1 /* mctree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mctree.h; path = ../../source/mycore/utils/mctree.h; sourceTree = ""; }; + 0EF5D16E1E680DA50048E3D1 /* mhash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mhash.c; path = ../../source/mycore/utils/mhash.c; sourceTree = ""; }; + 0EF5D16F1E680DA50048E3D1 /* mhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mhash.h; path = ../../source/mycore/utils/mhash.h; sourceTree = ""; }; + 0EF5D1781E680EA10048E3D1 /* myosi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myosi.c; path = ../../source/mycore/myosi.c; sourceTree = ""; }; + 0EF5D17A1E6819E80048E3D1 /* detect_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = detect_resource.h; path = ../../source/myencoding/detect_resource.h; sourceTree = ""; }; + 0EF5D17B1E6819E80048E3D1 /* detect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = detect.c; path = ../../source/myencoding/detect.c; sourceTree = ""; }; + 0EF5D17C1E6819E80048E3D1 /* resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resource.h; path = ../../source/myencoding/resource.h; sourceTree = ""; }; + 0EF5D17D1E6819E80048E3D1 /* encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding.c; path = ../../source/myencoding/encoding.c; sourceTree = ""; }; + 0EF5D17E1E6819E80048E3D1 /* encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding.h; path = ../../source/myencoding/encoding.h; sourceTree = ""; }; + 0EF5D1811E681FC90048E3D1 /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/myencoding/myosi.h; sourceTree = ""; }; + 0EF5D1821E6822BD0048E3D1 /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../source/myencoding/mystring.c; sourceTree = ""; }; + 0EF5D1831E6822BD0048E3D1 /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../source/myencoding/mystring.h; sourceTree = ""; }; + 0EF5D1851E68362D0048E3D1 /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../source/myhtml/mystring.c; sourceTree = ""; }; + 0EF5D1861E68362D0048E3D1 /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../source/myhtml/mystring.h; sourceTree = ""; }; + 0EF5D19C1E6AE8BF0048E3D1 /* thread_queue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread_queue.c; path = ../../source/mycore/thread_queue.c; sourceTree = ""; }; + 0EF5D19D1E6AE8BF0048E3D1 /* thread_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread_queue.h; path = ../../source/mycore/thread_queue.h; sourceTree = ""; }; + 0EF5D1A31E6DDDC20048E3D1 /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../../source/myport/posix/mycore/thread.c; sourceTree = ""; }; + 0EF5D1A41E6DDDC20048E3D1 /* io.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = io.c; path = ../../source/myport/posix/mycore/io.c; sourceTree = ""; }; + 0EF5D1A51E6DDDC20048E3D1 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = memory.c; path = ../../source/myport/posix/mycore/memory.c; sourceTree = ""; }; + 0EF5D1AB1E6DDDCD0048E3D1 /* mcsync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsync.c; path = ../../source/myport/posix/mycore/utils/mcsync.c; sourceTree = ""; }; 0EF68DCC1DBF6CF000B0DEA4 /* color_parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = color_parser.c; sourceTree = ""; }; 0EF68DCD1DBF6CF000B0DEA4 /* color_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = color_parser.h; sourceTree = ""; }; 0EF808A11D9FF3BC001AF6EF /* sheet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sheet.c; sourceTree = ""; }; @@ -463,14 +511,47 @@ name = node; sourceTree = ""; }; + 0E10FECA1E5F71CF00242B61 /* myurl */ = { + isa = PBXGroup; + children = ( + 0E10FECE1E5F720200242B61 /* myosi.h */, + 0E10FECD1E5F720200242B61 /* myosi.c */, + 0E10FEDE1E5F720200242B61 /* url.h */, + 0E10FEDD1E5F720200242B61 /* url.c */, + 0E10FECC1E5F720200242B61 /* host.h */, + 0E10FECB1E5F720200242B61 /* host.c */, + 0E10FED31E5F720200242B61 /* path.h */, + 0E10FED21E5F720200242B61 /* path.c */, + 0E10FED11E5F720200242B61 /* parser.h */, + 0E10FED01E5F720200242B61 /* parser.c */, + 0E10FECF1E5F720200242B61 /* parser_end.c */, + 0E10FED51E5F720200242B61 /* punycode.h */, + 0E10FED41E5F720200242B61 /* punycode.c */, + 0E10FED71E5F720200242B61 /* scheme_const.h */, + 0E10FEDA1E5F720200242B61 /* scheme.h */, + 0E10FED91E5F720200242B61 /* scheme.c */, + 0E10FED81E5F720200242B61 /* scheme_resources.h */, + 0E10FEDC1E5F720200242B61 /* serialization.h */, + 0E10FEDB1E5F720200242B61 /* serialization.c */, + 0E10FEE01E5F720200242B61 /* utils.h */, + 0E10FEDF1E5F720200242B61 /* utils.c */, + 0E10FED61E5F720200242B61 /* resources.h */, + ); + name = myurl; + sourceTree = ""; + }; 0E750ED61D9AF1D500337E9B = { isa = PBXGroup; children = ( 0E750EE21D9AF1D500337E9B /* main.c */, + 0EF5D14A1E6805C90048E3D1 /* mycore */, + 0EF5D14C1E6805D70048E3D1 /* myencoding */, 0E750EE11D9AF1D500337E9B /* Modest */, 0E750EEB1D9AF22E00337E9B /* myfont */, 0E750EEA1D9AF22500337E9B /* mycss */, 0E750EE91D9AF21C00337E9B /* myhtml */, + 0E10FECA1E5F71CF00242B61 /* myurl */, + 0EF5D1A01E6DDD8E0048E3D1 /* posix */, 0E750EE01D9AF1D500337E9B /* Products */, ); sourceTree = ""; @@ -507,9 +588,7 @@ children = ( 0E750FAB1D9AF27F00337E9B /* def.h */, 0E750FA31D9AF27F00337E9B /* api.h */, - 0E750FA21D9AF27F00337E9B /* api_encoding.h */, 0E750FB91D9AF27F00337E9B /* myosi.h */, - 0E750FB81D9AF27F00337E9B /* myosi.c */, 0E750FB41D9AF27F00337E9B /* myhtml.h */, 0E750FB31D9AF27F00337E9B /* myhtml.c */, 0E750FA51D9AF27F00337E9B /* callback.h */, @@ -519,21 +598,13 @@ 0E750FA61D9AF27F00337E9B /* charef_resource.h */, 0E750FAA1D9AF27F00337E9B /* data_process.h */, 0E750FA91D9AF27F00337E9B /* data_process.c */, - 0E750FB01D9AF27F00337E9B /* encoding.h */, - 0E750FAF1D9AF27F00337E9B /* encoding.c */, - 0E750FAD1D9AF27F00337E9B /* encoding_detect.c */, - 0E750FAC1D9AF27F00337E9B /* encoding_detect_resource.h */, - 0E750FAE1D9AF27F00337E9B /* encoding_resource.h */, - 0E750FB21D9AF27F00337E9B /* incoming.h */, - 0E750FB11D9AF27F00337E9B /* incoming.c */, 0E750FB71D9AF27F00337E9B /* mynamespace.h */, 0E750FB61D9AF27F00337E9B /* mynamespace.c */, 0E750FB51D9AF27F00337E9B /* mynamespace_resource.h */, - 0E750FBB1D9AF27F00337E9B /* mystring.h */, - 0E750FBA1D9AF27F00337E9B /* mystring.c */, + 0EF5D1861E68362D0048E3D1 /* mystring.h */, + 0EF5D1851E68362D0048E3D1 /* mystring.c */, 0E750FBD1D9AF27F00337E9B /* parser.h */, 0E750FBC1D9AF27F00337E9B /* parser.c */, - 0E750FBE1D9AF27F00337E9B /* perf.c */, 0E750FC01D9AF27F00337E9B /* rules.h */, 0E750FBF1D9AF27F00337E9B /* rules.c */, 0E750FC21D9AF27F00337E9B /* serialization.h */, @@ -544,8 +615,6 @@ 0E750FC71D9AF27F00337E9B /* tag.c */, 0E750FC61D9AF27F00337E9B /* tag_init.c */, 0E750FC51D9AF27F00337E9B /* tag_const.h */, - 0E750FCA1D9AF27F00337E9B /* thread.h */, - 0E750FC91D9AF27F00337E9B /* thread.c */, 0E750FCC1D9AF27F00337E9B /* token.h */, 0E750FCB1D9AF27F00337E9B /* token.c */, 0E750FD41D9AF27F00337E9B /* tokenizer.h */, @@ -558,9 +627,6 @@ 0E750FD11D9AF27F00337E9B /* tokenizer_script.c */, 0E750FD61D9AF27F00337E9B /* tree.h */, 0E750FD51D9AF27F00337E9B /* tree.c */, - 0E750FE61D9AF27F00337E9B /* utils.h */, - 0E750FE51D9AF27F00337E9B /* utils.c */, - 0E750FD71D9AF27F00337E9B /* utils */, ); name = myhtml; sourceTree = ""; @@ -608,34 +674,34 @@ 0E750EEB1D9AF22E00337E9B /* myfont */ = { isa = PBXGroup; children = ( - 0E750EFC1D9AF26300337E9B /* cmap.c */, + 0E750F0B1D9AF26300337E9B /* myfont.h */, + 0E750F0A1D9AF26300337E9B /* myfont.c */, 0E750EFD1D9AF26300337E9B /* cmap.h */, - 0E750EFE1D9AF26300337E9B /* glyf.c */, + 0E750EFC1D9AF26300337E9B /* cmap.c */, 0E750EFF1D9AF26300337E9B /* glyf.h */, - 0E750F001D9AF26300337E9B /* head.c */, + 0E750EFE1D9AF26300337E9B /* glyf.c */, 0E750F011D9AF26300337E9B /* head.h */, - 0E750F021D9AF26300337E9B /* hhea.c */, + 0E750F001D9AF26300337E9B /* head.c */, 0E750F031D9AF26300337E9B /* hhea.h */, - 0E750F041D9AF26300337E9B /* hmtx.c */, + 0E750F021D9AF26300337E9B /* hhea.c */, 0E750F051D9AF26300337E9B /* hmtx.h */, - 0E750F061D9AF26300337E9B /* loca.c */, + 0E750F041D9AF26300337E9B /* hmtx.c */, 0E750F071D9AF26300337E9B /* loca.h */, - 0E750F081D9AF26300337E9B /* maxp.c */, + 0E750F061D9AF26300337E9B /* loca.c */, 0E750F091D9AF26300337E9B /* maxp.h */, - 0E750F0A1D9AF26300337E9B /* myfont.c */, - 0E750F0B1D9AF26300337E9B /* myfont.h */, - 0E750F0C1D9AF26300337E9B /* myosi.c */, + 0E750F081D9AF26300337E9B /* maxp.c */, 0E750F0D1D9AF26300337E9B /* myosi.h */, - 0E750F0E1D9AF26300337E9B /* name.c */, + 0E750F0C1D9AF26300337E9B /* myosi.c */, 0E750F0F1D9AF26300337E9B /* name.h */, - 0E750F101D9AF26300337E9B /* os_2.c */, + 0E750F0E1D9AF26300337E9B /* name.c */, 0E750F111D9AF26300337E9B /* os_2.h */, - 0E750F121D9AF26300337E9B /* pclt.c */, + 0E750F101D9AF26300337E9B /* os_2.c */, 0E750F131D9AF26300337E9B /* pclt.h */, - 0E750F141D9AF26300337E9B /* vhea.c */, + 0E750F121D9AF26300337E9B /* pclt.c */, 0E750F151D9AF26300337E9B /* vhea.h */, - 0E750F161D9AF26300337E9B /* vmtx.c */, + 0E750F141D9AF26300337E9B /* vhea.c */, 0E750F171D9AF26300337E9B /* vmtx.h */, + 0E750F161D9AF26300337E9B /* vmtx.c */, ); name = myfont; sourceTree = ""; @@ -801,31 +867,6 @@ path = ../../source/mycss/values; sourceTree = ""; }; - 0E750FD71D9AF27F00337E9B /* utils */ = { - isa = PBXGroup; - children = ( - 0E0D738B1E2F67DB00FC97DE /* mhash.h */, - 0E0D738A1E2F67DB00FC97DE /* mhash.c */, - 0E0D5D001E003A5E00EBFDD6 /* avl_tree.h */, - 0E0D5CFF1E003A5E00EBFDD6 /* avl_tree.c */, - 0E750FD91D9AF27F00337E9B /* mchar_async.h */, - 0E750FD81D9AF27F00337E9B /* mchar_async.c */, - 0E750FDA1D9AF27F00337E9B /* mcobject.c */, - 0E750FDB1D9AF27F00337E9B /* mcobject.h */, - 0E750FDC1D9AF27F00337E9B /* mcobject_async.c */, - 0E750FDD1D9AF27F00337E9B /* mcobject_async.h */, - 0E750FDE1D9AF27F00337E9B /* mcsimple.c */, - 0E750FDF1D9AF27F00337E9B /* mcsimple.h */, - 0E750FE01D9AF27F00337E9B /* mcsync.c */, - 0E750FE11D9AF27F00337E9B /* mcsync.h */, - 0E750FE21D9AF27F00337E9B /* mctree.c */, - 0E750FE31D9AF27F00337E9B /* mctree.h */, - 0E750FE41D9AF27F00337E9B /* resources.h */, - ); - name = utils; - path = ../../source/myhtml/utils; - sourceTree = ""; - }; 0E7F782A1DD3DF3E003B6053 /* layer */ = { isa = PBXGroup; children = ( @@ -850,6 +891,92 @@ name = render; sourceTree = ""; }; + 0EF5D14A1E6805C90048E3D1 /* mycore */ = { + isa = PBXGroup; + children = ( + 0EF5D1501E680D880048E3D1 /* myosi.h */, + 0EF5D1781E680EA10048E3D1 /* myosi.c */, + 0EF5D14E1E680D880048E3D1 /* incoming.h */, + 0EF5D14D1E680D880048E3D1 /* incoming.c */, + 0EF5D1521E680D880048E3D1 /* mystring.h */, + 0EF5D1511E680D880048E3D1 /* mystring.c */, + 0EF5D1551E680D880048E3D1 /* mythread.h */, + 0EF5D1541E680D880048E3D1 /* mythread.c */, + 0EF5D19D1E6AE8BF0048E3D1 /* thread_queue.h */, + 0EF5D19C1E6AE8BF0048E3D1 /* thread_queue.c */, + 0EF5D1571E680D880048E3D1 /* utils.h */, + 0EF5D1561E680D880048E3D1 /* utils.c */, + 0EF5D15E1E680D8D0048E3D1 /* utils */, + ); + name = mycore; + sourceTree = ""; + }; + 0EF5D14C1E6805D70048E3D1 /* myencoding */ = { + isa = PBXGroup; + children = ( + 0EF5D1811E681FC90048E3D1 /* myosi.h */, + 0EF5D17E1E6819E80048E3D1 /* encoding.h */, + 0EF5D17D1E6819E80048E3D1 /* encoding.c */, + 0EF5D1831E6822BD0048E3D1 /* mystring.h */, + 0EF5D1821E6822BD0048E3D1 /* mystring.c */, + 0EF5D17B1E6819E80048E3D1 /* detect.c */, + 0EF5D17A1E6819E80048E3D1 /* detect_resource.h */, + 0EF5D17C1E6819E80048E3D1 /* resource.h */, + ); + name = myencoding; + sourceTree = ""; + }; + 0EF5D15E1E680D8D0048E3D1 /* utils */ = { + isa = PBXGroup; + children = ( + 0EF5D1611E680DA50048E3D1 /* avl_tree.h */, + 0EF5D1601E680DA50048E3D1 /* avl_tree.c */, + 0EF5D1631E680DA50048E3D1 /* mchar_async.h */, + 0EF5D1621E680DA50048E3D1 /* mchar_async.c */, + 0EF5D1651E680DA50048E3D1 /* mcobject_async.h */, + 0EF5D1641E680DA50048E3D1 /* mcobject_async.c */, + 0EF5D1671E680DA50048E3D1 /* mcobject.h */, + 0EF5D1661E680DA50048E3D1 /* mcobject.c */, + 0EF5D1691E680DA50048E3D1 /* mcsimple.h */, + 0EF5D1681E680DA50048E3D1 /* mcsimple.c */, + 0EF5D16B1E680DA50048E3D1 /* mcsync.h */, + 0EF5D16A1E680DA50048E3D1 /* mcsync.c */, + 0EF5D16D1E680DA50048E3D1 /* mctree.h */, + 0EF5D16C1E680DA50048E3D1 /* mctree.c */, + 0EF5D16F1E680DA50048E3D1 /* mhash.h */, + 0EF5D16E1E680DA50048E3D1 /* mhash.c */, + 0EF5D15F1E680DA50048E3D1 /* resources.h */, + ); + name = utils; + sourceTree = ""; + }; + 0EF5D1A01E6DDD8E0048E3D1 /* posix */ = { + isa = PBXGroup; + children = ( + 0EF5D1A11E6DDDA50048E3D1 /* mycore */, + ); + name = posix; + sourceTree = ""; + }; + 0EF5D1A11E6DDDA50048E3D1 /* mycore */ = { + isa = PBXGroup; + children = ( + 0EF5D1A31E6DDDC20048E3D1 /* thread.c */, + 0EF5D1A41E6DDDC20048E3D1 /* io.c */, + 0EF5D1A51E6DDDC20048E3D1 /* memory.c */, + 0EF5D1A21E6DDDAF0048E3D1 /* utils */, + ); + name = mycore; + sourceTree = ""; + }; + 0EF5D1A21E6DDDAF0048E3D1 /* utils */ = { + isa = PBXGroup; + children = ( + 0EF5D1AB1E6DDDCD0048E3D1 /* mcsync.c */, + ); + name = utils; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -907,42 +1034,51 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0EF5D1771E680DA50048E3D1 /* mhash.c in Sources */, 0EA033771DB6AFBA009CB2B9 /* raw.c in Sources */, + 0EF5D1AC1E6DDDCD0048E3D1 /* mcsync.c in Sources */, 0EF2D5E91E01DFD5000570B6 /* tree_node.c in Sources */, 0E750FF71D9AF27F00337E9B /* tag.c in Sources */, - 0E750FF21D9AF27F00337E9B /* perf.c in Sources */, - 0E750FFF1D9AF27F00337E9B /* mchar_async.c in Sources */, 0E750F1C1D9AF26300337E9B /* hmtx.c in Sources */, 0E750F981D9AF27200337E9B /* state.c in Sources */, 0E0239881D9FEBE10084A81A /* modest.c in Sources */, 0E0239851D9FEAB90084A81A /* node.c in Sources */, + 0EF5D1741E680DA50048E3D1 /* mcsimple.c in Sources */, 0E750F201D9AF26300337E9B /* myosi.c in Sources */, + 0EF5D1A91E6DDDC20048E3D1 /* memory.c in Sources */, 0E750F181D9AF26300337E9B /* cmap.c in Sources */, 0E750F911D9AF27200337E9B /* parser.c in Sources */, - 0E750FEC1D9AF27F00337E9B /* incoming.c in Sources */, 0E750F931D9AF27200337E9B /* function_parser.c in Sources */, 0E750FF91D9AF27F00337E9B /* token.c in Sources */, + 0E10FEE51E5F720200242B61 /* path.c in Sources */, 0E750F841D9AF27200337E9B /* init.c in Sources */, 0E750F891D9AF27200337E9B /* state.c in Sources */, + 0E10FEE91E5F720200242B61 /* url.c in Sources */, 0E750F1A1D9AF26300337E9B /* head.c in Sources */, + 0EF5D15C1E680D880048E3D1 /* mythread.c in Sources */, 0E750F1B1D9AF26300337E9B /* hhea.c in Sources */, 0E0C91991DB107E7007A0501 /* property.c in Sources */, 0E750EFB1D9AF25300337E9B /* type.c in Sources */, 0E5E2AB21DC76D67007836AB /* parser_image.c in Sources */, 0E750F191D9AF26300337E9B /* glyf.c in Sources */, 0E750F8B1D9AF27200337E9B /* mystring.c in Sources */, - 0E7510031D9AF27F00337E9B /* mcsync.c in Sources */, + 0EF5D1761E680DA50048E3D1 /* mctree.c in Sources */, + 0EF5D1581E680D880048E3D1 /* incoming.c in Sources */, + 0EF5D1A81E6DDDC20048E3D1 /* io.c in Sources */, 0E750F231D9AF26300337E9B /* pclt.c in Sources */, 0E750F8C1D9AF27200337E9B /* init.c in Sources */, + 0E10FEE11E5F720200242B61 /* host.c in Sources */, 0EF68DCE1DBF6CF000B0DEA4 /* color_parser.c in Sources */, + 0E10FEE81E5F720200242B61 /* serialization.c in Sources */, 0E750F1F1D9AF26300337E9B /* myfont.c in Sources */, - 0E750FF81D9AF27F00337E9B /* thread.c in Sources */, 0E750FE71D9AF27F00337E9B /* callback.c in Sources */, + 0EF5D1791E680EA10048E3D1 /* myosi.c in Sources */, 0EF2D5EA1E01DFD5000570B6 /* tree.c in Sources */, + 0EF5D1721E680DA50048E3D1 /* mcobject_async.c in Sources */, 0E79EE951DC8E270004FF5DC /* stack.c in Sources */, 0E750F8D1D9AF27200337E9B /* parser.c in Sources */, + 0EF5D1701E680DA50048E3D1 /* avl_tree.c in Sources */, 0E750F971D9AF27200337E9B /* pseudo.c in Sources */, - 0E750FEA1D9AF27F00337E9B /* encoding_detect.c in Sources */, 0E750EFA1D9AF25300337E9B /* pseudo_class.c in Sources */, 0E0C91961DB1064E007A0501 /* serialization.c in Sources */, 0E5E2AB01DC7682A007836AB /* parser_url.c in Sources */, @@ -959,66 +1095,72 @@ 0E0C918C1DAECB56007A0501 /* serialization.c in Sources */, 0E750FFE1D9AF27F00337E9B /* tree.c in Sources */, 0E750FEE1D9AF27F00337E9B /* mynamespace.c in Sources */, - 0E7510021D9AF27F00337E9B /* mcsimple.c in Sources */, 0E750F861D9AF27200337E9B /* state.c in Sources */, 0E750F251D9AF26300337E9B /* vmtx.c in Sources */, 0E750F801D9AF27200337E9B /* an_plus_b.c in Sources */, - 0E750FEF1D9AF27F00337E9B /* myosi.c in Sources */, - 0E0D738C1E2F67DB00FC97DE /* mhash.c in Sources */, 0E750F9B1D9AF27200337E9B /* tokenizer_end.c in Sources */, 0E750F851D9AF27200337E9B /* parser.c in Sources */, + 0EF5D1A71E6DDDC20048E3D1 /* thread.c in Sources */, 0E750F871D9AF27200337E9B /* entry.c in Sources */, 0E818EF61DAE6F8F005B0C77 /* serialization.c in Sources */, 0E0239811D9FE8EC0084A81A /* type.c in Sources */, 0E750F811D9AF27200337E9B /* check.c in Sources */, - 0E0D5D011E003A5E00EBFDD6 /* avl_tree.c in Sources */, 0E750EF91D9AF25300337E9B /* match.c in Sources */, 0E7F78351DD3E0D5003B6053 /* begin.c in Sources */, 0E750F9E1D9AF27200337E9B /* consume.c in Sources */, 0E750F9A1D9AF27200337E9B /* stylesheet.c in Sources */, 0E750F9D1D9AF27200337E9B /* tokenizer.c in Sources */, + 0EF5D1871E68362D0048E3D1 /* mystring.c in Sources */, + 0EF5D1751E680DA50048E3D1 /* mcsync.c in Sources */, 0E750FF11D9AF27F00337E9B /* parser.c in Sources */, 0E750F221D9AF26300337E9B /* os_2.c in Sources */, 0E0460221DBE1B0D00685A80 /* color.c in Sources */, 0E750F991D9AF27200337E9B /* value.c in Sources */, 0E0C919C1DB10866007A0501 /* raw_property.c in Sources */, - 0E750FF01D9AF27F00337E9B /* mystring.c in Sources */, 0E750F961D9AF27200337E9B /* parser.c in Sources */, 0E5AA4BD1DA9689700FF5358 /* shared.c in Sources */, - 0E7510041D9AF27F00337E9B /* mctree.c in Sources */, 0E750F9F1D9AF27200337E9B /* serialization.c in Sources */, 0E750FF51D9AF27F00337E9B /* stream.c in Sources */, + 0E10FEEA1E5F720200242B61 /* utils.c in Sources */, 0E750F951D9AF27200337E9B /* list.c in Sources */, - 0E7510051D9AF27F00337E9B /* utils.c in Sources */, 0E750F881D9AF27200337E9B /* init.c in Sources */, - 0E7510001D9AF27F00337E9B /* mcobject.c in Sources */, + 0E10FEE41E5F720200242B61 /* parser.c in Sources */, 0E750FFB1D9AF27F00337E9B /* tokenizer_end.c in Sources */, + 0EF5D1841E6822BD0048E3D1 /* mystring.c in Sources */, 0E750FA01D9AF27200337E9B /* units.c in Sources */, + 0E10FEE71E5F720200242B61 /* scheme.c in Sources */, 0E750F211D9AF26300337E9B /* name.c in Sources */, 0E750F241D9AF26300337E9B /* vhea.c in Sources */, + 0EF5D1731E680DA50048E3D1 /* mcobject.c in Sources */, 0EF2D5F71E01E0BD000570B6 /* default.c in Sources */, 0E750F831D9AF27200337E9B /* entry.c in Sources */, + 0E10FEE61E5F720200242B61 /* punycode.c in Sources */, 0E750FF31D9AF27F00337E9B /* rules.c in Sources */, 0E750FFD1D9AF27F00337E9B /* tokenizer.c in Sources */, 0EF2D5E81E01DFD5000570B6 /* binding.c in Sources */, + 0E10FEE31E5F720200242B61 /* parser_end.c in Sources */, 0E750FF41D9AF27F00337E9B /* serialization.c in Sources */, 0EF808A61DA08BBE001AF6EF /* map.c in Sources */, 0E750F8F1D9AF27200337E9B /* parser.c in Sources */, 0E750FA11D9AF27200337E9B /* values.c in Sources */, 0E0C918F1DAED006007A0501 /* serialization.c in Sources */, + 0EF5D15D1E680D880048E3D1 /* utils.c in Sources */, 0E750FED1D9AF27F00337E9B /* myhtml.c in Sources */, 0E750F821D9AF27200337E9B /* convert.c in Sources */, 0E750FE91D9AF27F00337E9B /* data_process.c in Sources */, + 0EF5D15A1E680D880048E3D1 /* mystring.c in Sources */, + 0EF5D1711E680DA50048E3D1 /* mchar_async.c in Sources */, 0E4B525C1DC13BBB0095026A /* parser_text_decoration.c in Sources */, 0EF2D5F21E01E089000570B6 /* default.c in Sources */, - 0E7510011D9AF27F00337E9B /* mcobject_async.c in Sources */, + 0EF5D1801E6819E80048E3D1 /* encoding.c in Sources */, 0E750FE81D9AF27F00337E9B /* charef.c in Sources */, 0EE852811DC94891003BB21C /* parser_background.c in Sources */, 0E750EE31D9AF1D500337E9B /* main.c in Sources */, 0E750F941D9AF27200337E9B /* init.c in Sources */, + 0EF5D19E1E6AE8BF0048E3D1 /* thread_queue.c in Sources */, 0E750F1E1D9AF26300337E9B /* maxp.c in Sources */, 0E750F8A1D9AF27200337E9B /* mycss.c in Sources */, - 0E750FEB1D9AF27F00337E9B /* encoding.c in Sources */, + 0E10FEE21E5F720200242B61 /* myosi.c in Sources */, 0E0C91921DAED0F5007A0501 /* serialization.c in Sources */, 0EF2D5ED1E01E04A000570B6 /* declaration.c in Sources */, 0E7F78381DD3E2E5003B6053 /* glue.c in Sources */, @@ -1027,6 +1169,7 @@ 0E0239731D9D97150084A81A /* thread.c in Sources */, 0E750FFC1D9AF27F00337E9B /* tokenizer_script.c in Sources */, 0E750EF81D9AF25300337E9B /* finder.c in Sources */, + 0EF5D17F1E6819E80048E3D1 /* detect.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1060,7 +1203,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = c99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -1082,8 +1225,8 @@ HEADER_SEARCH_PATHS = ../../source; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( - "-DMyHTML_WITH_PERF", - "-DMyHTML_FORCE_RDTSC", + "-DMyCORE_WITH_PERF", + "-DMyCORE_FORCE_RDTSC", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; diff --git a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate index 023649e..17a24bd 100644 Binary files a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate and b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index fe2b454..d238ccc 100644 --- a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,4 +2,22 @@ + + + + + + diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme index 448dc8b..2fcec69 100644 --- a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme @@ -49,7 +49,6 @@ useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" - enableAddressSanitizer = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> +#include +#include +<<<<<<< Updated upstream #include "mycss/selectors/serialization.h" #include "mycss/declaration/init.h" #include "modest/finder/finder.h" #include "modest/finder/thread.h" -#include "myhtml/encoding.h" +#include "myencoding/encoding.h" #include "myfont/myfont.h" #include "modest/node/serialization.h" +#include "myurl/url.h" +#include "myurl/serialization.h" + struct res_data { char *data; size_t size; @@ -43,7 +47,7 @@ struct res_data load_data(const char* filename) long l = ftell(f); fseek(f, 0L, SEEK_SET); - char *html = (char*)myhtml_malloc(l); + char *html = (char*)mycore_malloc(l); if(fread(html, 1, l, f) != l) { exit(1); } @@ -52,245 +56,2157 @@ struct res_data load_data(const char* filename) struct res_data res = {html, (size_t)l}; return res; +======= +#include +#include + +void usage(const char *path, float font_size, size_t codepoint) +{ + printf("Usage:\n"); + printf("\tprogram [char in UTF-8] [font fize in px] [font path]\n"); + printf("\tdefault: program \"x\" %.f %s\n\n", font_size, path); +>>>>>>> Stashed changes } -void serialization_callback(const char* data, size_t len, void* ctx) +int main(int argc, const char * argv[]) { +<<<<<<< Updated upstream printf("%.*s", (int)len, data); } -myhtml_tree_t * myhtml(const char* data, size_t data_size, bool is_file, bool print_result, myhtml_callback_tree_node_f cai, void* cai_ctx) +//myhtml_tree_t * myhtml(const char* data, size_t data_size, bool is_file, bool print_result, myhtml_callback_tree_node_f cai, void* cai_ctx) +//{ +// setbuf(stdout, NULL); +// +// myhtml_t* myhtml = myhtml_create(); +// myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); +// +//// uint64_t all_start = mycore_hperf_clock(NULL); +//// uint64_t tree_init_start = mycore_hperf_clock(NULL); +// +// myhtml_tree_t* tree = myhtml_tree_create(); +// myhtml_tree_init(tree, myhtml); +// +// myhtml_callback_tree_node_insert_set(tree, cai, cai_ctx); +// +//// uint64_t tree_init_stop = mycore_hperf_clock(NULL); +//// uint64_t parse_start = mycore_hperf_clock(NULL); +// +// if(is_file) { +// struct res_data res = load_data(data); +// +// myencoding_t encoding = myencoding_prescan_stream_to_determine_encoding(res.data, res.size); +// +// if(encoding == MyENCODING_NOT_DETERMINED) +// encoding = MyENCODING_UTF_8; +// +// myhtml_parse(tree, encoding, res.data, res.size); +// free(res.data); +// } +// else { +// myhtml_parse(tree, MyENCODING_UTF_8, data, data_size); +// } +// +//// uint64_t parse_stop = mycore_hperf_clock(NULL); +//// uint64_t all_stop = mycore_hperf_clock(NULL); +// +// if(print_result) { +// myhtml_tree_print_node_children(tree, tree->document, stdout, 0); +// } +// +// printf("\n\nMyHTML Information:\n"); +//// printf("\tTicks/sec: %llu\n", (unsigned long long) mycore_hperf_res(NULL)); +//// mycore_hperf_print("\tFirst Tree init", tree_init_start, tree_init_stop, stdout); +//// mycore_hperf_print("\tParse html", parse_start, parse_stop, stdout); +//// mycore_hperf_print("\tTotal", all_start, all_stop, stdout); +//// printf("\n"); +// +// //myhtml_tree_destroy(tree); +// //myhtml_destroy(myhtml); +// +// return tree; +//} +// +//mycss_entry_t * mycss(const char* data, size_t data_size, bool is_file, bool print_result) +//{ +// // base init +// mycss_t *mycss = mycss_create(); +// mycss_init(mycss); +// +// // currenr entry work init +// mycss_entry_t *entry = mycss_entry_create(); +// mycss_entry_init(mycss, entry); +// +// uint64_t parse_start = mycore_hperf_clock(NULL); +// +// if(is_file) { +// struct res_data res = load_data(data); +// mycss_parse(entry, MyENCODING_UTF_8, res.data, res.size); +// free(res.data); +// } +// else { +// mycss_parse(entry, MyENCODING_UTF_8, data, data_size); +// } +// +// uint64_t parse_stop = mycore_hperf_clock(NULL); +// +// if(print_result) { +// printf("\n"); +// mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(entry); +// mycss_selectors_serialization_list(entry->selectors, stylesheet->sel_list_first, serialization_callback, NULL); +// } +// +// printf("\n------------\nMyCSS Information:\n"); +// printf("\tTicks/sec: %llu\n", (unsigned long long) mycore_hperf_res(NULL)); +// mycore_hperf_print("\tParse css", parse_start, parse_stop, stdout); +// +// //mycss_entry_destroy(entry, true); +// //mycss_destroy(mycss, true); +// +// return entry; +//} +// +//void print_tree_after_all(modest_t* modest, myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* scope_node, mycss_entry_t *mycss_entry) +//{ +// myhtml_tree_node_t* node = scope_node; +// +// while(node) { +// modest_node_t *m_node = (modest_node_t*)node->data; +// +// myhtml_tree_print_node(myhtml_tree, node, stdout); +// +// if(m_node) { +// printf("\tstyles: "); +// +// modest_node_raw_serialization(modest, m_node, serialization_callback, NULL); +// +// printf("\n"); +// } +// +// if(node->child) +// node = node->child; +// else { +// while(node != scope_node && node->next == NULL) +// node = node->parent; +// +// if(node == scope_node) +// break; +// +// node = node->next; +// } +// } +//} +// +//size_t count = 0; +// +//void modest_callback_for_create_mnode(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx) +//{ +// if(node->tag_id == MyHTML_TAG__TEXT) { +// return; +// } +// +// modest_t *modest = (modest_t*)ctx; +// +// /* create modest node */ +// modest_node_t *m_node = modest_node_create(modest); +// if(m_node == NULL) +// return; +// +// modest_node_init(modest, m_node); +// +// node->data = (void*)m_node; +//} +// +//int main2222(int argc, const char * argv[]) +//{ +// const char* data_base = "https://lenta.ru/news/2017/........./02/23/minsk_docs/"; +// const char* data_rel = "/comments//news/2017/02/23/minsk_docs/"; +// +// printf("base: %s\n", data_base); +// printf("rela: %s\n", data_rel); +// +// myurl_t *url = myurl_create(); +// myurl_init(url); +// +// mystatus_t status; +// myurl_entry_t *url_base = myurl_parse(url, data_base, strlen(data_base), NULL, &status); +// myurl_entry_t *url_entry = myurl_parse(url, data_rel, strlen(data_rel), url_base, &status); +// +// printf("result: "); +// myurl_serialization(url_entry, false, serialization_callback, NULL); +// printf("\n"); +// +// if(status) { +// exit(1); +// } +// +// myurl_destroy(url, true); +// +// return 0; +//} +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +//#include +//#include +// +//#include +// +// +// +//#include +//#include +//#include +//#include +//#include +// +// +//struct res_html_test { +// char *html; +// size_t len; +// size_t size; +//}; +// +//struct chunk_res_test { +// struct res_html_test data; +// struct res_html_test result; +//}; +// +//struct chunk_res_result { +// myhtml_tree_t *tree; +// size_t good; +// size_t bad; +// +// bool is_fragment; +// bool enabled_script; +// myhtml_tag_id_t tag_id; +// enum myhtml_namespace ns; +//}; +// +//typedef void (*chunk_test_f)(struct chunk_res_test *res_test, struct chunk_res_result *result); +// +//size_t read_line(char *html, size_t size) +//{ +// size_t len; +// for (len = 0; len < size; len++) { +// if(html[len] == '\n') +// break; +// } +// +// return len; +//} +// +//void init_res_test_data(struct res_html_test* data) +//{ +// data->len = 0; +// data->size = 4096; +// data->html = malloc(sizeof(char) * data->size); +// +// if(data->html == NULL) { +// fprintf(stderr, "Can't init resurces for test object\n"); +// exit(EXIT_FAILURE); +// } +//} +// +//void init_res_test(struct chunk_res_test* res_test) +//{ +// init_res_test_data(&res_test->data); +// init_res_test_data(&res_test->result); +//} +// +//void clean_res_test(struct chunk_res_test* res_test) +//{ +// res_test->data.len = 0; +// res_test->result.len = 0; +//} +// +//void append_to_test(struct res_html_test* data, const char *text, size_t len, bool add_newline, bool to_lowercase) +//{ +// if(text == NULL) +// return; +// +// if((data->len + len + 2) >= data->size) { +// data->size = data->size + len + 2048; +// data->html = realloc(data->html, data->size); +// +// if(data->html == NULL) { +// fprintf(stderr, "Can't realloc resurces for test object\n"); +// exit(EXIT_FAILURE); +// } +// } +// +// if(add_newline && data->len) { +// data->html[data->len] = '\n'; +// data->len++; +// } +// +// memcpy(&data->html[data->len], text, len); +// +// if(to_lowercase) { +// for(size_t i = data->len; i < (data->len + len); i++) { +// if(data->html[i] > 0x40 && data->html[i] < 0x5b) +// data->html[i] |= 0x60; +// } +// } +// +// data->len += len; +// data->html[data->len] = '\0'; +//} +// +//bool sort_text(myhtml_tree_attr_t *attr1, size_t size, myhtml_tree_attr_t **list, size_t i, size_t *len) +//{ +// unsigned char *fisrt = (unsigned char*)attr1->key.data; +// unsigned char *sec = (unsigned char*)list[i]->key.data; +// +// for (size_t j = 0; j < size; j++) +// { +// if(fisrt[j] > sec[j]) { +// break; +// } +// else if(fisrt[j] < sec[j]) { +// memmove(&list[(i + 1)], &list[i], sizeof(myhtml_tree_attr_t*)); +// list[i] = attr1; +// (*len)++; +// return true; +// } +// } +// +// return false; +//} +// +//myhtml_tree_attr_t ** sort_attr(myhtml_tree_node_t *node) +//{ +// myhtml_tree_attr_t *attr = myhtml_node_attribute_first(node); +// myhtml_tree_attr_t **list = calloc(1024, sizeof(myhtml_tree_attr_t*)); +// size_t len = 1; +// size_t i; +// +// list[0] = attr; +// attr = attr->next; +// +// while (attr) { +// for (i = 0; i < len; i++) { +// if(attr->key.length > list[i]->key.length) +// { +// if(sort_text(attr, list[i]->key.length, list, i, &len)) +// break; +// } +// else { +// if(sort_text(attr, attr->key.length, list, i, &len)) +// break; +// } +// } +// +// if(i == len) { +// list[i] = attr; +// len++; +// } +// +// attr = attr->next; +// } +// +// return list; +//} +// +//void print_node_attr(myhtml_tree_node_t *node, struct res_html_test* data, size_t inc) +//{ +// if(myhtml_node_attribute_first(node) == NULL) +// return; +// +// myhtml_tree_attr_t **list_attr = sort_attr(node); +// +// size_t len = 0; +// while (*list_attr != NULL) +// { +// myhtml_tree_attr_t *attr = *list_attr; +// +// const char *name = myhtml_attribute_key(attr, &len); +// +// if(name) { +// append_to_test(data, "\n", 1, false, false); +// +// for(size_t i = 0; i < inc; i++) +// append_to_test(data, " ", 2, false, false); +// +// if(attr->ns == MyHTML_NAMESPACE_XML) { +// append_to_test(data, "xml ", 4, false, false); +// } +// else if(attr->ns == MyHTML_NAMESPACE_XMLNS) { +// append_to_test(data, "xmlns ", 6, false, false); +// } +// else if(attr->ns == MyHTML_NAMESPACE_XLINK) { +// append_to_test(data, "xlink ", 6, false, false); +// } +// +// append_to_test(data, name, len, false, false); +// +// const char *value = myhtml_attribute_value(attr, &len); +// +// if(value) { +// append_to_test(data, "=\"", 2, false, false); +// append_to_test(data, value, len, false, false); +// append_to_test(data, "\"", 1, false, false); +// } +// else { +// append_to_test(data, "=\"\"", 3, false, false); +// } +// } +// +// //attr = myhtml_attribute_next(attr); +// list_attr++; +// } +//} +// +//void print_tree(myhtml_tree_t* tree, myhtml_tree_node_t *node, struct res_html_test* data, size_t inc) +//{ +// while (node) +// { +// if(data->len) +// append_to_test(data, "\n", 1, false, false); +// +// for(size_t i = 0; i < inc; i++) +// append_to_test(data, " ", 2, false, false); +// +// size_t len = 0; +// +// if(myhtml_node_tag_id(node) == MyHTML_TAG__TEXT) +// { +// const char *text = myhtml_node_text(node, &len); +// +// append_to_test(data, "\"", 1, false, false); +// append_to_test(data, text, len, false, false); +// append_to_test(data, "\"", 1, false, false); +// } +// else if(myhtml_node_tag_id(node) == MyHTML_TAG__COMMENT) +// { +// const char *text = myhtml_node_text(node, &len); +// +// append_to_test(data, "", 4, false, false); +// } +// else if(myhtml_node_tag_id(node) == MyHTML_TAG__DOCTYPE) +// { +// append_to_test(data, "doctype.attr_name) { +// append_to_test(data, " ", 1, false, false); +// append_to_test(data, tree->doctype.attr_name, strlen(tree->doctype.attr_name), false, false); +// } +// +// if(tree->doctype.attr_public) { +// append_to_test(data, " \"", 2, false, false); +// append_to_test(data, tree->doctype.attr_public, strlen(tree->doctype.attr_public), false, false); +// append_to_test(data, "\"", 1, false, false); +// } +// +// if(tree->doctype.attr_system) { +// append_to_test(data, " \"", 2, false, false); +// append_to_test(data, tree->doctype.attr_system, strlen(tree->doctype.attr_system), false, false); +// append_to_test(data, "\"", 1, false, false); +// } +// +// append_to_test(data, ">", 1, false, false); +// } +// else { +// const char *tag_name = myhtml_tag_name_by_id(tree, myhtml_node_tag_id(node), &len); +// +// if(tag_name) { +// append_to_test(data, "<", 1, false, false); +// +// switch (myhtml_node_namespace(node)) { +// case MyHTML_NAMESPACE_SVG: +// append_to_test(data, "svg ", 4, false, false); +// append_to_test(data, tag_name, len, false, false); +// break; +// +// case MyHTML_NAMESPACE_MATHML: +// append_to_test(data, "math ", 5, false, false); +// append_to_test(data, tag_name, len, false, true); +// break; +// +// default: +// append_to_test(data, tag_name, len, false, false); +// break; +// } +// } +// else +// // it can not be +// printf("", 1, false, false); +// +// if(myhtml_node_tag_id(node) == MyHTML_TAG_TEMPLATE && +// myhtml_node_namespace(node) == MyHTML_NAMESPACE_HTML) +// { +// append_to_test(data, "\n", 1, false, false); +// +// for(size_t i = 0; i <= inc; i++) +// append_to_test(data, " ", 2, false, false); +// +// append_to_test(data, "content", 7, false, false); +// +// print_tree(tree, myhtml_node_child(node), data, (inc + 2)); +// node = myhtml_node_next(node); +// +// continue; +// } +// +// // print node attributes +// print_node_attr(node, data, (inc + 1)); +// } +// +// // print childs +// print_tree(tree, myhtml_node_child(node), data, (inc + 1)); +// node = myhtml_node_next(node); +// } +//} +// +//void chunk_process(struct chunk_res_test *res_test, struct chunk_res_result *result) +//{ +// struct res_html_test data; +// init_res_test_data(&data); +// +// if(result->enabled_script) +// result->tree->flags |= MyHTML_TREE_FLAGS_SCRIPT; +// +// //printf("%.*s\n", res_test->data.len, res_test->data.html); +// +// if(result->is_fragment == false) { +// myhtml_parse_single(result->tree, MyENCODING_UTF_8, res_test->data.html, res_test->data.len); +// print_tree(result->tree, result->tree->document->child, &data, 0); +// } +// else { +// myhtml_parse_fragment_single(result->tree, MyENCODING_UTF_8, res_test->data.html, res_test->data.len, result->tag_id, result->ns); +// print_tree(result->tree, result->tree->document->child->child, &data, 0); +// } +// +// if(res_test->result.len != data.len) { +// result->bad++; +// +// printf("Error:\n"); +// printf("Original raw:\n%.*s\n", (int)res_test->data.len, res_test->data.html); +// printf("Original:\n%s\n", res_test->result.html); +// printf("Result:\n%s\n", data.html); +// } +// else if(strcmp(res_test->result.html, data.html) == 0) { +// result->good++; +// printf("Done\n"); +// } +// else { +// result->bad++; +// printf("Error with len ==:\n"); +// printf("Original raw:\n%.*s\n", (int)res_test->data.len, res_test->data.html); +// printf("Original:\n%s\n", res_test->result.html); +// printf("Result:\n%s\n", data.html); +// } +// +// myhtml_tree_clean(result->tree); +// //mythread_clean(result->tree->myhtml->thread); +// +// free(data.html); +//} +// +//void read_chunk(struct res_data* res, chunk_test_f func, struct chunk_res_result *result) +//{ +// struct chunk_res_test res_test; +// init_res_test(&res_test); +// +// result->is_fragment = false; +// +// size_t i = 0; size_t state = 0; +// while (i < res->size) +// { +// size_t line_len = read_line(&res->data[i], (res->size - i)); +// +// if(line_len == 0 && state != 1) { +// if((i + 1) < res->size && res->data[(i + 1)] != '#') { +// append_to_test(&res_test.result, "\n", 1, true, false); +// i++; +// continue; +// } +// +// if(res_test.data.len) +// func(&res_test, result); +// +// state = 0; +// result->is_fragment = false; +// result->enabled_script = false; +// clean_res_test(&res_test); +// } +// else if(res->data[i] == '#') { +// +// if(line_len == strlen("#script-on") && strncmp(&res->data[i], "#script-on", strlen("#script-on")) == 0) { +// result->enabled_script = true; +// } +// else if(state == 0) { +// if(strncmp(&res->data[i], "#data", line_len) == 0) { +// state = 1; +// } +// } +// else if(state == 1) { +// if(strncmp(&res->data[i], "#errors", line_len) == 0) { +// state = 2; +// } +// } +// else if(state == 2 && line_len > 9) { +// if(strncmp(&res->data[i], "#document-fragment", line_len) == 0) { +// state = 3; +// result->is_fragment = true; +// } +// } +// else if(state == 2 || state == 3) { +// if(strncmp(&res->data[i], "#document", line_len) == 0) { +// state = 4; +// } +// } +// else { +// fprintf(stderr, "Bad position in text\n"); +// exit(EXIT_FAILURE); +// } +// +// i += line_len; +// } +// else if(state == 1) { +// append_to_test(&res_test.data, &res->data[i], line_len, true, false); +// i += line_len; +// } +// else if(state == 3) { +// const char *data = &res->data[i]; +// size_t j; +// +// for(j = 0; j < line_len; j++) +// { +// if(data[j] == ' ') +// { +// while(j < line_len) { +// if(data[j] != ' ' && data[j] != '\n' && data[j] != '\t' && data[j] != '\r') +// break; +// +// j++; +// } +// +// break; +// } +// } +// +// if(j == line_len) { +// result->tag_id = myhtml_tag_id_by_name(result->tree, data, line_len); +// result->ns = MyHTML_NAMESPACE_HTML; +// } +// else { +// result->tag_id = myhtml_tag_id_by_name(result->tree, &data[j], (line_len - j)); +// +// if(strncasecmp("math", data, 4) == 0) { +// result->ns = MyHTML_NAMESPACE_MATHML; +// } +// else if(strncasecmp("svg", data, 3) == 0) { +// result->ns = MyHTML_NAMESPACE_SVG; +// } +// else { +// result->ns = MyHTML_NAMESPACE_HTML; +// } +// } +// +// i += line_len; +// } +// else if(state == 4) { +// if(res->data[i] == '|') { +// append_to_test(&res_test.result, &res->data[(i + 2)], (line_len - 2), true, false); +// } +// else if(res->data[i] != '\n') { +// append_to_test(&res_test.result, &res->data[i], line_len, true, false); +// } +// +// i += line_len; +// } +// else { +// i += line_len; +// } +// +// i++; +// } +//} +// +//void read_dir(const char* from_dir) +//{ +// myhtml_t* myhtml = myhtml_create(); +// myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); +// +// myhtml_tree_t* tree = myhtml_tree_create(); +// myhtml_tree_init(tree, myhtml); +// +// DIR *dir; +// struct dirent *ent; +// struct stat path_stat; +// +// size_t count = 0; +// size_t from_dir_len = strlen(from_dir); +// +// char path[4096]; +// strncpy(path, from_dir, from_dir_len); +// +// if((dir = opendir(from_dir)) == NULL) { +// fprintf(stderr, "Can't open directory: %s\n", from_dir); +// } +// +// struct chunk_res_result result = {tree, 0, 0}; +// +// while((ent = readdir(dir)) != NULL) +// { +// sprintf(&path[from_dir_len], "%s", ent->d_name); +// stat(path, &path_stat); +// +// if(ent->d_name[0] != '.' && !S_ISDIR(path_stat.st_mode) && +// ent->d_namlen > 4 && +// strcmp(".dat", &ent->d_name[ (ent->d_namlen - 4) ]) == 0) +// { +// count++; +// +// struct res_data res = load_data(path); +// read_chunk(&res, chunk_process, &result); +// free(res.data); +// } +// } +// +// closedir (dir); +// +// myhtml_tree_destroy(tree); +// myhtml_destroy(myhtml); +// +// printf("\nGood: %zu; Bad: %zu\n\n", result.good, result.bad); +//} + +//#include "myhtml/serialization.h" +// +//int main(int argc, const char * argv[]) +//{ +// setbuf(stdout, 0); +// +//// read_dir("/new/C-git/tree-construction/"); +//// return 0; +// +// const char* path = "/new/test.html"; +// struct res_data res = load_data(path); +// +// size_t i = 0; +// +// myhtml_t* myhtml = myhtml_create(); +// myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); +// +// myhtml_tree_t* tree = myhtml_tree_create(); +// mystatus_t status = myhtml_tree_init(tree, myhtml); +// if(status) { +// fprintf(stderr, "Init Tree return BAD status!!!\n"); +// exit(EXIT_FAILURE); +// } +// +// while(i < 1000) { +// if(myhtml_parse(tree, MyENCODING_UTF_8, res.data, res.size)) { +// fprintf(stderr, "Parser return BAD status!!!\n"); +// exit(EXIT_FAILURE); +// } +// +// //myhtml_serialization_tree_callback(tree->document, serialization_callback, NULL); +// //printf("%zu\n", i); +// i++; +// } +// +// myhtml_tree_destroy(tree); +// myhtml_destroy(myhtml); +//} + + + + + + + + + + + +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#include +#include +#include + +#include +#include + +void usage(const char *path, float font_size, size_t codepoint) +{ + printf("Usage:\n"); + printf("\tprogram [char in UTF-8] [font fize in px] [font path]\n"); + printf("\tdefault: program \"x\" %.f %s\n\n", font_size, path); +} + +int main(int argc, const char * argv[]) { - setbuf(stdout, NULL); + /* set and get params */ + const char *path = "/new/C-git/Modest/third_party/font/Arkhip.ttf"; + float font_size = 200.0f; - myhtml_t* myhtml = myhtml_create(); - myhtml_init(myhtml, MyHTML_OPTIONS_PARSE_MODE_SINGLE, 1, 0); + size_t codepoint; + myencoding_ascii_utf_8_to_codepoint((unsigned char*)"x", &codepoint); - uint64_t all_start = myhtml_hperf_clock(NULL); - uint64_t tree_init_start = myhtml_hperf_clock(NULL); + if (argc == 2) { + if(myencoding_ascii_utf_8_to_codepoint((const unsigned char*)argv[1], &codepoint) == 0) { +======= + /* set and get params */ + const char *path = "/new/C-git/Modest/third_party/font/Arkhip.ttf"; + float font_size = 200.0f; - myhtml_tree_t* tree = myhtml_tree_create(); - myhtml_tree_init(tree, myhtml); + size_t codepoint; + myhtml_encoding_ascii_utf_8_to_codepoint((unsigned char*)"x", &codepoint); - myhtml_callback_tree_node_insert_set(tree, cai, cai_ctx); - - uint64_t tree_init_stop = myhtml_hperf_clock(NULL); - uint64_t parse_start = myhtml_hperf_clock(NULL); - - if(is_file) { - struct res_data res = load_data(data); - - myhtml_encoding_t encoding = myhtml_encoding_prescan_stream_to_determine_encoding(res.data, res.size); + if (argc == 2) { + if(myhtml_encoding_ascii_utf_8_to_codepoint((const unsigned char*)argv[1], &codepoint) == 0) { +>>>>>>> Stashed changes + fprintf(stderr, "Bad char code point\n"); + return EXIT_FAILURE; + } + } + else if (argc == 3) { + long num = strtol(argv[2], NULL, 0); - if(encoding == MyHTML_ENCODING_NOT_DETERMINED) - encoding = MyHTML_ENCODING_UTF_8; + if(num < 1) { + fprintf(stderr, "To small font size param\n"); + return EXIT_FAILURE; + } - myhtml_parse(tree, encoding, res.data, res.size); - free(res.data); + font_size = (float)num; +<<<<<<< Updated upstream + } + else if (argc == 4) { + path = argv[3]; } else { - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + usage(path, font_size, codepoint); } - uint64_t parse_stop = myhtml_hperf_clock(NULL); - uint64_t all_stop = myhtml_hperf_clock(NULL); + myfont_font_t *mf = myfont_create(); + myfont_init(mf); - if(print_result) { - myhtml_tree_print_node_children(tree, tree->document, stdout, 0); - } + uint8_t *font_data; + mystatus_t mf_status = myfont_load_from_file(mf, path, &font_data, NULL); - printf("\n\nMyHTML Information:\n"); - printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); - myhtml_hperf_print("\tFirst Tree init", tree_init_start, tree_init_stop, stdout); - myhtml_hperf_print("\tParse html", parse_start, parse_stop, stdout); - myhtml_hperf_print("\tTotal", all_start, all_stop, stdout); - printf("\n"); + if(mf_status) { + myfont_destroy(mf, true); + + if(mf_status == MyFONT_STATUS_ERROR_FILE_OPEN) { + fprintf(stderr, "Can't open font file %s\n", path); + } + else { + fprintf(stderr, "Can't load font file %s\n", path); + } + + return EXIT_FAILURE; + } - //myhtml_tree_destroy(tree); - //myhtml_destroy(myhtml); + char data[5]; + size_t len = myencoding_codepoint_to_ascii_utf_8(codepoint, data); + data[len] = '\0'; - return tree; -} - -mycss_entry_t * mycss(const char* data, size_t data_size, bool is_file, bool print_result) -{ - // base init - mycss_t *mycss = mycss_create(); - mycss_init(mycss); + /* work code */ + uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, codepoint, NULL); - // currenr entry work init - mycss_entry_t *entry = mycss_entry_create(); - mycss_entry_init(mycss, entry); + float baseline = myfont_metrics_baseline(mf, font_size); + float ascender = myfont_metrics_ascender(mf, font_size); + float descender = myfont_metrics_descender(mf, font_size); + float x_height = myfont_metrics_x_height(mf, font_size); + float cap_height = myfont_metrics_cap_height(mf, font_size); + float offset = myfont_metrics_glyph_offset_y(mf, codepoint, font_size, NULL); + float width = myfont_metrics_width(mf, codepoint, font_size, NULL); + float height = myfont_metrics_height(mf, codepoint, font_size, NULL); - uint64_t parse_start = myhtml_hperf_clock(NULL); + /* print result */ + printf("Font file: %s\n", path); + printf("Font size: %.fpx\n\n", font_size); - if(is_file) { - struct res_data res = load_data(data); - mycss_parse(entry, MyHTML_ENCODING_UTF_8, res.data, res.size); - free(res.data); + printf("Metrics for code point " MyCORE_FORMAT_Z " (%s):\n", codepoint, data); +======= } - else { - mycss_parse(entry, MyHTML_ENCODING_UTF_8, data, data_size); + else if (argc == 4) { + path = argv[3]; } - - uint64_t parse_stop = myhtml_hperf_clock(NULL); - - if(print_result) { - printf("\n"); - mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(entry); - mycss_selectors_serialization_list(entry->selectors, stylesheet->sel_list_first, serialization_callback, NULL); + else { + usage(path, font_size, codepoint); } - printf("\n------------\nMyCSS Information:\n"); - printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); - myhtml_hperf_print("\tParse css", parse_start, parse_stop, stdout); + myfont_font_t *mf = myfont_create(); + myfont_init(mf); - //mycss_entry_destroy(entry, true); - //mycss_destroy(mycss, true); - - return entry; -} - -void print_tree_after_all(modest_t* modest, myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* scope_node, mycss_entry_t *mycss_entry) -{ - myhtml_tree_node_t* node = scope_node; + myfont_status_t mf_status = myfont_load(mf, path); - while(node) { - modest_node_t *m_node = (modest_node_t*)node->data; - - myhtml_tree_print_node(myhtml_tree, node, stdout); + if(mf_status) { + myfont_destroy(mf, true); - if(m_node) { - printf("\tstyles: "); - - modest_node_raw_serialization(modest, m_node, serialization_callback, NULL); - - printf("\n"); + if(mf_status == MyFONT_STATUS_ERROR_FILE_OPEN) { + fprintf(stderr, "Can't open font file %s\n", path); } - - if(node->child) - node = node->child; else { - while(node != scope_node && node->next == NULL) - node = node->parent; - - if(node == scope_node) - break; - - node = node->next; + fprintf(stderr, "Can't load font file %s\n", path); } + + return EXIT_FAILURE; } -} - -size_t count = 0; - -void modest_callback_for_create_mnode(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx) -{ - if(node->tag_id == MyHTML_TAG__TEXT) { - return; - } - - modest_t *modest = (modest_t*)ctx; - - /* create modest node */ - modest_node_t *m_node = modest_node_create(modest); - if(m_node == NULL) - return; - - modest_node_init(modest, m_node); - - node->data = (void*)m_node; -} - -int main(int argc, const char * argv[]) { - setbuf(stdout, NULL); - - //char *html_f = "/new/C-git/lexbor/test/test.html"; - char *html_f = "/new/C-git/habr/1.html"; - //char *html_f = "/new/C-git/HTML_BENTCHMARK/booking.com.html"; - - //char *css_f = "/new/C-git/habr/1_glob.css"; - char *css_f = "/new/C-git/CSS_BENCHMARK/baseguide.css"; - - //char *css_f = "/new/C-git/bootstrap.css"; - - char *html = "Привет UTF8!

"; - char *css = ".radio input[type=\"radio\"]:checked + label::before {} .checkbox input[type=\"checkbox\"]:checked + label::before {}"; - - char *selector = "menu"; - - modest_t *modest = modest_create(); - modest_init(modest); - - myhtml_tree_t *myhtml_tree = myhtml(html_f, strlen(html_f), true, false, modest_callback_for_create_mnode, (void*)modest); - mycss_entry_t *mycss_entry = mycss(css_f, strlen(css_f), true, false); - -// myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true, modest_callback_for_create_mnode, (void*)modest); -// mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, false); - - modest->myhtml_tree = myhtml_tree; - modest->mycss_entry = mycss_entry; - - mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(mycss_entry); - /* simple api */ - uint64_t parse_simple_start = myhtml_hperf_clock(NULL); - uint64_t parse_simple_stop = myhtml_hperf_clock(NULL); + char data[5]; + size_t len = myhtml_encoding_codepoint_to_ascii_utf_8(codepoint, data); + data[len] = '\0'; + /* work code */ + uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, codepoint, NULL); + float baseline = myfont_metrics_baseline(mf, font_size); + float ascender = myfont_metrics_ascender(mf, font_size); + float descender = myfont_metrics_descender(mf, font_size); + float x_height = myfont_metrics_x_height(mf, font_size); + float cap_height = myfont_metrics_cap_height(mf, font_size); + float offset = myfont_metrics_glyph_offset_y(mf, codepoint, font_size, NULL); + float width = myfont_metrics_width(mf, codepoint, font_size, NULL); + float height = myfont_metrics_height(mf, codepoint, font_size, NULL); - /* full api */ - uint64_t parse_start = myhtml_hperf_clock(NULL); + /* print result */ + printf("Font file: %s\n", path); + printf("Font size: %.fpx\n\n", font_size); + printf("Metrics for code point " MyHTML_FMT_Z " (%s):\n", codepoint, data); +>>>>>>> Stashed changes + printf("\tBaseline: %.05f\n", baseline); + printf("\tAscender: %.05f\n", ascender); + printf("\tDescender: %.05f\n", descender); + printf("\tX-Height: %.05f\n", x_height); + printf("\tCap-Height: %.05f\n", cap_height); + printf("\tWidth: %.05f\n", width); + printf("\tHeight: %.05f\n", height); - modest_finder_t* finder = modest_finder_create(); - modest_finder_init(finder); + /* print html svg */ + printf("\n\n", width + 4.0f, descender + 4.0f); + printf("\t\n", 0.0f, ascender, width, ascender); + printf("\t\n", 0.0f, cap_height, width, cap_height); + printf("\t\n", 0.0f, x_height, width, x_height); + printf("\t\n", 0.0f, baseline, width, baseline); + printf("\t\n", 0.0f, descender, width, descender); -// threads - modest_finder_thread_t *finder_thread = modest_finder_thread_create(); - modest_finder_thread_init(finder, finder_thread, 4); - - modest_finder_thread_process(modest, finder_thread, myhtml_tree->node_html, stylesheet->sel_list_first); - - finder_thread = modest_finder_thread_destroy(finder_thread, true); - finder = modest_finder_destroy(finder, true); - - - uint64_t parse_stop = myhtml_hperf_clock(NULL); - -// print_tree_after_all(modest, myhtml_tree, myhtml_tree->node_html, mycss_entry); - - printf("\n\n------------\nInformation:\n"); - printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); - myhtml_hperf_print("\tFound selectors", parse_start, parse_stop, stdout); - myhtml_hperf_print("\tParse and Found Simple selectors", parse_simple_start, parse_simple_stop, stdout); - printf("\n"); - -// printf("\nPrint result:\n"); -// for(size_t i = 0; i < full_collection->length; i++) { -// myhtml_tree_print_node(myhtml_tree, full_collection->list[i], stdout); -// } -// printf("\nFound: %zu\n", full_collection->length); -// printf("\n"); -// -// modest_finder_destroy(finder_full, true); - - modest = modest_destroy(modest, true); + if(glyph_index < mf->table_maxp.numGlyphs) { + myfont_table_glyph_t *glyph = &mf->table_glyf.cache[glyph_index]; + + printf("\tpointCount; i++) { + + float x = (float)((glyph->head.xMax + glyph->simple.xCoordinates[i]) - glyph->head.xMax) * font_size / ((float)mf->table_head.unitsPerEm); + float y = (float)((glyph->head.yMax - glyph->simple.yCoordinates[i])) * font_size / ((float)mf->table_head.unitsPerEm); + + printf("%f,%f ", x, (y + offset)); + } + printf("\" />\n"); + } - mycss_t* mycss = mycss_entry->mycss; - mycss_stylesheet_destroy(stylesheet, true); - mycss_entry_destroy(mycss_entry, true); - mycss_destroy(mycss, true); + printf("\n"); - myhtml_t* myhtml = myhtml_tree->myhtml; - myhtml_tree_destroy(myhtml_tree); - myhtml_destroy(myhtml); +<<<<<<< Updated upstream + myfont_destroy_font_data(mf, font_data); +======= +>>>>>>> Stashed changes + myfont_destroy(mf, true); return 0; } +<<<<<<< Updated upstream + + + + + + + + + + + + + + + + + + + + + + +//int mainsdfsfd(int argc, const char * argv[]) +//{ +// setbuf(stdout, NULL); +// +// //char *html_f = "/new/C-git/lexbor/test/test.html"; +// char *html_f = "/new/C-git/habr/1.html"; +// //char *html_f = "/new/C-git/HTML_BENTCHMARK/booking.com.html"; +// +// //char *css_f = "/new/C-git/habr/1_glob.css"; +// char *css_f = "/new/C-git/CSS_BENCHMARK/baseguide.css"; +// +// //char *css_f = "/new/C-git/bootstrap.css"; +// +// char *html = "Привет UTF8!

"; +// char *css = ".radio input[type=\"radio\"]:checked + label::before {} .checkbox input[type=\"checkbox\"]:checked + label::before {}"; +// +// char *selector = "menu"; +// +// modest_t *modest = modest_create(); +// modest_init(modest); +// +// myhtml_tree_t *myhtml_tree = myhtml(html_f, strlen(html_f), true, false, modest_callback_for_create_mnode, (void*)modest); +// mycss_entry_t *mycss_entry = mycss(css_f, strlen(css_f), true, false); +// +//// myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true, modest_callback_for_create_mnode, (void*)modest); +//// mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, false); +// +// modest->myhtml_tree = myhtml_tree; +// modest->mycss_entry = mycss_entry; +// +// mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(mycss_entry); +// +// /* simple api */ +// uint64_t parse_simple_start = mycore_hperf_clock(NULL); +// uint64_t parse_simple_stop = mycore_hperf_clock(NULL); +// +// +// +// /* full api */ +// uint64_t parse_start = mycore_hperf_clock(NULL); +// +// +// modest_finder_t* finder = modest_finder_create(); +// modest_finder_init(finder); +// +//// threads +// modest_finder_thread_t *finder_thread = modest_finder_thread_create(); +// modest_finder_thread_init(finder, finder_thread, 4); +// +//#ifndef MyCORE_BUILD_WITHOUT_THREADS +// modest_finder_thread_process(modest, finder_thread, myhtml_tree->node_html, stylesheet->sel_list_first); +//#endif +// +// finder_thread = modest_finder_thread_destroy(finder_thread, true); +// finder = modest_finder_destroy(finder, true); +// +// +// uint64_t parse_stop = mycore_hperf_clock(NULL); +// +//// print_tree_after_all(modest, myhtml_tree, myhtml_tree->node_html, mycss_entry); +// +// printf("\n\n------------\nInformation:\n"); +// printf("\tTicks/sec: %llu\n", (unsigned long long) mycore_hperf_res(NULL)); +// mycore_hperf_print("\tFound selectors", parse_start, parse_stop, stdout); +// mycore_hperf_print("\tParse and Found Simple selectors", parse_simple_start, parse_simple_stop, stdout); +// printf("\n"); +// +//// printf("\nPrint result:\n"); +//// for(size_t i = 0; i < full_collection->length; i++) { +//// myhtml_tree_print_node(myhtml_tree, full_collection->list[i], stdout); +//// } +//// printf("\nFound: %zu\n", full_collection->length); +//// printf("\n"); +//// +//// modest_finder_destroy(finder_full, true); +// +// modest = modest_destroy(modest, true); +// +// mycss_t* mycss = mycss_entry->mycss; +// mycss_stylesheet_destroy(stylesheet, true); +// mycss_entry_destroy(mycss_entry, true); +// mycss_destroy(mycss, true); +// +// myhtml_t* myhtml = myhtml_tree->myhtml; +// myhtml_tree_destroy(myhtml_tree); +// myhtml_destroy(myhtml); +// +// return 0; +//} + + + + + + + + + + + + + + + + + + + + + + + + + + +///* +// Copyright (C) 2015-2017 Alexander Borisov +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// Author: lex.borisov@gmail.com (Alexander Borisov) +//*/ +// +//#include +//#include +//#include +//#include +// +//#include +//#include +//#include +// +//struct test_res { +// char* data; +// size_t size; +//} +//typedef test_res_t; +// +//struct test_pos { +// size_t begin; +// size_t length; +//} +//typedef test_pos_t; +// +//enum test_type { +// TEST_TYPE_UNDEF = 0x00, +// TEST_TYPE_FIRST = '1', +// TEST_TYPE_SECOND = '2', +// TEST_TYPE_THIRD = '3', +// TEST_TYPE_FOURTH = '4' +//}; +// +//static mchar_async_t* MCharOBJ = NULL; +//static size_t MCharOBJNode = 0; +// +//test_pos_t test_get_value(const char *data, size_t* length, size_t data_size, const char* some); +// +//test_res_t test_load_file(const char* filename) +//{ +// FILE *fh = fopen(filename, "rb"); +// if(fh == NULL) { +// fprintf(stderr, "Can't open file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// if(fseek(fh, 0L, SEEK_END) != 0) { +// fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// long size = ftell(fh); +// +// if(fseek(fh, 0L, SEEK_SET) != 0) { +// fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// if(size <= 0) { +// fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// char *file_data = (char*)malloc(size + 1); +// if(file_data == NULL) { +// fprintf(stderr, "Can't allocate mem for file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// size_t nread = fread(file_data, 1, size, fh); +// if (nread != size) { +// fprintf(stderr, "Could not read %ld bytes (%zu bytes done)\n", size, nread); +// exit(EXIT_FAILURE); +// } +// +// fclose(fh); +// +// return (test_res_t){file_data, (size_t)size}; +//} +// +//void test_serialization_callback(const char* data, size_t len, void* ctx) +//{ +// mycore_string_t *str = ctx; +// mycore_string_append(str, data, len); +//} +// +//myurl_entry_t * test_parse_url(const char *data, size_t length, myurl_entry_t* base_url) +//{ +// myurl_t *url = myurl_create(); +// if(url == NULL) { +// fprintf(stderr, "Could create url object\n"); +// exit(EXIT_FAILURE); +// } +// +// if(myurl_init(url)) { +// fprintf(stderr, "Could init url object\n"); +// exit(EXIT_FAILURE); +// } +// +// myurl_entry_t *url_entry = myurl_parse(url, data, length, base_url, NULL); +// +// if(url_entry == NULL) { +// myurl_destroy(url, true); +// return NULL; +// } +// +// return url_entry; +//} +// +//void test_destroy_url(myurl_entry_t* entry_url) +//{ +// if(entry_url) { +// myurl_t *url = entry_url->url_ref; +// myurl_entry_destroy(entry_url, true); +// myurl_destroy(url, true); +// } +//} +// +//myurl_host_type_t test_host_type_from_data(const char *data, size_t length) +//{ +// if(strncmp("IPv4", data, length) == 0) { +// return MyURL_HOST_TYPE_IPv4; +// } +// else if(strncmp("IPv6", data, length) == 0) { +// return MyURL_HOST_TYPE_IPv6; +// } +// else if(strncmp("DOMAIN", data, length) == 0) { +// return MyURL_HOST_TYPE_DOMAIN; +// } +// else if(strncmp("OPAQUE", data, length) == 0) { +// return MyURL_HOST_TYPE_OPAQUE; +// } +// +// return MyURL_HOST_TYPE_UNDEF; +//} +// +//myurl_host_type_t test_get_domain_type(const char *data, size_t* length, size_t data_size) +//{ +// test_pos_t domain_type = test_get_value(data, length, data_size, "%DOMAIN_TYPE:"); +// myurl_host_type_t domain_type_int = test_host_type_from_data(&data[domain_type.begin], domain_type.length); +// +// return domain_type_int; +//} +// +//test_pos_t test_get_value(const char *data, size_t* length, size_t data_size, const char* some) +//{ +// test_pos_t pos = {0}; +// size_t some_len = strlen(some); +// +// size_t len = *length + some_len; +// +// if(len >= data_size) +// return pos; +// +// if(strncmp(some, &data[ *length ], some_len)) +// return pos; +// +// pos.begin = len; +// +// while(len < data_size) { +// if(data[len] == '%') +// { +// size_t bpos = len; +// bpos++; +// +// while(bpos < data_size) { +// if((bpos - 1) > len && (data[bpos] < 'A' || data[bpos] > 'Z') && data[bpos] != '_') { +// if(data[bpos] == ':') { +// if(strncmp("%URL", &data[len], 4) == 0) +// pos.length = ((len - pos.begin) - 2); +// else +// pos.length = ((len - pos.begin) - 1); +// +// *length = len; +// return pos; +// } +// +// break; +// } +// +// bpos++; +// } +// } +// +// len++; +// } +// +// *length = len; +// pos.length = ((len - pos.begin) - 1); +// +// return pos; +//} +// +///* FIRST */ +//bool test_for_type_first_entry(const char *data, size_t* length, size_t data_size) +//{ +// test_pos_t url = test_get_value(data, length, data_size, "%URL:"); +// if(url.length == 0) +// return true; +// +// //printf("%.*s\n", (int)url.length, &data[ url.begin ]); +// +// myurl_entry_t *url_entry = test_parse_url(&data[ url.begin ], url.length, NULL); +// +// /* get expected */ +// test_pos_t expect = test_get_value(data, length, data_size, "%EXPECT:"); +// if(expect.length == 0) { +// if(url_entry == NULL) +// return true; +// } +// +// if(url_entry == NULL) { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tResult:\n"); +// fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); +// +// test_destroy_url(url_entry); +// return true; +// } +// +// mycore_string_t cmp_str = {0}; +// mycore_string_init(MCharOBJ, MCharOBJNode, &cmp_str, 1024); +// +// myurl_serialization(url_entry, false, test_serialization_callback, &cmp_str); +// +// /* compare */ +// if(cmp_str.length != expect.length || strncmp(cmp_str.data, &data[expect.begin], cmp_str.length)) +// { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tResult: %.*s\n", (int)cmp_str.length, cmp_str.data); +// fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); +// +// mycore_string_destroy(&cmp_str, false); +// test_destroy_url(url_entry); +// return true; +// } +// +// mycore_string_destroy(&cmp_str, false); +// test_destroy_url(url_entry); +// +// return true; +//} +// +//bool test_for_type_first(const char *data, size_t length, size_t data_size) +//{ +// while(length < data_size) { +// if(test_for_type_first_entry(data, &length, data_size) == false) +// return false; +// } +// +// return true; +//} +// +///* SECOND */ +//bool test_for_type_second_entry(const char *data, size_t* length, size_t data_size) +//{ +// test_pos_t url = test_get_value(data, length, data_size, "%URL:"); +// if(url.length == 0) +// return true; +// +// /* get domain_type */ +// myurl_host_type_t domain_type = test_get_domain_type(data, length, data_size); +// +// //printf("%.*s\n", (int)url.length, &data[ url.begin ]); +// +// myurl_entry_t *url_entry = test_parse_url(&data[ url.begin ], url.length, NULL); +// +// /* get expected */ +// test_pos_t expect = test_get_value(data, length, data_size, "%EXPECT:"); +// if(expect.length == 0) { +// if(url_entry == NULL) +// return true; +// } +// +// if(url_entry == NULL) { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tResult:\n"); +// fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); +// +// test_destroy_url(url_entry); +// return true; +// } +// +// if(url_entry->host.type != domain_type) { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tDomain Type: %d\n", url_entry->host.type); +// fprintf(stderr, "\tDomain Ip Version Type: %d\n", url_entry->host.ipv.type); +// fprintf(stderr, "\tExpect Domain Type: %d\n\n", domain_type); +// +// test_destroy_url(url_entry); +// return true; +// } +// +// mycore_string_t cmp_str = {0}; +// mycore_string_init(MCharOBJ, MCharOBJNode, &cmp_str, 1024); +// +// myurl_serialization(url_entry, false, test_serialization_callback, &cmp_str); +// +// /* compare */ +// if(cmp_str.length != expect.length || strncmp(cmp_str.data, &data[expect.begin], cmp_str.length)) +// { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tResult: %.*s\n", (int)cmp_str.length, cmp_str.data); +// fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); +// +// mycore_string_destroy(&cmp_str, false); +// test_destroy_url(url_entry); +// return true; +// } +// +// mycore_string_destroy(&cmp_str, false); +// test_destroy_url(url_entry); +// +// return true; +//} +// +//bool test_for_type_second(const char *data, size_t length, size_t data_size) +//{ +// while(length < data_size) { +// if(test_for_type_second_entry(data, &length, data_size) == false) +// return false; +// } +// +// return true; +//} +// +///* THIRD */ +//bool test_for_type_third_entry(const char *data, size_t* length, size_t data_size) +//{ +// test_pos_t url = test_get_value(data, length, data_size, "%URL:"); +// if(url.length == 0) +// return true; +// +// /* get base */ +// test_pos_t base = test_get_value(data, length, data_size, "%BASE:"); +// if(base.length == 0) +// return true; +// +// myurl_entry_t *base_entry = test_parse_url(&data[ base.begin ], base.length, NULL); +// myurl_entry_t *url_entry = test_parse_url(&data[ url.begin ], url.length, base_entry); +// +// /* get expected */ +// test_pos_t expect = test_get_value(data, length, data_size, "%EXPECT:"); +// if(expect.length == 0) { +// if(url_entry == NULL) +// return true; +// } +// +// if(url_entry == NULL) { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tBASE: %.*s\n", (int)base.length, &data[ base.begin ]); +// fprintf(stderr, "\tResult:\n"); +// fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); +// +// test_destroy_url(url_entry); +// return true; +// } +// +// mycore_string_t cmp_str = {0}; +// mycore_string_init(MCharOBJ, MCharOBJNode, &cmp_str, 1024); +// +// myurl_serialization(url_entry, false, test_serialization_callback, &cmp_str); +// +// /* compare */ +// if(cmp_str.length != expect.length || strncmp(cmp_str.data, &data[expect.begin], cmp_str.length)) +// { +// fprintf(stderr, "Test FAILURE!\n"); +// fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); +// fprintf(stderr, "\tBASE: %.*s\n", (int)base.length, &data[ base.begin ]); +// fprintf(stderr, "\tResult: %.*s\n", (int)cmp_str.length, cmp_str.data); +// fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); +// +// mycore_string_destroy(&cmp_str, false); +// test_destroy_url(url_entry); +// return true; +// } +// +// mycore_string_destroy(&cmp_str, false); +// test_destroy_url(url_entry); +// +// return true; +//} +// +//bool test_for_type_third(const char *data, size_t length, size_t data_size) +//{ +// while(length < data_size) { +// if(test_for_type_third_entry(data, &length, data_size) == false) +// return false; +// } +// +// return true; +//} +// +//void test_by_type(const char *data, size_t data_size, const char* filename) +//{ +// printf("Test file: %s\n", filename); +// +// size_t length = 8; +// +// if(data_size <= length || strncmp("type ", data, 5)) { +// fprintf(stderr, "Could not read type form %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// switch ((unsigned char)data[5]) { +// case TEST_TYPE_FIRST: +// test_for_type_first(&data[8], 0, (data_size - 8)); +// break; +// +// case TEST_TYPE_SECOND: +// test_for_type_second(&data[8], 0, (data_size - 8)); +// break; +// +// case TEST_TYPE_THIRD: +// test_for_type_third(&data[8], 0, (data_size - 8)); +// break; +// +// default: +// break; +// } +//} +// +//void test(const char* filename) +//{ +// test_res_t test_data = test_load_file(filename); +// test_by_type(test_data.data, test_data.size, filename); +// +// if(test_data.data) +// free(test_data.data); +//} +// +//void test_read_dir(const char* dir_path) +//{ +// char path[(4096 * 4)]; +// sprintf(path, "%s", dir_path); +// +// printf("Tests in directory: %s\n", path); +// +// size_t path_len = strlen(dir_path); +// +// DIR *dir; +// struct dirent *ent; +// struct stat path_stat; +// +// if((dir = opendir(dir_path)) != NULL) +// { +// while((ent = readdir(dir)) != NULL) +// { +// sprintf(&path[path_len], "/%s", ent->d_name); +// +// if(stat(path, &path_stat) != 0) { +// fprintf(stderr, "Can't get status for file: %s\n", path); +// exit(EXIT_FAILURE); +// } +// +// if(ent->d_name[0] == '.' || S_ISDIR(path_stat.st_mode)) +// continue; +// +// test(path); +// } +// +// closedir (dir); +// } +//} +// +//int main(int argc, const char * argv[]) +//{ +// setbuf(stdout, NULL); +// +//// if (argc < 2) { +//// printf("Bad ARGV!\nUse: url \n"); +//// exit(EXIT_FAILURE); +//// } +// +// MCharOBJ = mchar_async_create(4, 4096); +// if(MCharOBJ == NULL) +// return EXIT_FAILURE; +// +// MCharOBJNode = mchar_async_node_add(MCharOBJ); +// +// //test_read_dir(argv[1]); +// test_read_dir("/new/C-git/Modest/test/myurl/data"); +// +// mchar_async_destroy(MCharOBJ, true); +// +// return EXIT_SUCCESS; +//} +// +// +// +//void test_serialization_callback_for_aim(const char* data, size_t len, void* ctx) +//{ +// printf("%.*s", (int)len, data); +//} +// +//int mainkj(int argc, const char * argv[]) +//{ +// setbuf(stdout, NULL); +// +// //const char* data_base = "http://[::1.]/"; +// //const char* data_base = "file://localhost/C:/foo"; +// const char* data_rel = "https://lenta.ru/news/2017/02/28/visa/"; +// +// //printf("base: %s\n", data_base); +// // printf("rela: %s\n", data_rel); +// +// myurl_t *url = myurl_create(); +// myurl_init(url); +// +// for(size_t i = 0; i < 10000; i++) +// { +// +// +// //myurl_entry_t *url_base = myurl_parse(url, data_base, strlen(data_base), NULL, NULL); +// myurl_entry_t *url_entry = myurl_parse(url, data_rel, strlen(data_rel), NULL, NULL); +// +//// printf("result: "); +//// myurl_serialization(url_entry, false, test_serialization_callback_for_aim, NULL); +//// printf("\n"); +//// +//// +//// if(myurl_entry_host_set(url_entry, "192.168.", strlen("192.168."))) { +//// printf("after changes host: ERROR\n"); +//// exit(0); +//// } +//// +//// if(myurl_entry_path_set(url_entry, "new/path", strlen("new/path"))) { +//// printf("after change path: ERROR\n"); +//// exit(0); +//// } +//// +//// if(myurl_entry_path_append_entry(url_entry, "lalaлвappendpath", strlen("lalaлвappendpath"))) { +//// printf("after append path: ERROR\n"); +//// exit(0); +//// } +//// +//// if(myurl_entry_path_replace_entry(url_entry, 1, "beb#ebe", strlen("beb#ebe"))) { +//// printf("after append path: ERROR\n"); +//// exit(0); +//// } +//// +//// printf("befor delete path entry by index 2: "); +//// myurl_serialization(url_entry, false, test_serialization_callback_for_aim, NULL); +//// printf("\n"); +//// +//// myurl_entry_path_remove_entry(url_entry, 2); +//// +//// myurl_entry_query_set(url_entry, "lalala", 4); +//// myurl_entry_fragment_set(url_entry, "anch4", 5); +//// +//// printf("after changes: "); +//// myurl_serialization(url_entry, false, test_serialization_callback_for_aim, NULL); +//// printf("\n"); +// +//// char *host_data = myurl_entry_host_as_string(url_entry, NULL); +//// +////// printf("HOST: %s\n", host_data); +//// +//// myurl_entry_host_free_string(url_entry, host_data); +// +// +// myurl_entry_destroy(url_entry, true); +// +//// printf("result: "); +//// +//// if(url_entry) { +//// myurl_serialization(url_entry, false, test_serialization_callback_for_aim, NULL); +//// printf("\n"); +//// } +//// else { +//// printf("ERROR\n"); +//// } +// +// +// } +// +// myurl_destroy(url, true); +// +// return 1; +//} + + +======= +>>>>>>> Stashed changes + + +<<<<<<< Updated upstream + + + + + + + + + + +///* +// Copyright (C) 2017 Alexander Borisov +======= +///* +// Copyright (C) 2016 Alexander Borisov +>>>>>>> Stashed changes +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +// Author: lex.borisov@gmail.com (Alexander Borisov) +<<<<<<< Updated upstream +// */ +// +//#include +//#include +// +//int main(int argc, const char * argv[]) +//{ +// const char* data_base = "http://lalal.ru/"; +// +// myurl_t *url = myurl_create(); +// if(url == NULL) { +// printf("Can't create URL object\n"); +// return EXIT_FAILURE; +// } +// +// if(myurl_init(url)) { +// printf("Can't init URL object\n"); +// return EXIT_FAILURE; +// } +// +// printf("Parse url \"%s\":\n", data_base); +// +// myurl_entry_t *url_base = myurl_parse(url, data_base, strlen(data_base), NULL, NULL); +// myurl_entry_t *url_relative = myurl_parse(url, "bla.ru/", strlen("bla.ru/"), url_base, NULL); +// +// const char *scheme = myurl_entry_scheme_name(url_base, NULL); +// char *authority = myurl_entry_authority_as_string(url_base, NULL); +// const char *username = myurl_entry_username(url_base, NULL); +// const char *password = myurl_entry_password(url_base, NULL); +// char *host = myurl_entry_host_as_string(url_base, NULL); +// char *path = myurl_entry_path_as_string(url_base, NULL); +// const char *query = myurl_entry_query(url_base, NULL); +// const char *fragment = myurl_entry_fragment(url_base, NULL); +// +// printf("\tScheme: %s\n" , (scheme ? scheme : "")); +// printf("\tScheme port: %u\n" , myurl_entry_scheme_port(url_base)); +// printf("\tAuthority (%s):\n" , authority); +// printf("\t\tUsername: %s\n" , username); +// printf("\t\tPassword: %s\n" , password); +// printf("\tHost: %s\n" , host); +// printf("\tPort is defined: %s\n", (myurl_entry_port_is_defined(url_base) ? "true" : "false")); +// printf("\tPort: %u\n" , myurl_entry_port(url_base)); +// printf("\tPath: %s\n" , path); +// printf("\tQuery: %s\n" , (query ? query : "")); +// printf("\tFragment: %s\n" , (fragment ? fragment : "")); +// +// myurl_entry_free_string(url_base, authority); +// myurl_entry_free_string(url_base, host); +// myurl_entry_free_string(url_base, path); +// +// myurl_entry_destroy(url_base, true); +// myurl_destroy(url, true); +======= +//*/ +// +//#include "myhtml/myhtml.h" +//#include "mycss/mycss.h" +//#include "modest/modest.h" +// +//#include "mycss/selectors/serialization.h" +//#include "mycss/declaration/init.h" +//#include "modest/finder/finder.h" +//#include "modest/finder/thread.h" +//#include "myhtml/encoding.h" +//#include "myfont/myfont.h" +//#include "modest/node/serialization.h" +// +//struct res_data { +// char *data; +// size_t size; +//}; +// +//struct res_data load_data(const char* filename) +//{ +// FILE *f = fopen(filename, "rb"); +// fseek(f, 0L, SEEK_END); +// +// long l = ftell(f); +// fseek(f, 0L, SEEK_SET); +// +// char *html = (char*)myhtml_malloc(l); +// if(fread(html, 1, l, f) != l) { +// exit(1); +// } +// +// fclose(f); +// +// struct res_data res = {html, (size_t)l}; +// return res; +//} +// +//void serialization_callback(const char* data, size_t len, void* ctx) +//{ +// printf("%.*s", (int)len, data); +//} +// +//myhtml_tree_t * myhtml(const char* data, size_t data_size, bool is_file, bool print_result, myhtml_callback_tree_node_f cai, void* cai_ctx) +//{ +// setbuf(stdout, NULL); +// +// myhtml_t* myhtml = myhtml_create(); +// myhtml_init(myhtml, MyHTML_OPTIONS_PARSE_MODE_SINGLE, 1, 0); +// +// uint64_t all_start = myhtml_hperf_clock(NULL); +// uint64_t tree_init_start = myhtml_hperf_clock(NULL); +// +// myhtml_tree_t* tree = myhtml_tree_create(); +// myhtml_tree_init(tree, myhtml); +// +// myhtml_callback_tree_node_insert_set(tree, cai, cai_ctx); +// +// uint64_t tree_init_stop = myhtml_hperf_clock(NULL); +// uint64_t parse_start = myhtml_hperf_clock(NULL); +// +// if(is_file) { +// struct res_data res = load_data(data); +// +// myhtml_encoding_t encoding = myhtml_encoding_prescan_stream_to_determine_encoding(res.data, res.size); +// +// if(encoding == MyHTML_ENCODING_NOT_DETERMINED) +// encoding = MyHTML_ENCODING_UTF_8; +// +// myhtml_parse(tree, encoding, res.data, res.size); +// free(res.data); +// } +// else { +// myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); +// } +// +// uint64_t parse_stop = myhtml_hperf_clock(NULL); +// uint64_t all_stop = myhtml_hperf_clock(NULL); +// +// if(print_result) { +// myhtml_tree_print_node_children(tree, tree->document, stdout, 0); +// } +// +// printf("\n\nMyHTML Information:\n"); +// printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); +// myhtml_hperf_print("\tFirst Tree init", tree_init_start, tree_init_stop, stdout); +// myhtml_hperf_print("\tParse html", parse_start, parse_stop, stdout); +// myhtml_hperf_print("\tTotal", all_start, all_stop, stdout); +// printf("\n"); +// +// //myhtml_tree_destroy(tree); +// //myhtml_destroy(myhtml); +// +// return tree; +//} +// +//mycss_entry_t * mycss(const char* data, size_t data_size, bool is_file, bool print_result) +//{ +// // base init +// mycss_t *mycss = mycss_create(); +// mycss_init(mycss); +// +// // currenr entry work init +// mycss_entry_t *entry = mycss_entry_create(); +// mycss_entry_init(mycss, entry); +// +// uint64_t parse_start = myhtml_hperf_clock(NULL); +// +// if(is_file) { +// struct res_data res = load_data(data); +// mycss_parse(entry, MyHTML_ENCODING_UTF_8, res.data, res.size); +// free(res.data); +// } +// else { +// mycss_parse(entry, MyHTML_ENCODING_UTF_8, data, data_size); +// } +// +// uint64_t parse_stop = myhtml_hperf_clock(NULL); +// +// if(print_result) { +// printf("\n"); +// mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(entry); +// mycss_selectors_serialization_list(entry->selectors, stylesheet->sel_list_first, serialization_callback, NULL); +// } +// +// printf("\n------------\nMyCSS Information:\n"); +// printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); +// myhtml_hperf_print("\tParse css", parse_start, parse_stop, stdout); +// +// //mycss_entry_destroy(entry, true); +// //mycss_destroy(mycss, true); +// +// return entry; +//} +// +//void print_tree_after_all(modest_t* modest, myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* scope_node, mycss_entry_t *mycss_entry) +//{ +// myhtml_tree_node_t* node = scope_node; +// +// while(node) { +// modest_node_t *m_node = (modest_node_t*)node->data; +// +// myhtml_tree_print_node(myhtml_tree, node, stdout); +// +// if(m_node) { +// printf("\tstyles: "); +// +// modest_node_raw_serialization(modest, m_node, serialization_callback, NULL); +// +// printf("\n"); +// } +// +// if(node->child) +// node = node->child; +// else { +// while(node != scope_node && node->next == NULL) +// node = node->parent; +// +// if(node == scope_node) +// break; +// +// node = node->next; +// } +// } +//} +// +//size_t count = 0; +// +//void modest_callback_for_create_mnode(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx) +//{ +// if(node->tag_id == MyHTML_TAG__TEXT) { +// return; +// } +// +// modest_t *modest = (modest_t*)ctx; +// +// /* create modest node */ +// modest_node_t *m_node = modest_node_create(modest); +// if(m_node == NULL) +// return; +// +// modest_node_init(modest, m_node); +// +// node->data = (void*)m_node; +//} +// +//int main(int argc, const char * argv[]) { +// setbuf(stdout, NULL); +// +// //char *html_f = "/new/C-git/lexbor/test/test.html"; +// char *html_f = "/new/C-git/habr/1.html"; +// //char *html_f = "/new/C-git/HTML_BENTCHMARK/booking.com.html"; +// +// //char *css_f = "/new/C-git/habr/1_glob.css"; +// char *css_f = "/new/C-git/CSS_BENCHMARK/baseguide.css"; +// +// //char *css_f = "/new/C-git/bootstrap.css"; +// +// char *html = "Привет UTF8!

"; +// char *css = ".radio input[type=\"radio\"]:checked + label::before {} .checkbox input[type=\"checkbox\"]:checked + label::before {}"; +// +// char *selector = "menu"; +// +// modest_t *modest = modest_create(); +// modest_init(modest); +// +// myhtml_tree_t *myhtml_tree = myhtml(html_f, strlen(html_f), true, false, modest_callback_for_create_mnode, (void*)modest); +// mycss_entry_t *mycss_entry = mycss(css_f, strlen(css_f), true, false); +// +//// myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true, modest_callback_for_create_mnode, (void*)modest); +//// mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, false); +// +// modest->myhtml_tree = myhtml_tree; +// modest->mycss_entry = mycss_entry; +// +// mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(mycss_entry); +// +// /* simple api */ +// uint64_t parse_simple_start = myhtml_hperf_clock(NULL); +// uint64_t parse_simple_stop = myhtml_hperf_clock(NULL); +// +// +// +// /* full api */ +// uint64_t parse_start = myhtml_hperf_clock(NULL); +// +// +// modest_finder_t* finder = modest_finder_create(); +// modest_finder_init(finder); +// +//// threads +// modest_finder_thread_t *finder_thread = modest_finder_thread_create(); +// modest_finder_thread_init(finder, finder_thread, 4); +// +// modest_finder_thread_process(modest, finder_thread, myhtml_tree->node_html, stylesheet->sel_list_first); +// +// finder_thread = modest_finder_thread_destroy(finder_thread, true); +// finder = modest_finder_destroy(finder, true); +// +// +// uint64_t parse_stop = myhtml_hperf_clock(NULL); +// +//// print_tree_after_all(modest, myhtml_tree, myhtml_tree->node_html, mycss_entry); +// +// printf("\n\n------------\nInformation:\n"); +// printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); +// myhtml_hperf_print("\tFound selectors", parse_start, parse_stop, stdout); +// myhtml_hperf_print("\tParse and Found Simple selectors", parse_simple_start, parse_simple_stop, stdout); +// printf("\n"); +// +//// printf("\nPrint result:\n"); +//// for(size_t i = 0; i < full_collection->length; i++) { +//// myhtml_tree_print_node(myhtml_tree, full_collection->list[i], stdout); +//// } +//// printf("\nFound: %zu\n", full_collection->length); +//// printf("\n"); +//// +//// modest_finder_destroy(finder_full, true); +// +// modest = modest_destroy(modest, true); +// +// mycss_t* mycss = mycss_entry->mycss; +// mycss_stylesheet_destroy(stylesheet, true); +// mycss_entry_destroy(mycss_entry, true); +// mycss_destroy(mycss, true); +// +// myhtml_t* myhtml = myhtml_tree->myhtml; +// myhtml_tree_destroy(myhtml_tree); +// myhtml_destroy(myhtml); +>>>>>>> Stashed changes +// +// return 0; +//} +// +<<<<<<< Updated upstream + + + + +======= +// +// +// +// +// +>>>>>>> Stashed changes diff --git a/documents/myhtml_life_cycle.xml b/documents/myhtml_life_cycle.xml deleted file mode 100644 index d2615d0..0000000 --- a/documents/myhtml_life_cycle.xml +++ /dev/null @@ -1 +0,0 @@ -7VvLcuI6EP0alqEsyzbxMpBkZjFJTVVSNXeWChagO8bi2iLAfP2VbMm2kEIAP8g8sgioLUt2d5+jVrcYwMly+ylFq8UDjXA8cJ1oO4C3A9e99iH/LwS7QhD4YSGYpyQqRKASPJGfWAodKV2TCGdaR0ZpzMhKF05pkuAp02QoTelG7zajsT7rCs2xIXiaotiUfiMRW8jXcoNK/hmT+ULNDAL5fi9o+mOe0nUi5xu4cJb/FZeXSI0lXzRboIhuaiJ4N4CTlFJWfFtuJzgWqlVqK+67f+Nq+dwpTtgxN7jFDa8oXstXf9h9fn74wmVfyAzzj8luGovPDeGP7jrPixSjKBu4QcwnGEfklX+di69ATOM6IFDXeLN2Wb4v2ykdM7wV8gVbxlwA+NeMpfQHntCYplyS0IT3HM9IHO+JUEzmCW+mhQXGrzhlhBvvRsqXJIrELOPNgjD8tEJTMeWGe2r5HHUNSaWJUfC2JpIa+4TpErN0x7vIq34orae8G/pFe1P5SmnhRc1PoJQh6Z7zcujKRPyLtJLdYiNDkTjiviubNGULOqcJiu8q6Th3SCwGcHSNcx2ku3+kPG98F42hz5v/YsZ2EppozSgXVaN/oXQlx5jRhMluwDuk4Iyu06l8ZskPDKVzLHtJbIm3OWiEFMeIkVcdqU00Ct12VRrdCAaq3JVL7omYPe96rlpFW+GAs0oY3t9DmIMGpUzNOI1RlpGpEstpQQOrKH9rzyz5rfyB0a7WYUVJwrLayF+FoIIc9HXIKcKtTFyMWBm8fLTjfMDgQY3har4R/LcW5DwW9HUlmehGLEVcsTitrivee+aUlnA7pkfSYuVY4A0GqzmbYkI5ufQaOZhzCjiPZz83hJopRiOD/ICN/IIWyM//6OSHt4TlQw5Dx5ftalTR+opTwt9bWCuf+ChgeiYwYc+41Ex0Grg8A1y3iCEuGe8YzgyTFmGAirvAXoywQCvRb7mdi8hzOIvpZrrgXDeMxJh2xOxbyYBNxvuTZM5FbjsgAUDnKxtIvI5AEhjqfsSbPILmTNSMb0zTvKvaFpTpjd5XZleMExrKLCLggvQfEDE1aga2Kc7IT/RSsrJEFe/tjwf+rVAb55hMqrGmxRjPbAEuE/yjnPY5J6Mrz2KMFnS/t+7C0FS9Y1G924LqFYTe0D0YDh//KN27vmcoP+xK99eWgKi9pbfTvQWwrJag9TD2aE2aq1/+guYG+hsiIuJN6mTdfsh4mMLdjigcXHs6jwBzy9wZh7smkfw6zjyyOHN4MWceGZr8mtIpzngU5xRB3a8XXuz7pterbwJDZR92S1Pf0BydU7AlFRQnXjip4Hq64d3Qr5vO6A/8Zv2h5++5RrOkBTCD0ycs5n8uFg9nFqO5LVV7KxJTva8tfeHX7xW/rmGDYlPgsCJW5Qs6FTbJcCIaKOHDB2gpNJe8ZEVG2jAQSWY0XXLXp/lINL+RsoXIIsmBs+HZefazQ+LSahcMiqFKtqtMYGhJvgOLtb02rB10wtZlozlbv5Umfi8tfT6Xtx6MnJcghnsk0DLXWjPEe64Qk1yxOgt6us1XtfSfKBa+cGPUUoIWLNI1EwNPylKnLa9rTQTbywX1Ghu/EgSTiXPQA05gYl9PDbshMJn42jWxCVrAJuwokirCHoXOS5R4jsOmZaPQeknNjr39eijwR/oQxXPKuyqLnopxH9rneSv+eqd/c04wd0N/OcFYr43KXWDhBNARJ5isXU8hPg7csckav1UO0QOXSyKqSO1XzLvAwKRTeN02nx6tSbOm8wcmEf1LJhG93kJ/7USHDDDqxzkcPQSpznxUUci58HCbRiEKInXYeK1ne462mblAf7cUnM8i/Pe2xOUhtBi94HhcngusqVaeDHzXBE7+ZzWB8koDROXZSPkWg/r5Qhu4nCHQwCWN1jA0DLQxr3z9fjqbZZgZFj0tClPxRbdxv/PhgHnAK44FpnMpYPqK+2tnFOjvhEvllM1xeeUMXR1EoBkyWwUfNOvEj5jjiq/JRSDCaqlo/pF3caIcO/ddxiCwpxik12KRF3ZDdR89BimB1rAW5VlOBrRPgmflNrxgpPlV2/lL9epH7yAUcEmmANv7PqIrDHuOruteMQx7w/CFCr6ea4IMdpOJPBVkwYkFX//Egu9+/7YLvp7tIEuBymyFEoXJm9UqzpW5jsVux15t5HPV77EQwYzT72+fQ+i1WOy1WqLou0R4KGdxNjN0tPwa0Bzt/WrBG+3VKIqHalyjGHVch1Q6/FtzOATyHuuQvFn9XLMwaPWTWHj3Pw== \ No newline at end of file diff --git a/documents/myhtml_life_cycle_with_thread.png b/documents/myhtml_life_cycle_with_thread.png deleted file mode 100644 index 424d4a7..0000000 Binary files a/documents/myhtml_life_cycle_with_thread.png and /dev/null differ diff --git a/documents/myhtml_life_cycle_without_threads.png b/documents/myhtml_life_cycle_without_threads.png deleted file mode 100644 index 336e2e0..0000000 Binary files a/documents/myhtml_life_cycle_without_threads.png and /dev/null differ diff --git a/documents/myhtml_life_cycle_without_threads.xml b/documents/myhtml_life_cycle_without_threads.xml deleted file mode 100644 index b524636..0000000 --- a/documents/myhtml_life_cycle_without_threads.xml +++ /dev/null @@ -1 +0,0 @@ -3VhLc5swEP41HONBYGP76EfSHJJOZpKZtkcFZFAjIyrk2OTXdwUSDwsnmdjOtPHBoI/VStrdb3fB8Rfr3TeBs+SWR4Q5nhvtHH/peN4U+fCvgKICxoFbAbGgUQWhBrinL0SDRmxDI5J3BCXnTNKsC4Y8TUkoOxgWgm+7YivOuqtmOCYWcB9iZqM/aCSTCp14QYNfExonZmUUTKsnjzh8igXfpHo9x/NX5a96vMZGlz5onuCIb1uQf+n4C8G5rO7WuwVhyrTGbNW8qwNP630Lksr3TPCqCc+YbYjZccBg6jyiz2p/stA2Cf5s1KbmkuzkBWY0Th1/BhKiNEP9GO5ifS3V5BlODXZbXD/c3sCcG7oicFkUIVPXLZUJ34AS9yERBEe5mQz7bs9vweXuuuiRG0bKSp6LgkOreB3tnlILeCLXDACkjioFfyILzrgAJOUpSM5XlLE9SO9lychKaXgmQlIIvZmG1zSK1CLzbUIluc9wqFbcAs/qbagpZHfQ5agOJOAn4WsiRQEiesJoomNPc9M3sbhtIr2Oz6QV5b7GsCZXXKtuAgxudIz1x9vYsiOJgHl6yAUEQsxTzC4bdF7SiSgFbtfgcGBR/NR4OfilBoMRDH8TKQudWPBGcoAa7TecZ1rHiqdSi6FhbWC1qdfNC2fgGxFqKZ3uJBYx0VJBvxMEYVjS5672YyzqH83gEE5GhM2IB4jmFEwj3smIxk/oQPS2fGdIoBfXjtDK3IOOOSry/UnQifzx2Ap81Bf4wQkCf/SvBz7ZUVmqHEzdkR43WtXojggK51beKhf+GFWGNlX8I6lSTp0JgYuWQMZpKnPLRbX+d3ltaJFriSUGZF5IklsurSqA6RjQXnlIcKbk1rtY9UyDFePbMMFCDiKls58x+16yaAP1MaRpDJB3GpJ4rv8mSYbnIsmZykMVwjVPyloNhp+pTrGpyyV2RdXuNLEiIxEynOc0rEAtgj5INk+PTVcALaJb/j5MqcCmFBp/UvkJLIZ8J9uyXYficVyJsNn0JhtO0R4Fb8f/uYrE1DJm1RBXdfoWU9uidhsqSE5f8GNdSHUiBOnR3BktldkgUnNtxrf7Uami2OSZhzKkL4bnKdBo2LW9P7Vt7/bY3jtF7pmcNPeYampXUpOVkGPV7i+VldDYTktDt9//J09LZvEWle4ED0kORdutavj/n5rQZPJ5uWk0PQs/Bp1e85Wqjb4aP0wTdcpO+L3ONGv3vDW2P7jMsoyV62+Y6nYDvFY8SB/zrPs1pu8jTetNcQUWqzuC079Kvk5G70xk3H+ZPCcZYdh8EqxeY5rPrv7lXw== \ No newline at end of file diff --git a/examples/Makefile b/examples/Makefile index 48b161e..d919f52 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -1,49 +1,84 @@ TARGET := examples -SRCDIR := examples +SRCDIR := . CC ?= gcc -LIBS := ../lib/libmodest_static.a -LDLIBS := $(LIBS) -INCLUDE_TMP := include +# ARGS +# +# BINARY_OPTIMIZATION_LEVEL, default -O2 +# MODEST_BUILD_WITHOUT_THREADS, YES or (NO or undefined), default undefined +# -MODEST_OPTIMIZATION_LEVEL ?= -O2 +.DEFAULT_GOAL := all -CFLAGS ?= -Wall -Werror -CFLAGS += $(MODEST_OPTIMIZATION_LEVEL) -Wno-unused-variable -fPIC --std=c99 -I../include +#******************** +# other Makefile +#*************** +BINARY_PATH_RELATIVE := .. +MODEST_SOURCE := $(BINARY_PATH_RELATIVE)/source +include $(BINARY_PATH_RELATIVE)/Makefile.bin.cfg -MODEST_BUILD_WITHOUT_THREADS ?= NO -ifeq ($(MODEST_BUILD_WITHOUT_THREADS),YES) - $(info Build Examples without POSIX Threads) -else - $(info Build Examples with POSIX Threads) - CFLAGS += -pthread -endif +BINARY_TO_DIR := $(BINARY_PATH_RELATIVE)/$(BINARY_DIR_BASE) -ifeq ($(OS),Windows_NT) -else - UNAM := $(shell uname -s) - ifeq ($(UNAM),Darwin) - else - CFLAGS += -D_POSIX_C_SOURCE=199309L - endif -endif +#******************** +# Build +#*************** +BINARY_BUILD_MODULES ?= $(dir $(wildcard $(SRCDIR)/*/)) +BINARY_BUILD_MODULES_LIST := $(strip $(foreach dir,$(BINARY_BUILD_MODULES),$(word 2, $(subst $(MODEST_DIR_SEPARATOR), , $(dir))) )) +BINARY_BUILD_MODULES_MAKEFILES_LIST := $(foreach dir,$(BINARY_BUILD_MODULES_LIST),$(dir)/Makefile.mk) -find_files_h = $(wildcard $(dir)/*.h) -find_files_c = $(wildcard $(dir)/*.c) +#******************** +# Targets +#*************** +BINARY_BUILD_MODULES_TARGET := $(BINARY_BUILD_MODULES_LIST) +BINARY_BUILD_MODULES_TARGET_ALL := $(foreach dir,$(BINARY_BUILD_MODULES_TARGET),$(dir)_all) +BINARY_BUILD_MODULES_TARGET_CLEAN := $(foreach dir,$(BINARY_BUILD_MODULES_TARGET),$(dir)_clean) -SUBDIRS := selectors declarations myfont modest mycss myhtml -HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) -SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) +#******************** +# Utils +#*************** +define BYNARY_UTILS_NEW_LINE -OBJS := $(patsubst %.c,%,$(SRCS)) -all: $(TARGET) +endef +BINARY_UTILS_OBJS = $(patsubst %.c,%,$(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.c))) +BINARY_UTILS_CREATE_DIRS = $(foreach dir,$(BINARY_BUILD_MODULES_LIST),mkdir -p $(BINARY_TO_DIR)/$(dir) $(BYNARY_UTILS_NEW_LINE)) -$(TARGET): $(OBJS) - cp -r $(OBJS) ../bin/ +#******************** +# Include all modules Makefile.mk +#*************** +include $(BINARY_BUILD_MODULES_MAKEFILES_LIST) -clean: - rm -f $(OBJS) +#******************** +# Set ARGS for flags +#*************** +override CFLAGS += $(BINARY_CFLAGS) +override LDFLAGS += $(BINARY_LDFLAGS) +override LDLIBS += $(BINARY_LIBRARIES) -.PHONY: all \ No newline at end of file +#******************** +# Objects +#*************** +BINARY_BUILD_EXECUTE ?= $(foreach dir,$(BINARY_BUILD_MODULES_TARGET),$($(dir)_objs)) +BINARY_BUILD_EXECUTE_CLEAN := $(foreach path,$(BINARY_BUILD_EXECUTE),$(subst ./,,$(path))) +BINARY_BUILD_EXECUTE_TO_CLEAN := $(foreach path,$(BINARY_BUILD_EXECUTE_CLEAN),rm -rf $(BINARY_TO_DIR)/$(path) $(BYNARY_UTILS_NEW_LINE)) +BINARY_BUILD_DIRS_TO_CLEAN := $(foreach path,$(BINARY_BUILD_MODULES_LIST),rm -rf $(BINARY_TO_DIR)/$(path) $(BYNARY_UTILS_NEW_LINE)) +BINARY_BUILD_EXECUTE_COPY := $(foreach path,$(BINARY_BUILD_EXECUTE_CLEAN),cp $(path) $(BINARY_TO_DIR)/$(dir $(path)) $(BYNARY_UTILS_NEW_LINE)) +BINARY_BUILD_EXECUTE_COPY_ALL := $(BINARY_UTILS_CREATE_DIRS) $(BINARY_BUILD_EXECUTE_COPY) + +#******************** +# Target options +#*************** +all: build + $(BINARY_BUILD_EXECUTE_COPY_ALL) + +build: $(BINARY_BUILD_EXECUTE_CLEAN) + +clean: $(BINARY_BUILD_MODULES_TARGET_CLEAN) + $(BINARY_BUILD_EXECUTE_TO_CLEAN) + $(BINARY_BUILD_DIRS_TO_CLEAN) + +copy: + $(BINARY_BUILD_EXECUTE_COPY_ALL) + +.PHONY: all copy clean $(BINARY_BUILD_MODULES_TARGET_ALL) diff --git a/examples/modest/Makefile.mk b/examples/modest/Makefile.mk new file mode 100644 index 0000000..6527ed1 --- /dev/null +++ b/examples/modest/Makefile.mk @@ -0,0 +1,7 @@ +modest_dirs := . +modest_objs := $(call BINARY_UTILS_OBJS,modest,$(modest_dirs)) + +modest_all: $(modest_objs) + +modest_clean: + rm -f $(modest_objs) diff --git a/examples/modest/css_property_to_node.c b/examples/modest/css_property_to_node.c index c58e339..faf356d 100644 --- a/examples/modest/css_property_to_node.c +++ b/examples/modest/css_property_to_node.c @@ -31,7 +31,7 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size, myhtml_callback_tree_node_f cai, void* cai_ctx) { myhtml_t* myhtml = myhtml_create(); - myhtml_status_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); + mystatus_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); check_status("Can't init MyHTML object\n"); @@ -42,7 +42,7 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size, myhtml_callback_t myhtml_callback_tree_node_insert_set(tree, cai, cai_ctx); - status = myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + status = myhtml_parse(tree, MyENCODING_UTF_8, data, data_size); check_status("Can't parse HTML:\n%s\n", data); return tree; @@ -52,7 +52,7 @@ mycss_entry_t * parse_css(const char* data, size_t data_size) { // base init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); check_status("Can't init MyCSS object\n"); @@ -62,15 +62,16 @@ mycss_entry_t * parse_css(const char* data, size_t data_size) check_status("Can't init MyCSS Entry object\n"); - status = mycss_parse(entry, MyHTML_ENCODING_UTF_8, data, data_size); + status = mycss_parse(entry, MyENCODING_UTF_8, data, data_size); check_status("Can't parse CSS:\n%s\n", data); return entry; } -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } void print_result(modest_t* modest, myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* scope_node, mycss_entry_t *mycss_entry) @@ -111,7 +112,7 @@ int main(int argc, const char * argv[]) /* init Modest */ modest_t *modest = modest_create(); - modest_status_t status = modest_init(modest); + mystatus_t status = modest_init(modest); check_status("Can't init Modest object\n"); diff --git a/examples/modest/css_real_and_default_property_to_node.c b/examples/modest/css_real_and_default_property_to_node.c index 59f5ab0..35f9d68 100644 --- a/examples/modest/css_real_and_default_property_to_node.c +++ b/examples/modest/css_real_and_default_property_to_node.c @@ -29,15 +29,16 @@ #define DIE(msg, ...) do { fprintf(stderr, msg, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define check_status(msg, ...) do {if(status) DIE(msg, ##__VA_ARGS__);} while(0) -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } myhtml_tree_t * parse_html(const char* data, size_t data_size, myhtml_callback_tree_node_f cai, void* cai_ctx) { myhtml_t* myhtml = myhtml_create(); - myhtml_status_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); + mystatus_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); check_status("Can't init MyHTML object\n"); @@ -48,7 +49,7 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size, myhtml_callback_t myhtml_callback_tree_node_insert_set(tree, cai, cai_ctx); - status = myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + status = myhtml_parse(tree, MyENCODING_UTF_8, data, data_size); check_status("Can't parse HTML:\n%s\n", data); return tree; @@ -58,7 +59,7 @@ mycss_entry_t * parse_css(const char* data, size_t data_size) { // base init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); check_status("Can't init MyCSS object\n"); @@ -68,7 +69,7 @@ mycss_entry_t * parse_css(const char* data, size_t data_size) check_status("Can't init MyCSS Entry object\n"); - status = mycss_parse(entry, MyHTML_ENCODING_UTF_8, data, data_size); + status = mycss_parse(entry, MyENCODING_UTF_8, data, data_size); check_status("Can't parse CSS:\n%s\n", data); return entry; @@ -108,7 +109,7 @@ int main(int argc, const char * argv[]) /* init Modest */ modest_t *modest = modest_create(); - modest_status_t status = modest_init(modest); + mystatus_t status = modest_init(modest); check_status("Can't init Modest object\n"); diff --git a/examples/modest/selectors_find_nodes_low_level.c b/examples/modest/selectors_find_nodes_low_level.c index 1879c49..94395e1 100644 --- a/examples/modest/selectors_find_nodes_low_level.c +++ b/examples/modest/selectors_find_nodes_low_level.c @@ -32,19 +32,22 @@ #define DIE(msg, ...) do { fprintf(stderr, msg, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define CHECK_STATUS(msg, ...) do {if(status) DIE(msg, ##__VA_ARGS__);} while(0) -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } -void serialization_bad_selectors(const char* buffer, size_t size, void* ctx) { +mystatus_t serialization_bad_selectors(const char* buffer, size_t size, void* ctx) +{ printf("%.*s", (int)size, buffer); + return MyCORE_STATUS_OK; } myhtml_tree_t * parse_html(const char* data, size_t data_size) { myhtml_t* myhtml = myhtml_create(); - myhtml_status_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); + mystatus_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); CHECK_STATUS("Can't init MyHTML object\n"); @@ -53,7 +56,7 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size) CHECK_STATUS("Can't init MyHTML Tree object\n"); - status = myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + status = myhtml_parse(tree, MyENCODING_UTF_8, data, data_size); CHECK_STATUS("Can't parse HTML:\n%s\n", data); return tree; @@ -63,7 +66,7 @@ mycss_entry_t * create_css_parser(void) { // base init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); CHECK_STATUS("Can't init MyCSS object\n"); @@ -78,9 +81,9 @@ mycss_entry_t * create_css_parser(void) mycss_selectors_list_t * prepare_selector(mycss_entry_t *css_entry, const char* selector, size_t selector_size) { - mycss_status_t out_status; + mystatus_t out_status; mycss_selectors_list_t *list = mycss_selectors_parse(mycss_entry_selectors(css_entry), - MyHTML_ENCODING_UTF_8, + MyENCODING_UTF_8, selector, selector_size, &out_status); /* check parsing errors */ diff --git a/examples/modest/selectors_prepare_low_level.c b/examples/modest/selectors_prepare_low_level.c index b8c313b..39b7e58 100644 --- a/examples/modest/selectors_prepare_low_level.c +++ b/examples/modest/selectors_prepare_low_level.c @@ -29,13 +29,16 @@ #include #include -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } -void serialization_bad_selectors(const char* buffer, size_t size, void* ctx) { - printf("%.*s", (int)size, buffer); +mystatus_t serialization_bad_selectors(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } myhtml_tree_t * parse_html(myhtml_t* myhtml, const char* data, size_t data_size) @@ -43,7 +46,7 @@ myhtml_tree_t * parse_html(myhtml_t* myhtml, const char* data, size_t data_size) myhtml_tree_t* tree = myhtml_tree_create(); myhtml_tree_init(tree, myhtml); - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + myhtml_parse(tree, MyENCODING_UTF_8, data, data_size); return tree; } @@ -52,7 +55,7 @@ mycss_entry_t * create_css_parser(void) { // base init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); if(status) { fprintf(stderr, "Can't init CSS Parser\n"); @@ -73,9 +76,9 @@ mycss_entry_t * create_css_parser(void) mycss_selectors_list_t * prepare_selector(mycss_entry_t *css_entry, const char* selector, size_t selector_size) { - mycss_status_t out_status; + mystatus_t out_status; mycss_selectors_list_t *list = mycss_selectors_parse(mycss_entry_selectors(css_entry), - MyHTML_ENCODING_UTF_8, selector, selector_size, + MyENCODING_UTF_8, selector, selector_size, &out_status); /* check parsing errors */ if(list == NULL || (list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD)) { diff --git a/examples/modest/style_attr_low_level.c b/examples/modest/style_attr_low_level.c index 7ee96a7..549c8b3 100644 --- a/examples/modest/style_attr_low_level.c +++ b/examples/modest/style_attr_low_level.c @@ -33,15 +33,16 @@ #define DIE(msg, ...) do { fprintf(stderr, msg, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0) #define CHECK_STATUS(msg, ...) do {if(status) DIE(msg, ##__VA_ARGS__);} while(0) -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } myhtml_tree_t * parse_html(const char* data, size_t data_size) { myhtml_t* myhtml = myhtml_create(); - myhtml_status_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); + mystatus_t status = myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); CHECK_STATUS("Can't init MyHTML object\n"); @@ -50,7 +51,7 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size) CHECK_STATUS("Can't init MyHTML Tree object\n"); - status = myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); + status = myhtml_parse(tree, MyENCODING_UTF_8, data, data_size); CHECK_STATUS("Can't parse HTML:\n%s\n", data); return tree; @@ -60,7 +61,7 @@ mycss_entry_t * create_css_parser(void) { // base init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); CHECK_STATUS("Can't init MyCSS object\n"); @@ -101,7 +102,7 @@ void parse_style_of_node_and_print(myhtml_tree_t *html_tree, mycss_entry_t *css_ myhtml_tree_attr_t *attr_style = myhtml_attribute_by_key(node, "style", 5); if(attr_style) { - mycss_declaration_entry_t *dec_entry = mycss_declaration_parse(css_entry->declaration, MyHTML_ENCODING_UTF_8, + mycss_declaration_entry_t *dec_entry = mycss_declaration_parse(css_entry->declaration, MyENCODING_UTF_8, attr_style->value.data, attr_style->value.length, NULL); if(dec_entry) { diff --git a/examples/mycss/Makefile.mk b/examples/mycss/Makefile.mk new file mode 100644 index 0000000..47db8cd --- /dev/null +++ b/examples/mycss/Makefile.mk @@ -0,0 +1,7 @@ +mycss_dirs := . +mycss_objs := $(call BINARY_UTILS_OBJS,mycss,$(mycss_dirs)) + +mycss_all: $(mycss_objs) + +mycss_clean: + rm -f $(mycss_objs) diff --git a/examples/mycss/css_low_level.c b/examples/mycss/css_low_level.c index 0732853..199bb88 100644 --- a/examples/mycss/css_low_level.c +++ b/examples/mycss/css_low_level.c @@ -24,6 +24,8 @@ #include +#include "example.h" + struct res_data { char *data; size_t size; @@ -62,7 +64,7 @@ struct res_data load_data_file(const char* filename) size_t nread = fread(data, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -72,9 +74,10 @@ struct res_data load_data_file(const char* filename) return res; } -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } int main(int argc, const char * argv[]) @@ -93,14 +96,14 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // current entry work init mycss_entry_t *entry = mycss_entry_create(); status = mycss_entry_init(mycss, entry); // parse selectors - status = mycss_parse(entry, MyHTML_ENCODING_UTF_8, res.data, res.size); + status = mycss_parse(entry, MyENCODING_UTF_8, res.data, res.size); if(status) { fprintf(stderr, "Parse error!\n"); diff --git a/examples/mycss/declaration_low_level.c b/examples/mycss/declaration_low_level.c index 030da3b..9d2aaf9 100644 --- a/examples/mycss/declaration_low_level.c +++ b/examples/mycss/declaration_low_level.c @@ -25,9 +25,10 @@ #include #include -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } int main(int argc, const char * argv[]) @@ -36,7 +37,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -50,8 +51,8 @@ int main(int argc, const char * argv[]) printf("\t%s", declaration); printf("\n"); - mycss_status_t out_status; - mycss_declaration_entry_t *dec_entry = mycss_declaration_parse(entry->declaration, MyHTML_ENCODING_UTF_8, + mystatus_t out_status; + mycss_declaration_entry_t *dec_entry = mycss_declaration_parse(entry->declaration, MyENCODING_UTF_8, declaration, strlen(declaration), &out_status); /* print result */ diff --git a/examples/mycss/detect_charset_encoding_high_level.c b/examples/mycss/detect_charset_encoding_high_level.c index 247adda..3fdf53e 100644 --- a/examples/mycss/detect_charset_encoding_high_level.c +++ b/examples/mycss/detect_charset_encoding_high_level.c @@ -28,9 +28,9 @@ int main(int argc, const char * argv[]) { char *css = "@charset \"cp1251\"; #best-id {}"; - myhtml_encoding_t encoding = mycss_encoding_check_charset_rule(css, strlen(css)); + myencoding_t encoding = mycss_encoding_check_charset_rule(css, strlen(css)); - if(encoding == MyHTML_ENCODING_WINDOWS_1251) + if(encoding == MyENCODING_WINDOWS_1251) printf("Detected Encoding: windows-1251\n"); else printf("Detected Encoding: something wrong\n"); diff --git a/examples/mycss/example.h b/examples/mycss/example.h new file mode 100644 index 0000000..c6b1dbd --- /dev/null +++ b/examples/mycss/example.h @@ -0,0 +1,32 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: vincent.torri@gmail.com (Vincent Torri) +*/ + +#ifndef MyCSS_EXAMPLE_EXAMPLE_H +#define MyCSS_EXAMPLE_EXAMPLE_H +#pragma once + +/* Format */ +#ifdef _WIN32 + #define MyCORE_FMT_Z "%Iu" +#else + #define MyCORE_FMT_Z "%zu" +#endif + +#endif /* MyCSS_EXAMPLE_EXAMPLE_H */ diff --git a/examples/mycss/incoming_buffer_high_level.c b/examples/mycss/incoming_buffer_high_level.c index dc63fba..3feca2a 100644 --- a/examples/mycss/incoming_buffer_high_level.c +++ b/examples/mycss/incoming_buffer_high_level.c @@ -24,6 +24,8 @@ #include +#include "example.h" + // see tokenizer_buffer_high_level mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) @@ -32,21 +34,21 @@ mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) size_t tokens_count = mycss_entry_token_count(entry); mycss_token_type_t token_type = mycss_token_type(token); - printf("Token %zu; %s; \"", tokens_count, mycss_token_name_by_type(token_type)); + printf("Token " MyCORE_FMT_Z "; %s; \"", tokens_count, mycss_token_name_by_type(token_type)); // print data - myhtml_incoming_buffer_t *buffer = mycss_entry_incoming_buffer_current(entry); - buffer = myhtml_incoming_buffer_find_by_position(buffer, mycss_token_begin(token)); + mycore_incoming_buffer_t *buffer = mycss_entry_incoming_buffer_current(entry); + buffer = mycore_incoming_buffer_find_by_position(buffer, mycss_token_begin(token)); // size_t absolute_begin = mycss_token_begin(token); - size_t relative_begin = absolute_begin - myhtml_incoming_buffer_offset(buffer); + size_t relative_begin = absolute_begin - mycore_incoming_buffer_offset(buffer); size_t length = mycss_token_length(token); // if token data length in one buffer then print them all at once - if((relative_begin + length) <= myhtml_incoming_buffer_size(buffer)) + if((relative_begin + length) <= mycore_incoming_buffer_size(buffer)) { - const char *data = myhtml_incoming_buffer_data(buffer); + const char *data = mycore_incoming_buffer_data(buffer); printf("%.*s\"\n", (int)length, &data[relative_begin]); return token; @@ -54,17 +56,17 @@ mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) // if the data are spread across multiple buffers that join them while(buffer) { - const char *data = myhtml_incoming_buffer_data(buffer); + const char *data = mycore_incoming_buffer_data(buffer); - if((relative_begin + length) > myhtml_incoming_buffer_size(buffer)) + if((relative_begin + length) > mycore_incoming_buffer_size(buffer)) { - size_t relative_end = (myhtml_incoming_buffer_size(buffer) - relative_begin); + size_t relative_end = (mycore_incoming_buffer_size(buffer) - relative_begin); length -= relative_end; printf("%.*s", (int)relative_end, &data[relative_begin]); relative_begin = 0; - buffer = myhtml_incoming_buffer_next(buffer); + buffer = mycore_incoming_buffer_next(buffer); } else { printf("%.*s", (int)length, &data[relative_begin]); @@ -86,7 +88,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -98,8 +100,8 @@ int main(int argc, const char * argv[]) // set custom callback for token is ready mycss_entry_token_ready_callback(entry, token_ready_callback); - // this is example, you can not specify, dy default MyHTML_ENCODING_UTF_8 - mycss_encoding_set(entry, MyHTML_ENCODING_UTF_8); + // this is example, you can not specify, dy default MyENCODING_UTF_8 + mycss_encoding_set(entry, MyENCODING_UTF_8); // parse css chunks mycss_parse_chunk(entry, css_chunk_1, strlen(css_chunk_1)); diff --git a/examples/mycss/selectors_low_level.c b/examples/mycss/selectors_low_level.c index df91be8..0137adb 100644 --- a/examples/mycss/selectors_low_level.c +++ b/examples/mycss/selectors_low_level.c @@ -25,9 +25,10 @@ #include #include -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } int main(int argc, const char * argv[]) @@ -36,7 +37,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -50,8 +51,8 @@ int main(int argc, const char * argv[]) printf("\t%s", selector); printf("\n"); - mycss_status_t out_status; - mycss_selectors_list_t *list = mycss_selectors_parse(entry->selectors, MyHTML_ENCODING_UTF_8, selector, strlen(selector), &out_status); + mystatus_t out_status; + mycss_selectors_list_t *list = mycss_selectors_parse(entry->selectors, MyENCODING_UTF_8, selector, strlen(selector), &out_status); /* print result */ printf("Result:\n\t"); diff --git a/examples/mycss/stylesheet_low_level.c b/examples/mycss/stylesheet_low_level.c index 2e19abe..92369cb 100644 --- a/examples/mycss/stylesheet_low_level.c +++ b/examples/mycss/stylesheet_low_level.c @@ -24,9 +24,10 @@ #include -void serialization_callback(const char* data, size_t len, void* ctx) +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) { printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } int main(int argc, const char * argv[]) @@ -39,7 +40,7 @@ body > div[id*=mu i]:not(:nth-child(2n+1)) {width: 1.4%}"; // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -53,7 +54,7 @@ body > div[id*=mu i]:not(:nth-child(2n+1)) {width: 1.4%}"; printf("%s", css); printf("\n\n"); - status = mycss_parse(entry, MyHTML_ENCODING_UTF_8, css, strlen(css)); + status = mycss_parse(entry, MyENCODING_UTF_8, css, strlen(css)); /* print result */ printf("Result:\n"); diff --git a/examples/mycss/token_type_convert_high_level.c b/examples/mycss/token_type_convert_high_level.c index 9767854..6f4ece9 100644 --- a/examples/mycss/token_type_convert_high_level.c +++ b/examples/mycss/token_type_convert_high_level.c @@ -24,31 +24,33 @@ #include +#include "example.h" + mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true); if(mycss_token_type(token) == MyCSS_TOKEN_TYPE_NUMBER) { double return_num; - mycss_convert_data_to_double(myhtml_string_data(&str), myhtml_string_length(&str), &return_num, NULL); + mycss_convert_data_to_double(mycore_string_data(&str), mycore_string_length(&str), &return_num, NULL); - printf("Number %s: %f\n", myhtml_string_data(&str), return_num); + printf("Number %s: %f\n", mycore_string_data(&str), return_num); } else if(mycss_token_type(token) == MyCSS_TOKEN_TYPE_UNICODE_RANGE) { size_t start, end; - mycss_convert_unicode_range_to_codepoint(myhtml_string_data(&str), myhtml_string_length(&str), + mycss_convert_unicode_range_to_codepoint(mycore_string_data(&str), mycore_string_length(&str), &start, &end); if(end) - printf("Unicode range U+%s: %zu-%zu\n", myhtml_string_data(&str), start, end); + printf("Unicode range U+%s: " MyCORE_FMT_Z "-" MyCORE_FMT_Z "\n", mycore_string_data(&str), start, end); else - printf("Unicode range U+%s: %zu\n", myhtml_string_data(&str), start); + printf("Unicode range U+%s: " MyCORE_FMT_Z "\n", mycore_string_data(&str), start); } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return token; } @@ -59,7 +61,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -72,7 +74,7 @@ int main(int argc, const char * argv[]) mycss_entry_token_ready_callback(entry, token_ready_callback); // parse css - mycss_parse(entry, MyHTML_ENCODING_UTF_8, css, strlen(css)); + mycss_parse(entry, MyENCODING_UTF_8, css, strlen(css)); // release resurces mycss_entry_destroy(entry, true); diff --git a/examples/mycss/tokenizer_buffer_high_level.c b/examples/mycss/tokenizer_buffer_high_level.c index b47f254..4945a34 100644 --- a/examples/mycss/tokenizer_buffer_high_level.c +++ b/examples/mycss/tokenizer_buffer_high_level.c @@ -24,20 +24,22 @@ #include +#include "example.h" + mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) { // print token name size_t tokens_count = mycss_entry_token_count(entry); mycss_token_type_t token_type = mycss_token_type(token); - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true); - printf("Token %zu; %s; \"%s\"\n", tokens_count, + printf("Token " MyCORE_FMT_Z "; %s; \"%s\"\n", tokens_count, mycss_token_name_by_type(token_type), - myhtml_string_data(&str)); + mycore_string_data(&str)); - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return token; } @@ -50,7 +52,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -62,8 +64,8 @@ int main(int argc, const char * argv[]) // set custom callback for token is ready mycss_entry_token_ready_callback(entry, token_ready_callback); - // this is example, you can not specify, dy default MyHTML_ENCODING_UTF_8 - mycss_encoding_set(entry, MyHTML_ENCODING_UTF_8); + // this is example, you can not specify, dy default MyENCODING_UTF_8 + mycss_encoding_set(entry, MyENCODING_UTF_8); // parse css chunks mycss_parse_chunk(entry, css_chunk_1, strlen(css_chunk_1)); diff --git a/examples/mycss/tokenizer_chunk_high_level.c b/examples/mycss/tokenizer_chunk_high_level.c index e319095..be12438 100644 --- a/examples/mycss/tokenizer_chunk_high_level.c +++ b/examples/mycss/tokenizer_chunk_high_level.c @@ -24,12 +24,14 @@ #include +#include "example.h" + mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) { size_t tokens_count = mycss_entry_token_count(entry); mycss_token_type_t token_type = mycss_token_type(token); - printf("Token %zu: <%s>\n", tokens_count, mycss_token_name_by_type(token_type)); + printf("Token " MyCORE_FMT_Z ": <%s>\n", tokens_count, mycss_token_name_by_type(token_type)); return token; } @@ -42,7 +44,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -54,8 +56,8 @@ int main(int argc, const char * argv[]) // set custom callback for token is ready mycss_entry_token_ready_callback(entry, token_ready_callback); - // this is example, you can not specify, dy default MyHTML_ENCODING_UTF_8 - mycss_encoding_set(entry, MyHTML_ENCODING_UTF_8); + // this is example, you can not specify, dy default MyENCODING_UTF_8 + mycss_encoding_set(entry, MyENCODING_UTF_8); // parse css chunks mycss_parse_chunk(entry, css_chunk_1, strlen(css_chunk_1)); diff --git a/examples/mycss/tokenizer_high_level.c b/examples/mycss/tokenizer_high_level.c index a42282d..e99a68b 100644 --- a/examples/mycss/tokenizer_high_level.c +++ b/examples/mycss/tokenizer_high_level.c @@ -24,12 +24,14 @@ #include +#include "example.h" + mycss_token_t * token_ready_callback(mycss_entry_t* entry, mycss_token_t* token) { size_t tokens_count = mycss_entry_token_count(entry); mycss_token_type_t token_type = mycss_token_type(token); - printf("Token %zu: <%s>\n", tokens_count, mycss_token_name_by_type(token_type)); + printf("Token " MyCORE_FMT_Z ": <%s>\n", tokens_count, mycss_token_name_by_type(token_type)); return token; } @@ -40,7 +42,7 @@ int main(int argc, const char * argv[]) // basic init mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); + mystatus_t status = mycss_init(mycss); // check initialization if (MyCSS_FAILED(status)) return EXIT_FAILURE; @@ -53,7 +55,7 @@ int main(int argc, const char * argv[]) mycss_entry_token_ready_callback(entry, token_ready_callback); // parse css - mycss_parse(entry, MyHTML_ENCODING_UTF_8, css, strlen(css)); + mycss_parse(entry, MyENCODING_UTF_8, css, strlen(css)); // release resurces mycss_entry_destroy(entry, true); diff --git a/examples/myencoding/Makefile.mk b/examples/myencoding/Makefile.mk new file mode 100644 index 0000000..0da1183 --- /dev/null +++ b/examples/myencoding/Makefile.mk @@ -0,0 +1,7 @@ +myencoding_dirs := . +myencoding_objs := $(call BINARY_UTILS_OBJS,myencoding,$(myencoding_dirs)) + +myencoding_all: $(myencoding_objs) + +myencoding_clean: + rm -f $(myencoding_objs) diff --git a/examples/myencoding/detect_encoding_by_trigrams.c b/examples/myencoding/detect_encoding_by_trigrams.c new file mode 100644 index 0000000..70ba0ac --- /dev/null +++ b/examples/myencoding/detect_encoding_by_trigrams.c @@ -0,0 +1,131 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +#include + +#include "example.h" + +struct res_html { + char *html; + size_t size; +}; + +struct res_html load_html_file(const char* filename) +{ + FILE *fh = fopen(filename, "rb"); + if(fh == NULL) { + fprintf(stderr, "Can't open html file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(fseek(fh, 0L, SEEK_END) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + long size = ftell(fh); + + if(fseek(fh, 0L, SEEK_SET) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(size <= 0) { + fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); + exit(EXIT_FAILURE); + } + + char *html = (char*)malloc(size + 1); + if(html == NULL) { + fprintf(stderr, "Can't allocate mem for html file: %s\n", filename); + exit(EXIT_FAILURE); + } + + size_t nread = fread(html, 1, size, fh); + if (nread != size) { + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); + exit(EXIT_FAILURE); + } + + fclose(fh); + + struct res_html res = {html, (size_t)size}; + return res; +} + +void print_encoding(myencoding_t encoding) +{ + printf("Character encoding is "); + + switch (encoding) { + case MyENCODING_UTF_8: printf("UTF-8"); break; + case MyENCODING_UTF_16LE: printf("UTF_16LE"); break; + case MyENCODING_UTF_16BE: printf("UTF_16BE"); break; + case MyENCODING_KOI8_R: printf("KOI8_R"); break; + case MyENCODING_WINDOWS_1251: printf("WINDOWS_1251"); break; + case MyENCODING_X_MAC_CYRILLIC: printf("X_MAC_CYRILLIC"); break; + case MyENCODING_IBM866: printf("IBM866"); break; + case MyENCODING_ISO_8859_5: printf("ISO_8859_5"); break; + default: + printf("UNKNOWN"); + break; + } + + printf("\n"); +} + +int main(int argc, const char * argv[]) +{ + const char* path; + + if (argc == 2) { + path = argv[1]; + } + else { + printf("Bad ARGV!\nUse: detect_encoding_high_level \n"); + exit(EXIT_FAILURE); + } + + struct res_html res = load_html_file(path); + + myencoding_t encoding; + + // try detect by BOM + if (myencoding_detect_bom(res.html, res.size, &encoding)) { + print_encoding(encoding); + } else if (myencoding_detect(res.html, res.size, &encoding)) { + print_encoding(encoding); + } else if (encoding != MyENCODING_DEFAULT) { + printf("It is possible that "); + print_encoding(encoding); + } else { + printf("I could not identify character encoding\n"); + } + + free(res.html); + return 0; +} + + + + diff --git a/examples/myencoding/detect_encoding_in_meta.c b/examples/myencoding/detect_encoding_in_meta.c new file mode 100644 index 0000000..e2e652d --- /dev/null +++ b/examples/myencoding/detect_encoding_in_meta.c @@ -0,0 +1,102 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +#include + +#include "example.h" + +struct res_html { + char *html; + size_t size; +}; + +struct res_html load_html_file(const char* filename) +{ + FILE *fh = fopen(filename, "rb"); + if(fh == NULL) { + fprintf(stderr, "Can't open html file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(fseek(fh, 0L, SEEK_END) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + long size = ftell(fh); + + if(fseek(fh, 0L, SEEK_SET) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(size <= 0) { + fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); + exit(EXIT_FAILURE); + } + + char *html = (char*)malloc(size + 1); + if(html == NULL) { + fprintf(stderr, "Can't allocate mem for html file: %s\n", filename); + exit(EXIT_FAILURE); + } + + size_t nread = fread(html, 1, size, fh); + if (nread != size) { + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); + exit(EXIT_FAILURE); + } + + fclose(fh); + + struct res_html res = {html, (size_t)size}; + return res; +} + +int main(int argc, const char * argv[]) +{ + if (argc != 2) { + printf("Bad ARGV!\nUse: detect_encoding_in_meta_high_level \n"); + exit(EXIT_FAILURE); + } + + struct res_html res = load_html_file(argv[1]); + + myencoding_t encoding = myencoding_prescan_stream_to_determine_encoding(res.html, res.size); + + if(encoding == MyENCODING_NOT_DETERMINED) { + printf("Can't detect encoding\n"); + } + else { + const char *encoding_name = myencoding_name_by_id(encoding, NULL); + printf("Encoding: %s\n", encoding_name); + } + + free(res.html); + + return 0; +} + + + + diff --git a/examples/myencoding/encoding_by_name.c b/examples/myencoding/encoding_by_name.c new file mode 100644 index 0000000..e2650b9 --- /dev/null +++ b/examples/myencoding/encoding_by_name.c @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include +#include + +#include + +int main(int argc, const char * argv[]) +{ + const char *name = "cp1251"; + myencoding_t encoding; + + if(myencoding_by_name(name, strlen(name), &encoding)) + { + if(encoding == MyENCODING_WINDOWS_1251) { + printf("Detected Encoding: windows-1251\n"); + return 0; + } + } + + printf("Detected Encoding: something wrong\n"); + + return 0; +} + + + + diff --git a/examples/myencoding/example.h b/examples/myencoding/example.h new file mode 100644 index 0000000..27f7ec8 --- /dev/null +++ b/examples/myencoding/example.h @@ -0,0 +1,32 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: vincent.torri@gmail.com (Vincent Torri) +*/ + +#ifndef MyHTML_EXAMPLE_EXAMPLE_H +#define MyHTML_EXAMPLE_EXAMPLE_H +#pragma once + +/* Format */ +#ifdef _WIN32 + #define MyCORE_FMT_Z "%Iu" +#else + #define MyCORE_FMT_Z "%zu" +#endif + +#endif /* MyHTML_EXAMPLE_EXAMPLE_H */ diff --git a/examples/myfont/Makefile.mk b/examples/myfont/Makefile.mk new file mode 100644 index 0000000..4362b6a --- /dev/null +++ b/examples/myfont/Makefile.mk @@ -0,0 +1,7 @@ +myfont_dirs := . +myfont_objs := $(call BINARY_UTILS_OBJS,myfont,$(myfont_dirs)) + +myfont_all: $(myfont_objs) + +myfont_clean: + rm -f $(myfont_objs) diff --git a/examples/myfont/glyph_metrics.c b/examples/myfont/glyph_metrics.c index 9a39b5e..606bd4d 100644 --- a/examples/myfont/glyph_metrics.c +++ b/examples/myfont/glyph_metrics.c @@ -23,9 +23,9 @@ #include #include -#include +#include -void usage(const char *path, float font_size, unsigned long codepoint) +void usage(const char *path, float font_size, size_t codepoint) { printf("Usage:\n"); printf("\tprogram [char in UTF-8] [font fize in px] [font path]\n"); @@ -35,14 +35,14 @@ void usage(const char *path, float font_size, unsigned long codepoint) int main(int argc, const char * argv[]) { /* set and get params */ - const char *path = "../third_party/font/Arkhip.ttf"; + const char *path = "third_party/font/Arkhip.ttf"; float font_size = 200.0f; - unsigned long codepoint; - myhtml_encoding_ascii_utf_8_to_codepoint((unsigned char*)"x", &codepoint); + size_t codepoint; + myencoding_ascii_utf_8_to_codepoint((unsigned char*)"x", &codepoint); if (argc == 2) { - if(myhtml_encoding_ascii_utf_8_to_codepoint((const unsigned char*)argv[1], &codepoint) == 0) { + if(myencoding_ascii_utf_8_to_codepoint((const unsigned char*)argv[1], &codepoint) == 0) { fprintf(stderr, "Bad char code point\n"); return EXIT_FAILURE; } @@ -67,7 +67,8 @@ int main(int argc, const char * argv[]) myfont_font_t *mf = myfont_create(); myfont_init(mf); - myfont_status_t mf_status = myfont_load(mf, path); + uint8_t *font_data; + mystatus_t mf_status = myfont_load_from_file(mf, path, &font_data, NULL); if(mf_status) { myfont_destroy(mf, true); @@ -83,7 +84,7 @@ int main(int argc, const char * argv[]) } char data[5]; - size_t len = myhtml_encoding_codepoint_to_ascii_utf_8(codepoint, data); + size_t len = myencoding_codepoint_to_ascii_utf_8(codepoint, data); data[len] = '\0'; /* work code */ @@ -102,7 +103,7 @@ int main(int argc, const char * argv[]) printf("Font file: %s\n", path); printf("Font size: %.fpx\n\n", font_size); - printf("Metrics for code point %lu (%s):\n", codepoint, data); + printf("Metrics for code point " MyCORE_FORMAT_Z " (%s):\n", codepoint, data); printf("\tBaseline: %.05f\n", baseline); printf("\tAscender: %.05f\n", ascender); printf("\tDescender: %.05f\n", descender); @@ -135,6 +136,7 @@ int main(int argc, const char * argv[]) printf("\n"); + myfont_destroy_font_data(mf, font_data); myfont_destroy(mf, true); return 0; diff --git a/examples/myhtml/Makefile.mk b/examples/myhtml/Makefile.mk new file mode 100644 index 0000000..f6fc0c7 --- /dev/null +++ b/examples/myhtml/Makefile.mk @@ -0,0 +1,7 @@ +myhtml_dirs := . +myhtml_objs := $(call BINARY_UTILS_OBJS,myhtml,$(myhtml_dirs)) + +myhtml_all: $(myhtml_objs) + +myhtml_clean: + rm -f $(myhtml_objs) diff --git a/examples/myhtml/attributes_high_level.c b/examples/myhtml/attributes_high_level.c index fc1a0a5..f47df26 100644 --- a/examples/myhtml/attributes_high_level.c +++ b/examples/myhtml/attributes_high_level.c @@ -23,6 +23,11 @@ #include #include +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} int main(int argc, const char * argv[]) { @@ -37,7 +42,7 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse_fragment(tree, MyHTML_ENCODING_UTF_8, html, strlen(html), MyHTML_TAG_DIV, MyHTML_NAMESPACE_HTML); + myhtml_parse_fragment(tree, MyENCODING_UTF_8, html, strlen(html), MyHTML_TAG_DIV, MyHTML_NAMESPACE_HTML); // get first DIV from index myhtml_collection_t *div_list = myhtml_get_nodes_by_name(tree, NULL, "div", 3, NULL); @@ -45,19 +50,19 @@ int main(int argc, const char * argv[]) // print original tree printf("Original tree:\n"); - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_node_html(tree), serialization_callback, NULL); printf("For a test; Create and delete 100000 attrs...\n"); for(size_t j = 0; j < 100000; j++) { - myhtml_tree_attr_t *attr = myhtml_attribute_add(node, "key", 3, "value", 5, MyHTML_ENCODING_UTF_8); + myhtml_tree_attr_t *attr = myhtml_attribute_add(node, "key", 3, "value", 5, MyENCODING_UTF_8); myhtml_attribute_delete(tree, node, attr); } // add first attr in first div in tree - myhtml_attribute_add(node, "key", 3, "value", 5, MyHTML_ENCODING_UTF_8); + myhtml_attribute_add(node, "key", 3, "value", 5, MyENCODING_UTF_8); printf("Modified tree:\n"); - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_node_html(tree), serialization_callback, NULL); // get attr by key name myhtml_tree_attr_t *gets_attr = myhtml_attribute_by_key(node, "key", 3); diff --git a/examples/myhtml/callback_tree_node_high_level.c b/examples/myhtml/callback_tree_node_high_level.c index c0fe589..b41d1fe 100644 --- a/examples/myhtml/callback_tree_node_high_level.c +++ b/examples/myhtml/callback_tree_node_high_level.c @@ -23,6 +23,8 @@ #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -61,7 +63,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -115,7 +117,7 @@ int main(int argc, const char * argv[]) myhtml_callback_tree_node_remove_set(tree, callback_node_remove, NULL); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); // release resources myhtml_tree_destroy(tree); diff --git a/examples/myhtml/chunks_high_level.c b/examples/myhtml/chunks_high_level.c index 6a952e5..6be8295 100644 --- a/examples/myhtml/chunks_high_level.c +++ b/examples/myhtml/chunks_high_level.c @@ -21,8 +21,15 @@ #include #include #include + #include +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} + int main(int argc, const char * argv[]) { char html[][64] = { @@ -53,7 +60,7 @@ int main(int argc, const char * argv[]) myhtml_tree_t* tree = myhtml_tree_create(); myhtml_tree_init(tree, myhtml); - myhtml_encoding_set(tree, MyHTML_ENCODING_UTF_8); + myhtml_encoding_set(tree, MyENCODING_UTF_8); for(size_t i = 0; html[i][0]; i++) { @@ -67,7 +74,7 @@ int main(int argc, const char * argv[]) myhtml_parse_chunk_end(tree); // print fragment - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_document(tree), serialization_callback, NULL); // release resources myhtml_tree_destroy(tree); diff --git a/examples/myhtml/custom_tree_high_level.c b/examples/myhtml/custom_tree_high_level.c index a457215..1a42ecc 100644 --- a/examples/myhtml/custom_tree_high_level.c +++ b/examples/myhtml/custom_tree_high_level.c @@ -24,6 +24,14 @@ #include +#include "example.h" + +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} + int main(int argc, const char * argv[]) { // basic init @@ -36,7 +44,7 @@ int main(int argc, const char * argv[]) myhtml_tree_t* tree = myhtml_tree_create(); myhtml_tree_init(tree, myhtml); - myhtml_encoding_set(tree, MyHTML_ENCODING_UTF_8); + myhtml_encoding_set(tree, MyENCODING_UTF_8); // create nodes printf("Create DIV element\n"); @@ -55,19 +63,19 @@ int main(int argc, const char * argv[]) myhtml_tree_node_t* new_text_node = myhtml_node_create(tree, MyHTML_TAG__TEXT, MyHTML_NAMESPACE_HTML); myhtml_node_append_child(new_p_node, new_text_node); - sprintf(tmp_buf_key, "best_key_for_%zu", i); - sprintf(tmp_buf_value, "for best value %zu", i); - sprintf(tmp_buf_text, "Text! Entity &#%zu = &#%zu", i, i); + sprintf(tmp_buf_key, "best_key_for_" MyCORE_FMT_Z, i); + sprintf(tmp_buf_value, "for best value " MyCORE_FMT_Z, i); + sprintf(tmp_buf_text, "Text! Entity &#" MyCORE_FMT_Z " = &#" MyCORE_FMT_Z, i, i); - myhtml_node_text_set_with_charef(new_text_node, tmp_buf_text, strlen(tmp_buf_text), MyHTML_ENCODING_UTF_8); + myhtml_node_text_set_with_charef(new_text_node, tmp_buf_text, strlen(tmp_buf_text), MyENCODING_UTF_8); myhtml_attribute_add(new_p_node, tmp_buf_key, strlen(tmp_buf_key), - tmp_buf_value, strlen(tmp_buf_value), MyHTML_ENCODING_UTF_8); + tmp_buf_value, strlen(tmp_buf_value), MyENCODING_UTF_8); } // print printf("Print result:\n"); - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_document(tree), serialization_callback, NULL); // release resources myhtml_tree_destroy(tree); diff --git a/examples/myhtml/detect_encoding_high_level.c b/examples/myhtml/detect_encoding_high_level.c deleted file mode 100644 index 73b8a18..0000000 --- a/examples/myhtml/detect_encoding_high_level.c +++ /dev/null @@ -1,128 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include -#include -#include - -struct res_html { - char *html; - size_t size; -}; - -struct res_html load_html_file(const char* filename) -{ - FILE *fh = fopen(filename, "rb"); - if(fh == NULL) { - fprintf(stderr, "Can't open html file: %s\n", filename); - exit(EXIT_FAILURE); - } - - if(fseek(fh, 0L, SEEK_END) != 0) { - fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); - exit(EXIT_FAILURE); - } - - long size = ftell(fh); - - if(fseek(fh, 0L, SEEK_SET) != 0) { - fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); - exit(EXIT_FAILURE); - } - - if(size <= 0) { - fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); - exit(EXIT_FAILURE); - } - - char *html = (char*)malloc(size + 1); - if(html == NULL) { - fprintf(stderr, "Can't allocate mem for html file: %s\n", filename); - exit(EXIT_FAILURE); - } - - size_t nread = fread(html, 1, size, fh); - if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); - exit(EXIT_FAILURE); - } - - fclose(fh); - - struct res_html res = {html, (size_t)size}; - return res; -} - -void print_encoding(myhtml_encoding_t encoding) -{ - printf("Character encoding is "); - - switch (encoding) { - case MyHTML_ENCODING_UTF_8: printf("UTF-8"); break; - case MyHTML_ENCODING_UTF_16LE: printf("UTF_16LE"); break; - case MyHTML_ENCODING_UTF_16BE: printf("UTF_16BE"); break; - case MyHTML_ENCODING_KOI8_R: printf("KOI8_R"); break; - case MyHTML_ENCODING_WINDOWS_1251: printf("WINDOWS_1251"); break; - case MyHTML_ENCODING_X_MAC_CYRILLIC: printf("X_MAC_CYRILLIC"); break; - case MyHTML_ENCODING_IBM866: printf("IBM866"); break; - case MyHTML_ENCODING_ISO_8859_5: printf("ISO_8859_5"); break; - default: - printf("UNKNOWN"); - break; - } - - printf("\n"); -} - -int main(int argc, const char * argv[]) -{ - const char* path; - - if (argc == 2) { - path = argv[1]; - } - else { - printf("Bad ARGV!\nUse: detect_encoding_high_level \n"); - exit(EXIT_FAILURE); - } - - struct res_html res = load_html_file(path); - - myhtml_encoding_t encoding; - - // try detect by BOM - if (myhtml_encoding_detect_bom(res.html, res.size, &encoding)) { - print_encoding(encoding); - } else if (myhtml_encoding_detect(res.html, res.size, &encoding)) { - print_encoding(encoding); - } else if (encoding != MyHTML_ENCODING_DEFAULT) { - printf("It is possible that "); - print_encoding(encoding); - } else { - printf("I could not identify character encoding\n"); - } - - free(res.html); - return 0; -} - - - - diff --git a/examples/myhtml/detect_encoding_in_meta_high_level.c b/examples/myhtml/detect_encoding_in_meta_high_level.c deleted file mode 100644 index 72a9cc4..0000000 --- a/examples/myhtml/detect_encoding_in_meta_high_level.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - Copyright (C) 2015-2017 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include -#include -#include - -struct res_html { - char *html; - size_t size; -}; - -struct res_html load_html_file(const char* filename) -{ - FILE *fh = fopen(filename, "rb"); - if(fh == NULL) { - fprintf(stderr, "Can't open html file: %s\n", filename); - exit(EXIT_FAILURE); - } - - if(fseek(fh, 0L, SEEK_END) != 0) { - fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); - exit(EXIT_FAILURE); - } - - long size = ftell(fh); - - if(fseek(fh, 0L, SEEK_SET) != 0) { - fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); - exit(EXIT_FAILURE); - } - - if(size <= 0) { - fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); - exit(EXIT_FAILURE); - } - - char *html = (char*)malloc(size + 1); - if(html == NULL) { - fprintf(stderr, "Can't allocate mem for html file: %s\n", filename); - exit(EXIT_FAILURE); - } - - size_t nread = fread(html, 1, size, fh); - if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); - exit(EXIT_FAILURE); - } - - fclose(fh); - - struct res_html res = {html, (size_t)size}; - return res; -} - -int main(int argc, const char * argv[]) -{ - if (argc != 2) { - printf("Bad ARGV!\nUse: detect_encoding_in_meta_high_level \n"); - exit(EXIT_FAILURE); - } - - struct res_html res = load_html_file(argv[1]); - - myhtml_encoding_t encoding = myhtml_encoding_prescan_stream_to_determine_encoding(res.html, res.size); - - if(encoding == MyHTML_ENCODING_NOT_DETERMINED) { - printf("Can't detect encoding\n"); - } - else { - const char *encoding_name = myhtml_encoding_name_by_id(encoding, NULL); - printf("Encoding: %s\n", encoding_name); - } - - free(res.html); - - return 0; -} - - - - diff --git a/examples/myhtml/encoding_by_name_high_level.c b/examples/myhtml/encoding_by_name_high_level.c deleted file mode 100644 index 4e669b0..0000000 --- a/examples/myhtml/encoding_by_name_high_level.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - Copyright (C) 2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include -#include -#include - -#include - -int main(int argc, const char * argv[]) -{ - const char *name = "cp1251"; - myhtml_encoding_t encoding; - - if(myhtml_encoding_by_name(name, strlen(name), &encoding)) - { - if(encoding == MyHTML_ENCODING_WINDOWS_1251) { - printf("Detected Encoding: windows-1251\n"); - return 0; - } - } - - printf("Detected Encoding: something wrong\n"); - - return 0; -} - - - - diff --git a/examples/myhtml/example.h b/examples/myhtml/example.h new file mode 100644 index 0000000..27f7ec8 --- /dev/null +++ b/examples/myhtml/example.h @@ -0,0 +1,32 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: vincent.torri@gmail.com (Vincent Torri) +*/ + +#ifndef MyHTML_EXAMPLE_EXAMPLE_H +#define MyHTML_EXAMPLE_EXAMPLE_H +#pragma once + +/* Format */ +#ifdef _WIN32 + #define MyCORE_FMT_Z "%Iu" +#else + #define MyCORE_FMT_Z "%zu" +#endif + +#endif /* MyHTML_EXAMPLE_EXAMPLE_H */ diff --git a/examples/myhtml/fragment_high_level.c b/examples/myhtml/fragment_high_level.c index 8c032f0..4c8b084 100644 --- a/examples/myhtml/fragment_high_level.c +++ b/examples/myhtml/fragment_high_level.c @@ -23,6 +23,11 @@ #include #include +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} int main(int argc, const char * argv[]) { @@ -37,10 +42,10 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse_fragment(tree, MyHTML_ENCODING_UTF_8, html, strlen(html), MyHTML_TAG_DIV, MyHTML_NAMESPACE_HTML); + myhtml_parse_fragment(tree, MyENCODING_UTF_8, html, strlen(html), MyHTML_TAG_DIV, MyHTML_NAMESPACE_HTML); // print fragment - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_document(tree), serialization_callback, NULL); // release resources myhtml_tree_destroy(tree); diff --git a/examples/myhtml/get_title_high_level.c b/examples/myhtml/get_title_high_level.c index a05fdd0..cf07340 100644 --- a/examples/myhtml/get_title_high_level.c +++ b/examples/myhtml/get_title_high_level.c @@ -22,6 +22,8 @@ #include #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -60,7 +62,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -93,7 +95,7 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); // parse html myhtml_collection_t *collection = myhtml_get_nodes_by_tag_id(tree, NULL, MyHTML_TAG_TITLE, NULL); diff --git a/examples/myhtml/get_title_low_level.c b/examples/myhtml/get_title_low_level.c index 9c918d2..996911c 100644 --- a/examples/myhtml/get_title_low_level.c +++ b/examples/myhtml/get_title_low_level.c @@ -23,6 +23,8 @@ #include #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -61,7 +63,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -94,18 +96,18 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); // get title from index myhtml_collection_t *titles_list = myhtml_get_nodes_by_tag_id(tree, NULL, MyHTML_TAG_TITLE, NULL); if(titles_list && titles_list->length != 0 && titles_list->list[0]->child) { - myhtml_string_raw_t str = {0}; + mycore_string_raw_t str = {0}; myhtml_serialization_node(titles_list->list[0]->child, &str); printf("%s\n", str.data); - myhtml_string_raw_destroy(&str, false); + mycore_string_raw_destroy(&str, false); } // release resources diff --git a/examples/myhtml/html2sexpr.c b/examples/myhtml/html2sexpr.c index 92669ad..7570381 100644 --- a/examples/myhtml/html2sexpr.c +++ b/examples/myhtml/html2sexpr.c @@ -28,6 +28,8 @@ #include +#include "example.h" + #define DIE(msg, ...) do { fprintf(stderr, msg, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0) static bool filter_node(myhtml_tree_node_t* node) @@ -117,7 +119,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - DIE("could not read %ld bytes (%zu bytes done)\n", size, nread); + DIE("could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); } fclose(fh); @@ -139,7 +141,7 @@ int main(int argc, char** argv) } struct res_html data = load_html_file(argv[1]); - myhtml_status_t res; + mystatus_t res; // basic init myhtml_t* myhtml = myhtml_create(); @@ -164,7 +166,7 @@ int main(int argc, char** argv) } // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data.html, data.size); + myhtml_parse(tree, MyENCODING_UTF_8, data.html, data.size); walk_subtree(tree, myhtml_tree_get_node_html(tree), 0); printf("\n"); diff --git a/examples/myhtml/insert_in_appropriate_place_high_level.c b/examples/myhtml/insert_in_appropriate_place_high_level.c index 68a7b4b..ef11f5d 100644 --- a/examples/myhtml/insert_in_appropriate_place_high_level.c +++ b/examples/myhtml/insert_in_appropriate_place_high_level.c @@ -23,6 +23,11 @@ #include #include +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} int main(int argc, const char * argv[]) { @@ -37,7 +42,7 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse_fragment(tree, MyHTML_ENCODING_UTF_8, html, strlen(html), MyHTML_TAG_DIV, MyHTML_NAMESPACE_HTML); + myhtml_parse_fragment(tree, MyENCODING_UTF_8, html, strlen(html), MyHTML_TAG_DIV, MyHTML_NAMESPACE_HTML); // get text node by index myhtml_collection_t *collection = myhtml_get_nodes_by_tag_id(tree, NULL, MyHTML_TAG_TABLE, NULL); @@ -51,7 +56,7 @@ int main(int argc, const char * argv[]) } // print fragment - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_document(tree), serialization_callback, NULL); // release resources myhtml_collection_destroy(collection); diff --git a/examples/myhtml/modify_and_serialize.c b/examples/myhtml/modify_and_serialize.c index f434095..cbd3a83 100644 --- a/examples/myhtml/modify_and_serialize.c +++ b/examples/myhtml/modify_and_serialize.c @@ -22,9 +22,10 @@ * @param size * @param ptr */ -void write_output(const char *buffer, size_t size, void *ptr) +mystatus_t write_output(const char* data, size_t len, void* ctx) { - fwrite(buffer, 1, size, stdout); + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; } /** @@ -45,7 +46,7 @@ int main() const char *input = ""; // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, input, strlen(input)); + myhtml_parse(tree, MyENCODING_UTF_8, input, strlen(input)); // collection of links myhtml_collection_t *collection = myhtml_get_nodes_by_name(tree, NULL, "a", 1, NULL); @@ -54,7 +55,7 @@ int main() for (size_t i = 0; i < collection->length; ++i) { // add attribute - myhtml_attribute_add(collection->list[i], "title", 5, "my value", 8, MyHTML_ENCODING_UTF_8); + myhtml_attribute_add(collection->list[i], "title", 5, "my value", 8, MyENCODING_UTF_8); } diff --git a/examples/myhtml/nodes_by_attr_key_high_level.c b/examples/myhtml/nodes_by_attr_key_high_level.c index 7787031..0521f46 100644 --- a/examples/myhtml/nodes_by_attr_key_high_level.c +++ b/examples/myhtml/nodes_by_attr_key_high_level.c @@ -24,6 +24,8 @@ #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -62,7 +64,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -72,6 +74,12 @@ struct res_html load_html_file(const char* filename) return res; } +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} + int main(int argc, const char * argv[]) { const char* path; @@ -97,15 +105,15 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); // get and print myhtml_collection_t *collection = myhtml_get_nodes_by_attribute_key(tree, NULL, NULL, attr_key, strlen(attr_key), NULL); for(size_t i = 0; i < collection->length; i++) - myhtml_tree_print_node(tree, collection->list[i], stdout); + myhtml_serialization_node_callback(collection->list[i], serialization_callback, NULL); - printf("Total found: %zu\n", collection->length); + printf("Total found: " MyCORE_FMT_Z "\n", collection->length); myhtml_collection_destroy(collection); diff --git a/examples/myhtml/nodes_by_attr_value_high_level.c b/examples/myhtml/nodes_by_attr_value_high_level.c index 587252f..a113973 100644 --- a/examples/myhtml/nodes_by_attr_value_high_level.c +++ b/examples/myhtml/nodes_by_attr_value_high_level.c @@ -26,6 +26,8 @@ #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -73,7 +75,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -155,6 +157,12 @@ struct res_argv get_argv(int len, int argc, const char ** argv) return rargv; } +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} + int main(int argc, const char * argv[]) { const char* path; @@ -184,7 +192,7 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); // get and print myhtml_collection_t* collection = NULL; @@ -228,9 +236,9 @@ int main(int argc, const char * argv[]) if(collection) { for(size_t i = 0; i < collection->length; i++) - myhtml_tree_print_node(tree, collection->list[i], stdout); + myhtml_serialization_node_callback(collection->list[i], serialization_callback, NULL); - printf("Total found: %zu\n", collection->length); + printf("Total found: " MyCORE_FMT_Z "\n", collection->length); } myhtml_collection_destroy(collection); diff --git a/examples/myhtml/parse_without_whitespace.c b/examples/myhtml/parse_without_whitespace.c index 3eab61d..f5455c9 100644 --- a/examples/myhtml/parse_without_whitespace.c +++ b/examples/myhtml/parse_without_whitespace.c @@ -23,6 +23,8 @@ #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -61,7 +63,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -71,6 +73,12 @@ struct res_html load_html_file(const char* filename) return res; } +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} + int main(int argc, const char * argv[]) { const char* path; @@ -99,10 +107,10 @@ int main(int argc, const char * argv[]) MyHTML_TREE_PARSE_FLAGS_WITHOUT_DOCTYPE_IN_TREE); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); if(myhtml_tree_get_node_html(tree)) - myhtml_tree_print_by_node(tree, myhtml_tree_get_node_html(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_node_html(tree), serialization_callback, NULL); // release resources myhtml_tree_destroy(tree); diff --git a/examples/myhtml/print_tree_high_level.c b/examples/myhtml/print_tree_high_level.c index fbdba87..eecd7d6 100644 --- a/examples/myhtml/print_tree_high_level.c +++ b/examples/myhtml/print_tree_high_level.c @@ -22,6 +22,8 @@ #include #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -60,7 +62,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -151,7 +153,7 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); // print tree myhtml_tree_node_t *node = myhtml_tree_get_document(tree); diff --git a/examples/myhtml/serialization_high_level.c b/examples/myhtml/serialization_high_level.c index c4cc70e..62a1265 100644 --- a/examples/myhtml/serialization_high_level.c +++ b/examples/myhtml/serialization_high_level.c @@ -22,6 +22,8 @@ #include #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -60,7 +62,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -93,10 +95,10 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); - myhtml_string_raw_t str_raw; - myhtml_string_raw_clean_all(&str_raw); + mycore_string_raw_t str_raw; + mycore_string_raw_clean_all(&str_raw); if(myhtml_serialization_tree_buffer(myhtml_tree_get_document(tree), &str_raw)) { /* @@ -105,7 +107,7 @@ int main(int argc, const char * argv[]) */ printf("%s", str_raw.data); - myhtml_string_raw_destroy(&str_raw, false); + mycore_string_raw_destroy(&str_raw, false); } // release resources diff --git a/examples/myhtml/string_manipulate_high_level.c b/examples/myhtml/string_manipulate_high_level.c index 5e515ee..ca6d74b 100644 --- a/examples/myhtml/string_manipulate_high_level.c +++ b/examples/myhtml/string_manipulate_high_level.c @@ -23,6 +23,11 @@ #include #include +mystatus_t serialization_callback(const char* data, size_t len, void* ctx) +{ + printf("%.*s", (int)len, data); + return MyCORE_STATUS_OK; +} int main(int argc, const char * argv[]) { @@ -37,11 +42,11 @@ int main(int argc, const char * argv[]) myhtml_tree_init(tree, myhtml); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, html, strlen(html)); + myhtml_parse(tree, MyENCODING_UTF_8, html, strlen(html)); // print original tree printf("Original Tree:\n"); - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_node_html(tree), serialization_callback, NULL); printf("Change word: manipulate => test\n"); @@ -51,18 +56,18 @@ int main(int argc, const char * argv[]) if(collection && collection->list && collection->length) { myhtml_tree_node_t *text_node = collection->list[0]; - myhtml_string_t *str = myhtml_node_string(text_node); + mycore_string_t *str = myhtml_node_string(text_node); // change data - char *data = myhtml_string_data(str); + char *data = mycore_string_data(str); - for (size_t i = 0; i < myhtml_string_length(str); i++) + for (size_t i = 0; i < mycore_string_length(str); i++) { if(data[i] == 'm') { sprintf(&data[i], "test"); // set new length - myhtml_string_length_set(str, (i + 4)); + mycore_string_length_set(str, (i + 4)); break; } } @@ -70,7 +75,7 @@ int main(int argc, const char * argv[]) printf("Changed Tree:\n"); // print tree - myhtml_tree_print_node_children(tree, myhtml_tree_get_document(tree), stdout, 0); + myhtml_serialization_tree_callback(myhtml_tree_get_node_html(tree), serialization_callback, NULL); // release resources myhtml_tree_destroy(tree); diff --git a/examples/myhtml/tokenizer_colorize_high_level.c b/examples/myhtml/tokenizer_colorize_high_level.c index 8149d1b..05ee28f 100644 --- a/examples/myhtml/tokenizer_colorize_high_level.c +++ b/examples/myhtml/tokenizer_colorize_high_level.c @@ -23,6 +23,8 @@ #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -61,7 +63,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -71,19 +73,19 @@ struct res_html load_html_file(const char* filename) return res; } -void colorize_print(myhtml_incoming_buffer_t *inc_buf, size_t begin, size_t length, const char* color) +void colorize_print(mycore_incoming_buffer_t *inc_buf, size_t begin, size_t length, const char* color) { if(length) { - inc_buf = myhtml_incoming_buffer_find_by_position(inc_buf, begin); + inc_buf = mycore_incoming_buffer_find_by_position(inc_buf, begin); - size_t between_begin = (begin - myhtml_incoming_buffer_offset(inc_buf)); - const char* between_data = myhtml_incoming_buffer_data(inc_buf); + size_t between_begin = (begin - mycore_incoming_buffer_offset(inc_buf)); + const char* between_data = mycore_incoming_buffer_data(inc_buf); printf("%s%.*s\e[0m", color, (int)length, &between_data[between_begin]); } } -size_t colorize_print_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, myhtml_incoming_buffer_t *inc_buf, size_t last_pos) +size_t colorize_print_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, mycore_incoming_buffer_t *inc_buf, size_t last_pos) { while(attr) { @@ -133,7 +135,7 @@ size_t colorize_print_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, void * colorize_callback_before_token_done(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx) { - myhtml_incoming_buffer_t *inc_buf = myhtml_tree_incoming_buffer_first(tree); + mycore_incoming_buffer_t *inc_buf = myhtml_tree_incoming_buffer_first(tree); myhtml_position_t token_pos = myhtml_token_node_raw_pasition(token); myhtml_position_t token_element_pos = myhtml_token_node_element_pasition(token); @@ -210,7 +212,7 @@ int main(int argc, const char * argv[]) myhtml_callback_before_token_done_set(tree, colorize_callback_before_token_done, NULL); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); printf("\n"); diff --git a/examples/myhtml/tokenizer_colorize_low_level.c b/examples/myhtml/tokenizer_colorize_low_level.c index e59cb19..f14fba7 100644 --- a/examples/myhtml/tokenizer_colorize_low_level.c +++ b/examples/myhtml/tokenizer_colorize_low_level.c @@ -23,6 +23,8 @@ #include +#include "example.h" + struct res_html { char *html; size_t size; @@ -61,7 +63,7 @@ struct res_html load_html_file(const char* filename) size_t nread = fread(html, 1, size, fh); if (nread != size) { - fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -71,15 +73,15 @@ struct res_html load_html_file(const char* filename) return res; } -void colorize_print(myhtml_incoming_buffer_t *inc_buf, size_t begin, size_t length, const char* color) +void colorize_print(mycore_incoming_buffer_t *inc_buf, size_t begin, size_t length, const char* color) { if(length) { - inc_buf = myhtml_incoming_buffer_find_by_position(inc_buf, begin); + inc_buf = mycore_incoming_buffer_find_by_position(inc_buf, begin); printf("%s%.*s\e[0m", color, (int)length, &inc_buf->data[(begin - inc_buf->offset)]); } } -size_t colorize_print_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, myhtml_incoming_buffer_t *inc_buf, size_t last_pos) +size_t colorize_print_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, mycore_incoming_buffer_t *inc_buf, size_t last_pos) { while(attr) { if(attr->raw_key_length) @@ -125,7 +127,7 @@ size_t colorize_print_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, void * colorize_callback_before_token_done(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx) { - myhtml_incoming_buffer_t *inc_buf = tree->incoming_buf_first; + mycore_incoming_buffer_t *inc_buf = tree->incoming_buf_first; size_t last_pos = token->raw_begin + token->raw_length; @@ -200,7 +202,7 @@ int main(int argc, const char * argv[]) myhtml_callback_before_token_done_set(tree, colorize_callback_before_token_done, NULL); // parse html - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.html, res.size); + myhtml_parse(tree, MyENCODING_UTF_8, res.html, res.size); printf("\n"); diff --git a/examples/myurl/Makefile.mk b/examples/myurl/Makefile.mk new file mode 100644 index 0000000..56ffcca --- /dev/null +++ b/examples/myurl/Makefile.mk @@ -0,0 +1,7 @@ +myurl_dirs := . +myurl_objs := $(call BINARY_UTILS_OBJS,myurl,$(myurl_dirs)) + +myurl_all: $(myurl_objs) + +myurl_clean: + rm -f $(myurl_objs) diff --git a/examples/myurl/url_data.c b/examples/myurl/url_data.c new file mode 100644 index 0000000..f6f6c2f --- /dev/null +++ b/examples/myurl/url_data.c @@ -0,0 +1,51 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +int main(int argc, const char * argv[]) +{ + const char* data_base = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGlSURBVDhPnZDfS1NhGMfff8oLEUE0FBfqmrigi/DKrvKqiNDEKYjCUJdH3I/Q5WoLdYmlU1FP0LQoEclYOCcoMbJuDAUVA/v0vK8/QssL98AH3u97zud7Ho4ajr8i2P8sJ2JDcVSwf5BcR7sqEHpqQpF/60ro0e5Zwb1FiPyAoW14tAIVE5fjGDPKaUHYhOQhTO1DYu+Y/4mn/C0Io3oDAyasCYtHsPALRmUL5+R56j9AdwbsA4jJpnq0q6y+JyboO11ibUBt8jxpuV8VPgn6I5M7cpDRrhSETKiXf3BXuPP+X8Zlo3V5JyUs/4aZXaNIQQj12AqY0CBPL9KW+kIwbWF/b2MqW8d09iZzW27mf0aNo13lOynwpPZpTHpotstpfVOK9105oeUKnqeqiK06iWduMLbhIvG1Gvub2zjaVV09fhPqRgq5nyimYaaEptlrtCfL6Fu6TvhzJREpeZF28nLdxevNamazNcbRrvJ2WiY4/Hm4w/ncihRwO1pwVqjLWuxS2t+W0SVbWR8dDK5UGke7qsPrMyGX0a7y9fSaQy48eNjIH2VPyHZqSIx2AAAAAElFTkSuQmCC"; + + myurl_t *url = myurl_create(); + if(url == NULL) { + printf("Can't create URL object\n"); + return EXIT_FAILURE; + } + + if(myurl_init(url)) { + printf("Can't init URL object\n"); + return EXIT_FAILURE; + } + + printf("Parse URL: %s\n\n", data_base); + + myurl_entry_t *url_base = myurl_parse(url, data_base, strlen(data_base), NULL, NULL); + char *path = myurl_entry_path_as_string(url_base, NULL); + + printf("Result data from URL: %s\n", path); + + myurl_entry_free_string(url_base, path); + myurl_entry_destroy(url_base, true); + myurl_destroy(url, true); + + return EXIT_SUCCESS; +} diff --git a/examples/myurl/url_parse.c b/examples/myurl/url_parse.c new file mode 100644 index 0000000..b59df93 --- /dev/null +++ b/examples/myurl/url_parse.c @@ -0,0 +1,72 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +int main(int argc, const char * argv[]) +{ + const char* data_base = "https://lastmac:12345@www.emaple.com:4433/programming/?id=777888999#somehash"; + + myurl_t *url = myurl_create(); + if(url == NULL) { + printf("Can't create URL object\n"); + return EXIT_FAILURE; + } + + if(myurl_init(url)) { + printf("Can't init URL object\n"); + return EXIT_FAILURE; + } + + printf("Parse url \"%s\":\n", data_base); + + myurl_entry_t *url_base = myurl_parse(url, data_base, strlen(data_base), NULL, NULL); + + const char *scheme = myurl_entry_scheme_name(url_base, NULL); + char *authority = myurl_entry_authority_as_string(url_base, NULL); + const char *username = myurl_entry_username(url_base, NULL); + const char *password = myurl_entry_password(url_base, NULL); + char *host = myurl_entry_host_as_string(url_base, NULL); + char *path = myurl_entry_path_as_string(url_base, NULL); + const char *query = myurl_entry_query(url_base, NULL); + const char *fragment = myurl_entry_fragment(url_base, NULL); + + printf("\tScheme: %s\n" , (scheme ? scheme : "")); + printf("\tScheme port: %u\n" , myurl_entry_scheme_port(url_base)); + printf("\tAuthority (%s):\n" , authority); + printf("\t\tUsername: %s\n" , username); + printf("\t\tPassword: %s\n" , password); + printf("\tHost: %s\n" , host); + printf("\tPort is defined: %s\n", (myurl_entry_port_is_defined(url_base) ? "true" : "false")); + printf("\tPort: %u\n" , myurl_entry_port(url_base)); + printf("\tPath: %s\n" , path); + printf("\tQuery: %s\n" , (query ? query : "")); + printf("\tFragment: %s\n" , (fragment ? fragment : "")); + + myurl_entry_free_string(url_base, authority); + myurl_entry_free_string(url_base, host); + myurl_entry_free_string(url_base, path); + + myurl_entry_destroy(url_base, true); + myurl_destroy(url, true); + + return 0; +} diff --git a/examples/myurl/url_relative.c b/examples/myurl/url_relative.c new file mode 100644 index 0000000..8a0b801 --- /dev/null +++ b/examples/myurl/url_relative.c @@ -0,0 +1,56 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +int main(int argc, const char * argv[]) +{ + const char* data_base = "https://www.reddit.com/r/programming/"; + const char* data_relative = "../gaming/?count=25"; + + myurl_t *url = myurl_create(); + if(url == NULL) { + printf("Can't create URL object\n"); + return EXIT_FAILURE; + } + + if(myurl_init(url)) { + printf("Can't init URL object\n"); + return EXIT_FAILURE; + } + + myurl_entry_t *url_base = myurl_parse(url, data_base, strlen(data_base), NULL, NULL); + myurl_entry_t *url_relative = myurl_parse(url, data_relative, strlen(data_relative), url_base, NULL); + + char *result = myurl_entry_as_string(url_relative, NULL); + + printf("Relative URL: %s\n", data_relative); + printf("Base URL: %s\n", data_base); + printf("Result URL: %s\n", result); + + myurl_entry_free_string(url_base, result); + + myurl_entry_destroy(url_base, true); + myurl_entry_destroy(url_relative, true); + myurl_destroy(url, true); + + return EXIT_SUCCESS; +} diff --git a/include/modest/declaration.h b/include/modest/declaration.h index 7c19334..f0c5837 100644 --- a/include/modest/declaration.h +++ b/include/modest/declaration.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/finder/finder.h b/include/modest/finder/finder.h index ff9da35..b002e14 100644 --- a/include/modest/finder/finder.h +++ b/include/modest/finder/finder.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -38,7 +38,7 @@ typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finde /* init */ modest_finder_t * modest_finder_create(void); -modest_status_t modest_finder_init(modest_finder_t* finder); +mystatus_t modest_finder_init(modest_finder_t* finder); void modest_finder_clean(modest_finder_t* finder); modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destroy); @@ -59,7 +59,7 @@ void modest_finder_specificity_inc(mycss_selectors_entry_t* selector, mycss_sele /* base api */ modest_finder_t * modest_finder_by_stylesheet(mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node); -modest_status_t modest_finder_by_selectors_list(modest_finder_t* finder, myhtml_tree_node_t* scope_node, +mystatus_t modest_finder_by_selectors_list(modest_finder_t* finder, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list, myhtml_collection_t** collection); /* process */ diff --git a/include/modest/finder/match.h b/include/modest/finder/match.h index 568f8af..629459d 100644 --- a/include/modest/finder/match.h +++ b/include/modest/finder/match.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/finder/myosi.h b/include/modest/finder/myosi.h index 7dea0fe..63b91d9 100644 --- a/include/modest/finder/myosi.h +++ b/include/modest/finder/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/finder/pseudo_class.h b/include/modest/finder/pseudo_class.h index 05fd578..f9425ed 100644 --- a/include/modest/finder/pseudo_class.h +++ b/include/modest/finder/pseudo_class.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/finder/resource.h b/include/modest/finder/resource.h index 839914a..0d312ba 100644 --- a/include/modest/finder/resource.h +++ b/include/modest/finder/resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/finder/thread.h b/include/modest/finder/thread.h index 7c5ac44..de0bac6 100644 --- a/include/modest/finder/thread.h +++ b/include/modest/finder/thread.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,8 @@ #include #include -#include -#include +#include +#include #include @@ -85,13 +85,16 @@ struct modest_finder_thread_found_context { modest_finder_thread_t * modest_finder_thread_create(void); -modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count); +mystatus_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count); void modest_finder_thread_clean(modest_finder_thread_t* finder_thread, bool self_destroy); modest_finder_thread_t * modest_finder_thread_destroy(modest_finder_thread_t* finder_thread, bool self_destroy); -modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list); +mystatus_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list); +#ifndef MyCORE_BUILD_WITHOUT_THREADS void modest_finder_thread_wait_for_all_done(modest_finder_thread_t* finder_thread); +#endif + bool modest_finder_thread_spec_is_up(modest_style_raw_specificity_t* spec_f, modest_style_raw_specificity_t* spec_t); #ifdef __cplusplus diff --git a/include/modest/finder/type.h b/include/modest/finder/type.h index 3497852..72cc1ef 100644 --- a/include/modest/finder/type.h +++ b/include/modest/finder/type.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #ifdef __cplusplus diff --git a/include/modest/glue.h b/include/modest/glue.h index d8b53f3..39c2372 100644 --- a/include/modest/glue.h +++ b/include/modest/glue.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/layer/layer.h b/include/modest/layer/layer.h index 4843bc5..e57a348 100644 --- a/include/modest/layer/layer.h +++ b/include/modest/layer/layer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ #pragma once #include -#include +#include #ifdef __cplusplus extern "C" { @@ -47,7 +47,7 @@ struct modest_layout { }; modest_layout_t * modest_layers_create(void); -modest_status_t modest_layers_init(modest_layout_t* layout); +mystatus_t modest_layers_init(modest_layout_t* layout); void modest_layers_clean_all(modest_layout_t* layout); modest_layout_t * modest_layers_destroy(modest_layout_t* layout, bool self_destroy); diff --git a/include/modest/modest.h b/include/modest/modest.h index bedd93d..ff7fb0d 100644 --- a/include/modest/modest.h +++ b/include/modest/modest.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,10 +24,10 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #ifdef __cplusplus extern "C" { @@ -47,7 +47,7 @@ struct modest { modest_layout_t* layout; - myhtml_utils_avl_tree_t* style_avl_tree; + mycore_utils_avl_tree_t* style_avl_tree; /* refs */ myhtml_tree_t* myhtml_tree; @@ -56,7 +56,7 @@ struct modest { modest_t * modest_create(void); -modest_status_t modest_init(modest_t* modest); +mystatus_t modest_init(modest_t* modest); void modest_clean(modest_t* modest); modest_t * modest_destroy(modest_t* modest, bool self_destroy); diff --git a/include/modest/myosi.h b/include/modest/myosi.h index e53d718..10f8a8c 100644 --- a/include/modest/myosi.h +++ b/include/modest/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,9 +22,16 @@ #define MODEST_MYOSI_H #pragma once +#include #include #include +#define MODEST_VERSION_MAJOR 0 +#define MODEST_VERSION_MINOR 0 +#define MODEST_VERSION_PATCH 6 + +#define MODEST_VERSION_STRING MyCORE_STR(MODEST_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MODEST_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MODEST_VERSION_PATCH) + #ifdef __cplusplus extern "C" { #endif @@ -36,12 +43,14 @@ extern "C" { for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 - for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for myrender 030000..037777; MyRENDER_STATUS_OK == 0x000000 + for myurl 038888..0388ff; MyURL_STATUS_OK == 0x000000 + for myunicode 038900..038bff; MyUNICODE_STATUS_OK == 0x000000 + not occupied 038c00..03ffff; for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 - for myfont 070000..07ffff; MyFONT_STATUS_OK == 0x000000 - not occupied 080000.. + not occupied 070000.. */ enum modest_status { MODEST_STATUS_OK = 0x000000, diff --git a/include/modest/node/node.h b/include/modest/node/node.h index 726a3d1..cd3d914 100644 --- a/include/modest/node/node.h +++ b/include/modest/node/node.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -35,7 +35,7 @@ extern "C" { struct modest_node { modest_style_sheet_t* stylesheet; #ifndef MODEST_NODE_FULL_RAW - myhtml_utils_avl_tree_node_t *avl_tree_node; + mycore_utils_avl_tree_node_t *avl_tree_node; #else modest_style_raw_declaration_t * raw_declaration[MyCSS_PROPERTY_TYPE_LAST_ENTRY]; #endif /* MODEST_NODE_FULL_RAW */ @@ -44,7 +44,7 @@ struct modest_node { }; modest_node_t * modest_node_create(modest_t* modest); -modest_status_t modest_node_init(modest_t* modest, modest_node_t *mnode); +mystatus_t modest_node_init(modest_t* modest, modest_node_t *mnode); mycss_declaration_entry_t * modest_node_declaration_by_type(modest_t* modest, modest_node_t *mnode, mycss_property_type_t type); diff --git a/include/modest/node/property.h b/include/modest/node/property.h index 7f04f00..c497b6b 100644 --- a/include/modest/node/property.h +++ b/include/modest/node/property.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/node/raw_property.h b/include/modest/node/raw_property.h index 8a42f85..8d19073 100644 --- a/include/modest/node/raw_property.h +++ b/include/modest/node/raw_property.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/node/serialization.h b/include/modest/node/serialization.h index 7d2d354..e512e48 100644 --- a/include/modest/node/serialization.h +++ b/include/modest/node/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -34,13 +34,13 @@ extern "C" { struct modest_node_serialization_context { modest_t* modest; - mycss_callback_serialization_f callback; + mycore_callback_serialize_f callback; void* context; bool is_use; } typedef modest_node_serialization_context_t; -bool modest_node_raw_serialization(modest_t* modest, modest_node_t* mnode, mycss_callback_serialization_f callback, void* context); +bool modest_node_raw_serialization(modest_t* modest, modest_node_t* mnode, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/render/begin.h b/include/modest/render/begin.h index 6805d9b..0c5fb5a 100644 --- a/include/modest/render/begin.h +++ b/include/modest/render/begin.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/render/binding.h b/include/modest/render/binding.h index 24a53ce..e865e30 100644 --- a/include/modest/render/binding.h +++ b/include/modest/render/binding.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/render/tree.h b/include/modest/render/tree.h index 3bc5123..2f71fc4 100644 --- a/include/modest/render/tree.h +++ b/include/modest/render/tree.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,7 +25,7 @@ typedef struct modest_render_tree modest_render_tree_t; #include -#include +#include #include #ifdef __cplusplus @@ -37,12 +37,12 @@ struct modest_render_tree { }; modest_render_tree_t * modest_render_tree_create(void); -modest_status_t modest_render_tree_init(modest_render_tree_t* render_tree); +mystatus_t modest_render_tree_init(modest_render_tree_t* render_tree); void modest_render_tree_clean_all(modest_render_tree_t* render_tree); modest_render_tree_t * modest_render_tree_destroy(modest_render_tree_t* render_tree, bool self_destroy); void modest_render_tree_serialization(myhtml_tree_t* html_tree, modest_render_tree_t* tree, - modest_render_tree_node_t* scope_node, mycss_callback_serialization_f callback, void* context); + modest_render_tree_node_t* scope_node, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/render/tree_node.h b/include/modest/render/tree_node.h index 4c39d9d..01717b3 100644 --- a/include/modest/render/tree_node.h +++ b/include/modest/render/tree_node.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,7 +28,7 @@ typedef struct modest_render_tree_node modest_render_tree_node_t; #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -62,7 +62,7 @@ void modest_render_tree_node_remove(modest_render_tree_node_t* node); void modest_render_tree_node_append_after(modest_render_tree_node_t* target, modest_render_tree_node_t* node); void modest_render_tree_node_append_before(modest_render_tree_node_t* target, modest_render_tree_node_t* node); -void modest_render_tree_node_serialization(myhtml_tree_t* html_tree, modest_render_tree_node_t* node, mycss_callback_serialization_f callback, void* context); +void modest_render_tree_node_serialization(myhtml_tree_t* html_tree, modest_render_tree_node_t* node, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/style/default.h b/include/modest/style/default.h index 3382ae5..e73754e 100644 --- a/include/modest/style/default.h +++ b/include/modest/style/default.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/style/default_entries.h b/include/modest/style/default_entries.h index 0558e81..5545415 100644 --- a/include/modest/style/default_entries.h +++ b/include/modest/style/default_entries.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/style/default_resources.h b/include/modest/style/default_resources.h index 5971d73..4182914 100644 --- a/include/modest/style/default_resources.h +++ b/include/modest/style/default_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/style/map.h b/include/modest/style/map.h index f142439..086495a 100644 --- a/include/modest/style/map.h +++ b/include/modest/style/map.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/style/map_resource.h b/include/modest/style/map_resource.h index bb2eca2..9938dd8 100644 --- a/include/modest/style/map_resource.h +++ b/include/modest/style/map_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/modest/style/raw.h b/include/modest/style/raw.h index ab625e9..d5c5bc5 100644 --- a/include/modest/style/raw.h +++ b/include/modest/style/raw.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,7 +24,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/modest/style/sheet.h b/include/modest/style/sheet.h index 2c48827..20162db 100644 --- a/include/modest/style/sheet.h +++ b/include/modest/style/sheet.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -53,7 +53,7 @@ struct modest_style_sheet { }; modest_style_sheet_t * modest_style_sheet_create(modest_t* modest); -modest_status_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet); +mystatus_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/style/type.h b/include/modest/style/type.h index e5f6305..0e99cf9 100644 --- a/include/modest/style/type.h +++ b/include/modest/style/type.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,7 +25,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -44,7 +44,7 @@ struct modest_style_type_display { void * modest_style_type_create(modest_t* modest, size_t size); -modest_status_t modest_style_type_init(modest_t* modest, void *data); +mystatus_t modest_style_type_init(modest_t* modest, void *data); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycore/incoming.h b/include/mycore/incoming.h new file mode 100644 index 0000000..145666c --- /dev/null +++ b/include/mycore/incoming.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_INCOMING_H +#define MyCORE_INCOMING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +struct mycore_incoming_buffer { + const char* data; + size_t length; // use of data + size_t size; // size of data + size_t offset; // begin global offset + + struct mycore_incoming_buffer* prev; + struct mycore_incoming_buffer* next; +}; + +mycore_incoming_buffer_t * mycore_incoming_buffer_add(mycore_incoming_buffer_t *current, mcobject_t *mcobject, const char *html, size_t html_size); +void mycore_incoming_buffer_clean(mycore_incoming_buffer_t *current); +mycore_incoming_buffer_t * mycore_incoming_buffer_split(mycore_incoming_buffer_t *current, mcobject_t *mcobject, size_t global_pos); + +mycore_incoming_buffer_t * mycore_incoming_buffer_find_by_position(mycore_incoming_buffer_t *inc_buf, size_t begin); + +const char * mycore_incoming_buffer_data(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_length(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_size(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_offset(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_relative_begin(mycore_incoming_buffer_t *inc_buf, size_t begin); +size_t mycore_incoming_buffer_available_length(mycore_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); + +mycore_incoming_buffer_t * mycore_incoming_buffer_next(mycore_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_t * mycore_incoming_buffer_prev(mycore_incoming_buffer_t *inc_buf); + +size_t mycore_incoming_buffer_convert_one_escaped_to_code_point(mycore_incoming_buffer_t **inc_buf, size_t *relative_pos); +size_t mycore_incoming_buffer_escaped_case_cmp(mycore_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_INCOMING_H */ diff --git a/include/mycore/myosi.h b/include/mycore/myosi.h new file mode 100644 index 0000000..563c44e --- /dev/null +++ b/include/mycore/myosi.h @@ -0,0 +1,169 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_MYOSI_H +#define MyCORE_MYOSI_H +#pragma once + +#include +#include +#include +#include +#include +#include + +#define MyCORE_STR_HELPER(x) #x +#define MyCORE_STR(x) MyCORE_STR_HELPER(x) + +#define MyCORE_VERSION_MAJOR 0 +#define MyCORE_VERSION_MINOR 1 +#define MyCORE_VERSION_PATCH 0 + +#define MyCORE_VERSION_STRING MyCORE_STR(MyCORE_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyCORE_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyCORE_VERSION_PATCH) + +#ifdef __cplusplus +extern "C" { +#endif + +/* Format */ +#ifdef MyCORE_OS_WINDOWS_NT +#define MyCORE_FORMAT_Z "%Iu" +#else +#define MyCORE_FORMAT_Z "%zu" +#endif + +#if defined(_MSC_VER) +# define MyCORE_DEPRECATED(func) __declspec(deprecated) func +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) +# define MyCORE_DEPRECATED(func) func __attribute__((deprecated)) +#else +# define MyCORE_DEPRECATED(func) func +#endif + +/* Debug */ +#define MyCORE_DEBUG(...) do {} while(0) +#define MyCORE_DEBUG_ERROR(...) do {} while(0) + +#define MyCORE_FAILED(_status_) ((_status_) != MyCORE_STATUS_OK) + +// base +/* + Very important!!! + + for mycore 0..008fff; MyCORE_STATUS_OK == 0x000000 + for myhtml 009000..0093ff; MyHTML_STATUS_OK == 0x000000 + for myencoding 009400..00942f; MyENCODING_STATUS_OK == 0x000000 + not occupied 009430..00ffff; + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..037777; MyRENDER_STATUS_OK == 0x000000 + for myurl 038888..0388ff; MyURL_STATUS_OK == 0x000000 + for myunicode 038900..038bff; MyUNICODE_STATUS_OK == 0x000000 + not occupied 038c00..03ffff; + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum mycore_status { + MyCORE_STATUS_OK = 0x0000, + MyCORE_STATUS_ERROR = 0x0001, + MyCORE_STATUS_ERROR_MEMORY_ALLOCATION = 0x0002, + MyCORE_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, + MyCORE_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, + MyCORE_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, + MyCORE_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, + MyCORE_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, + MyCORE_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, + MyCORE_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, + MyCORE_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, + MyCORE_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, + MyCORE_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, + MyCORE_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, + MyCORE_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, + MyCORE_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, + MyCORE_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, + MyCORE_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, + MyCORE_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, + MyCORE_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, + MyCORE_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, + MyCORE_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, + MyCORE_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, + MyCORE_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, + MyCORE_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x0050, + MyCORE_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x0051, + MyCORE_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0055, + MyCORE_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0056, + MyCORE_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0057, + MyCORE_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0058, + MyCORE_STATUS_ASYNC_ERROR_LOCK = 0x0060, + MyCORE_STATUS_ASYNC_ERROR_UNLOCK = 0x0061, + MyCORE_STATUS_ERROR_NO_FREE_SLOT = 0x0062, +} +typedef mycore_status_t; + +typedef unsigned int mystatus_t; + +/* thread */ +typedef struct mythread_queue_list_entry mythread_queue_list_entry_t; +typedef struct mythread_queue_thread_param mythread_queue_thread_param_t; +typedef struct mythread_queue_list mythread_queue_list_t; +typedef struct mythread_queue_node mythread_queue_node_t; +typedef struct mythread_queue mythread_queue_t; + +typedef size_t mythread_id_t; +typedef struct mythread_context mythread_context_t; +typedef struct mythread_entry mythread_entry_t; +typedef struct mythread mythread_t; + +/* mystring */ +typedef struct mycore_string_raw mycore_string_raw_t; +typedef struct mycore_string mycore_string_t; + +/* incoming buffer */ +typedef struct mycore_incoming_buffer mycore_incoming_buffer_t; + +/* callbacks */ +typedef mystatus_t (*mycore_callback_serialize_f)(const char* buffer, size_t size, void* ctx); + +void * mycore_malloc(size_t size); +void * mycore_realloc(void* dst, size_t size); +void * mycore_calloc(size_t num, size_t size); +void * mycore_free(void* dst); + +/* io */ +FILE * mycore_fopen(const char *filename, const char *mode); +int mycore_fclose(FILE *stream); + +size_t mycore_fread(void *buffer, size_t size, size_t count, FILE *stream); +size_t mycore_fwrite(const void *buffer, size_t size, size_t count, FILE *stream); +int mycore_fflush(FILE *stream); +int mycore_fseek(FILE* stream, long offset, int origin); +long mycore_ftell(FILE* stream); +int mycore_ferror(FILE *stream); + +void mycore_setbuf(FILE *stream, char *buffer); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_MYOSI_H */ + diff --git a/include/mycore/mystring.h b/include/mycore/mystring.h new file mode 100644 index 0000000..d333583 --- /dev/null +++ b/include/mycore/mystring.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_MYSTRING_H +#define MyCORE_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#define mycore_string_get(str, attr) str->attr +#define mycore_string_set(str, attr) mycore_string_get(str, attr) +#define mycore_string_len(str) mycore_string_get(str, length) + +#define MyCORE_STRING_PREPROCESSOR_CHECK_BUFFER_SIZE(str, unsigned_data) \ + if(str->length >= str->size) { \ + mycore_string_realloc(str, (str->length + 5)); \ + \ + unsigned_data = (unsigned char*)str->data; \ + } + +#define MyCORE_STRING_REALLOC_IF_NEED(str, need_length, upto) \ + if((str->length + need_length) >= str->size) { \ + mycore_string_realloc(str, (str->length + need_length + upto)); \ + } \ + +#define MyCORE_STRING_APPEND_BYTE_WITHOUT_REALLOC(onechar, str) \ + str->data[str->length] = onechar; \ + str->length++ + +#define MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto) \ + if(str->length >= str->size) { \ + mycore_string_realloc(str, (str->length + upto)); \ + } \ + str->data[str->length] = onechar + +#define MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC(onechar, str) \ + str->data[str->length] = onechar + +#define MyCORE_STRING_APPEND_BYTE(onechar, str, upto) \ + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto); \ + str->length++ + +struct mycore_string { + char* data; + size_t size; + size_t length; + + mchar_async_t *mchar; + size_t node_idx; +}; + +struct mycore_string_raw { + char* data; + size_t size; + size_t length; +}; + +typedef size_t mycore_string_index_t; + +char * mycore_string_init(mchar_async_t *mchar, size_t node_idx, mycore_string_t* str, size_t size); +char * mycore_string_realloc(mycore_string_t *str, size_t new_size); + +void mycore_string_clean(mycore_string_t* str); +void mycore_string_clean_all(mycore_string_t* str); +mycore_string_t * mycore_string_destroy(mycore_string_t* str, bool destroy_obj); + +void mycore_string_raw_clean(mycore_string_raw_t* str_raw); +void mycore_string_raw_clean_all(mycore_string_raw_t* str_raw); +mycore_string_raw_t * mycore_string_raw_destroy(mycore_string_raw_t* str_raw, bool destroy_obj); + +/* basic api */ +char * mycore_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); +char * mycore_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); +void mycore_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); + +char * mycore_string_data(mycore_string_t *str); +size_t mycore_string_length(mycore_string_t *str); +size_t mycore_string_size(mycore_string_t *str); +char * mycore_string_data_set(mycore_string_t *str, char *data); +size_t mycore_string_size_set(mycore_string_t *str, size_t size); +size_t mycore_string_length_set(mycore_string_t *str, size_t length); + +/* append */ +void mycore_string_append(mycore_string_t* str, const char* data, size_t length); +void mycore_string_append_one(mycore_string_t* str, const char data); +void mycore_string_append_lowercase(mycore_string_t* str, const char* data, size_t length); +void mycore_string_append_with_replacement_null_characters(mycore_string_t* str, const char* buff, size_t length); + +size_t mycore_string_raw_set_replacement_character(mycore_string_t* target, size_t position); + +/* other functions */ +void mycore_string_copy(mycore_string_t* dest, mycore_string_t* target); +size_t mycore_string_raw_copy(char* str1, const char* str2, size_t size); +void mycore_string_stay_only_whitespace(mycore_string_t* target); +size_t mycore_string_crop_whitespace_from_begin(mycore_string_t* target); +size_t mycore_string_whitespace_from_begin(mycore_string_t* target); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mycore_mystring_h */ diff --git a/include/mycore/mythread.h b/include/mycore/mythread.h new file mode 100644 index 0000000..65096ec --- /dev/null +++ b/include/mycore/mythread.h @@ -0,0 +1,159 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_THREAD_H +#define MyCORE_THREAD_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#ifdef MyCORE_BUILD_WITHOUT_THREADS + +struct mythread { + int sys_last_error; +}; + +#else +/* functions */ +typedef void (*mythread_callback_before_entry_join_f)(mythread_t* mythread, mythread_entry_t* entry, void* ctx); +typedef void * (*mythread_process_f)(void* arg); +typedef void (*mythread_work_f)(mythread_id_t thread_id, void* arg); + +void * mythread_function_queue_stream(void *arg); +void * mythread_function_queue_batch(void *arg); +void * mythread_function(void *arg); + +enum mythread_thread_opt { + MyTHREAD_OPT_UNDEF = 0x00, + MyTHREAD_OPT_WAIT = 0x01, + MyTHREAD_OPT_QUIT = 0x02, + MyTHREAD_OPT_STOP = 0x04, + MyTHREAD_OPT_DONE = 0x08 +} +typedef mythread_thread_opt_t; + +enum mythread_type { + MyTHREAD_TYPE_STREAM = 0x00, + MyTHREAD_TYPE_BATCH = 0x01 +} +typedef mythread_type_t; + +// thread +struct mythread_context { + mythread_id_t id; + mythread_work_f func; + + volatile size_t t_count; + volatile mythread_thread_opt_t opt; + + mystatus_t status; + + void* mutex; + void* timespec; + mythread_t* mythread; +}; + +struct mythread_entry { + void* thread; + + mythread_context_t context; + mythread_process_f process_func; +}; + +struct mythread { + mythread_entry_t *entries; + size_t entries_length; + size_t entries_size; + size_t id_increase; + + void* context; + void* attr; + void* timespec; + + int sys_last_error; + + mythread_type_t type; + volatile mythread_thread_opt_t opt; +}; + +mythread_t * mythread_create(void); +mystatus_t mythread_init(mythread_t *mythread, mythread_type_t type, size_t threads_count, size_t id_increase); +void mythread_clean(mythread_t *mythread); +mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx, bool self_destroy); + +mythread_id_t myhread_increase_id_by_entry_id(mythread_t* mythread, mythread_id_t thread_id); + +/* set for all threads */ +mystatus_t mythread_join(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_quit(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_stop(mythread_t *mythread); +mystatus_t mythread_resume(mythread_t *mythread, mythread_thread_opt_t send_opt); +mystatus_t mythread_suspend(mythread_t *mythread); +mystatus_t mythread_check_status(mythread_t *mythread); + +mythread_thread_opt_t mythread_option(mythread_t *mythread); +void mythread_option_set(mythread_t *mythread, mythread_thread_opt_t opt); + +/* Entries */ +mystatus_t myhread_entry_create(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt); + +mystatus_t mythread_entry_join(mythread_entry_t* entry, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_entry_quit(mythread_entry_t* entry, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_entry_stop(mythread_entry_t* entry); +mystatus_t mythread_entry_resume(mythread_entry_t* entry, mythread_thread_opt_t send_opt); +mystatus_t mythread_entry_suspend(mythread_entry_t* entry); +mystatus_t mythread_entry_status(mythread_entry_t* entry); +mythread_t * mythread_entry_mythread(mythread_entry_t* entry); + +/* API for ports */ +void * mythread_thread_create(mythread_t *mythread, mythread_process_f process_func, void* ctx); +mystatus_t mythread_thread_join(mythread_t *mythread, void* thread); +mystatus_t mythread_thread_cancel(mythread_t *mythread, void* thread); +mystatus_t mythread_thread_destroy(mythread_t *mythread, void* thread); + +void * mythread_thread_attr_init(mythread_t *mythread); +void mythread_thread_attr_clean(mythread_t *mythread, void* attr); +void mythread_thread_attr_destroy(mythread_t *mythread, void* attr); + +void * mythread_mutex_create(mythread_t *mythread); +mystatus_t mythread_mutex_post(mythread_t *mythread, void* mutex); +mystatus_t mythread_mutex_wait(mythread_t *mythread, void* mutex); +void mythread_mutex_close(mythread_t *mythread, void* mutex); + +void * mythread_nanosleep_create(mythread_t* mythread); +void mythread_nanosleep_clean(void* timespec); +void mythread_nanosleep_destroy(void* timespec); +mystatus_t mythread_nanosleep_sleep(void* timespec); + +/* callback */ +void mythread_callback_quit(mythread_t* mythread, mythread_entry_t* entry, void* ctx); + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_THREAD_H */ diff --git a/include/mycore/perf.h b/include/mycore/perf.h new file mode 100644 index 0000000..99e5f7e --- /dev/null +++ b/include/mycore/perf.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_PERF_H +#define MyCORE_PERF_H +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifdef MyCORE_WITH_PERF +void * mycore_perf_create(void); +void mycore_perf_clean(void* perf); +void mycore_perf_destroy(void* perf); + +mycore_status_t myhtml_perf_begin(void* perf); +mycore_status_t myhtml_perf_end(void* perf); +double myhtml_perf_in_sec(void* perf); + +unsigned long long mycore_perf_clock(void); +unsigned long long mycore_perf_frequency(void); +#endif /* MyCORE_WITH_PERF */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_PERF_H */ diff --git a/include/mycore/thread_queue.h b/include/mycore/thread_queue.h new file mode 100644 index 0000000..e833b35 --- /dev/null +++ b/include/mycore/thread_queue.h @@ -0,0 +1,110 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_THREAD_QUEUE_H +#define MyCORE_THREAD_QUEUE_H +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// queue +struct mythread_queue_node { + void* context; + void* args; + + mythread_queue_node_t* prev; +}; + +struct mythread_queue_thread_param { + volatile size_t use; +}; + +struct mythread_queue_list_entry { + mythread_queue_t* queue; + mythread_queue_thread_param_t* thread_param; + size_t thread_param_size; + + mythread_queue_list_entry_t* next; + mythread_queue_list_entry_t* prev; +}; + +struct mythread_queue_list { + mythread_queue_list_entry_t *first; + mythread_queue_list_entry_t *last; + + volatile size_t count; +}; + +struct mythread_queue { + mythread_queue_node_t **nodes; + + size_t nodes_pos; + size_t nodes_pos_size; + size_t nodes_length; + + volatile size_t nodes_uses; + volatile size_t nodes_size; + volatile size_t nodes_root; +}; + +mythread_queue_t * mythread_queue_create(void); +mystatus_t mythread_queue_init(mythread_queue_t* queue, size_t size); +void mythread_queue_clean(mythread_queue_t* queue); +mythread_queue_t * mythread_queue_destroy(mythread_queue_t* token); + +void mythread_queue_node_clean(mythread_queue_node_t* qnode); +size_t mythread_queue_count_used_node(mythread_queue_t* queue); + +mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode); +mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue); + +mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, mystatus_t *status); +mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, mystatus_t *status); +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, mystatus_t *status); +#endif + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mythread_queue_list_t * mythread_queue_list_create(mystatus_t *status); +void mythread_queue_list_destroy(mythread_queue_list_t* queue_list); +size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list); + +void mythread_queue_list_wait_for_done(mythread_t* mythread, mythread_queue_list_t* queue_list); +bool mythread_queue_list_see_for_done(mythread_t* mythread, mythread_queue_list_t* queue_list); +bool mythread_queue_list_see_for_done_by_thread(mythread_t* mythread, mythread_queue_list_t* queue_list, mythread_id_t thread_id); + +mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t** mythread_list, size_t list_size, mythread_queue_list_t* queue_list, mythread_queue_t* queue, size_t thread_param_size, mystatus_t* status); +mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t** mythread_list, size_t list_size, mythread_queue_list_t *queue_list, mythread_queue_list_entry_t *entry, bool destroy_queue); +void mythread_queue_list_entry_clean(mythread_queue_list_entry_t *entry); +void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry); +void mythread_queue_list_entry_make_batch(mythread_t* mythread, mythread_queue_list_entry_t* entry, size_t from, size_t length); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_THREAD_QUEUE_H */ diff --git a/include/mycore/utils.h b/include/mycore/utils.h new file mode 100644 index 0000000..e4a7e9f --- /dev/null +++ b/include/mycore/utils.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_H +#define MyCORE_UTILS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define mycore_utils_whithspace(onechar, action, logic) \ + (onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r') + +size_t mycore_power(size_t t, size_t k); +size_t mycore_strncasecmp(const char* str1, const char* str2, size_t size); +size_t mycore_strcasecmp(const char* str1, const char* str2); +size_t mycore_strncmp(const char* str1, const char* str2, size_t size); +size_t mycore_strcmp(const char* str1, const char* str2); +size_t mycore_strcmp_ws(const char* str1, const char* str2); +bool mycore_ustrcasecmp_without_checks_by_secondary(const unsigned char* ustr1, const unsigned char* ustr2); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* utils_h */ diff --git a/include/mycore/utils/avl_tree.h b/include/mycore/utils/avl_tree.h new file mode 100644 index 0000000..5242468 --- /dev/null +++ b/include/mycore/utils/avl_tree.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_AVL_TREE_H +#define MyCORE_UTILS_AVL_TREE_H +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycore_utils_avl_tree_node mycore_utils_avl_tree_node_t; +typedef void (*mycore_utils_avl_tree_node_callback_f)(mycore_utils_avl_tree_node_t* avl_tree_node, void* ctx); + +struct mycore_utils_avl_tree_node { + void *value; + size_t type; + + mycore_utils_avl_tree_node_t* left; + mycore_utils_avl_tree_node_t* right; + mycore_utils_avl_tree_node_t* parent; + + short height; +}; + +struct mycore_utils_avl_tree { + mcobject_t* mc_nodes; +} +typedef mycore_utils_avl_tree_t; + +mycore_utils_avl_tree_t * mycore_utils_avl_tree_create(void); +mystatus_t mycore_utils_avl_tree_init(mycore_utils_avl_tree_t* avl_tree); +void mycore_utils_avl_tree_clean(mycore_utils_avl_tree_t* avl_tree); +mycore_utils_avl_tree_t * mycore_utils_avl_tree_destroy(mycore_utils_avl_tree_t* avl_tree, bool self_destroy); + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_node_create_root(mycore_utils_avl_tree_t* avl_tree, size_t type, void* value); + +void mycore_utils_avl_tree_add(mycore_utils_avl_tree_t* avl_tree, mycore_utils_avl_tree_node_t** root, size_t type, void* value); +void * mycore_utils_avl_tree_delete(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t** root, size_t type); +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_search_by_type(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t* node, size_t type); + +void mycore_utils_avl_tree_list_all_nodes(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t* root, mycore_utils_avl_tree_node_callback_f callback, void* ctx); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_AVL_TREE_H */ diff --git a/include/mycore/utils/mchar_async.h b/include/mycore/utils/mchar_async.h new file mode 100644 index 0000000..45a346c --- /dev/null +++ b/include/mycore/utils/mchar_async.h @@ -0,0 +1,131 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCHAR_ASYNC_H +#define MyCORE_UTILS_MCHAR_ASYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#define mchar_async_cache_has_nodes(cache) cache.count + +typedef struct mchar_async_node mchar_async_node_t; + +struct mchar_async_cache_node { + void *value; + size_t size; + + size_t left; + size_t right; + size_t parent; +} +typedef mchar_async_cache_node_t; + +struct mchar_async_chunk { + char *begin; + size_t length; + size_t size; + + struct mchar_async_chunk *next; + struct mchar_async_chunk *prev; +} +typedef mchar_async_chunk_t; + +struct mchar_async_cache { + mchar_async_cache_node_t *nodes; + size_t nodes_size; + size_t nodes_length; + size_t nodes_root; + + size_t count; + + size_t *index; + size_t index_length; + size_t index_size; +} +typedef mchar_async_cache_t; + +struct mchar_async_node { + mchar_async_chunk_t *chunk; + mchar_async_cache_t cache; +}; + +struct mchar_async { + size_t origin_size; + + mchar_async_chunk_t **chunks; + size_t chunks_pos_size; + size_t chunks_pos_length; + size_t chunks_size; + size_t chunks_length; + + mchar_async_cache_t chunk_cache; + + mchar_async_node_t *nodes; + size_t nodes_length; + size_t nodes_size; + + size_t *nodes_cache; + size_t nodes_cache_length; + size_t nodes_cache_size; + + mcsync_t *mcsync; +} +typedef mchar_async_t; + + +mchar_async_t * mchar_async_create(void); +mystatus_t mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size); +mystatus_t mchar_async_clean(mchar_async_t *mchar_async); +mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self); + +char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size); +char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size); +void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry); + +size_t mchar_async_node_add(mchar_async_t *mchar_async, mystatus_t* status); +void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx); +void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx); + +mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length); +char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len); +char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len); + +size_t mchar_async_get_size_by_data(const char *data); + +// cache +mystatus_t mchar_async_cache_init(mchar_async_cache_t *cache); +mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy); +void mchar_async_cache_clean(mchar_async_cache_t *cache); + +void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size); +size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mchar_async_h */ + diff --git a/include/mycore/utils/mcobject.h b/include/mycore/utils/mcobject.h new file mode 100644 index 0000000..1ba6893 --- /dev/null +++ b/include/mycore/utils/mcobject.h @@ -0,0 +1,70 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCOBJECT_H +#define MyCORE_UTILS_MCOBJECT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct mcobject_chunk { + unsigned char *begin; + size_t length; + size_t size; + + struct mcobject_chunk *next; + struct mcobject_chunk *prev; +} +typedef mcobject_chunk_t; + +struct mcobject { + mcobject_chunk_t *chunk; + + void **cache; + size_t cache_size; + size_t cache_length; + + size_t struct_size; + size_t chunk_size; +} +typedef mcobject_t; + + +mcobject_t * mcobject_create(void); +mystatus_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size); +void mcobject_clean(mcobject_t *mcobject); +mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self); + +void mcobject_chunk_malloc(mcobject_t* mcobject, mystatus_t* status); + +void * mcobject_malloc(mcobject_t *mcobject, mystatus_t* status); +mystatus_t mcobject_free(mcobject_t *mcobject, void *entry); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_MCOBJECT_H */ + diff --git a/include/mycore/utils/mcobject_async.h b/include/mycore/utils/mcobject_async.h new file mode 100644 index 0000000..2b09b3c --- /dev/null +++ b/include/mycore/utils/mcobject_async.h @@ -0,0 +1,114 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCOBJECT_ASYNC_H +#define MyCORE_UTILS_MCOBJECT_ASYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +enum mcobject_async_status { + MCOBJECT_ASYNC_STATUS_OK = 0, + MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION = 1, + MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION = 2, + MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION = 3, + MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION = 4, + MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID = 5, + MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC = 6 +} +typedef mcobject_async_status_t; + +struct mcobject_async_chunk { + unsigned char *begin; + size_t length; + size_t size; + + struct mcobject_async_chunk *next; + struct mcobject_async_chunk *prev; +} +typedef mcobject_async_chunk_t; + +struct mcobject_async_node { + mcobject_async_chunk_t *chunk; + + void **cache; + size_t cache_size; + size_t cache_length; +} +typedef mcobject_async_node_t; + +struct mcobject_async { + size_t origin_size; + size_t struct_size; + size_t struct_size_sn; + + mcobject_async_chunk_t **chunk_cache; + size_t chunk_cache_size; + size_t chunk_cache_length; + + mcobject_async_chunk_t **chunks; + size_t chunks_pos_size; + size_t chunks_pos_length; + size_t chunks_size; + size_t chunks_length; + + mcobject_async_node_t *nodes; + size_t nodes_length; + size_t nodes_size; + + size_t *nodes_cache; + size_t nodes_cache_length; + size_t nodes_cache_size; + + mcsync_t *mcsync; +} +typedef mcobject_async_t; + +mcobject_async_t * mcobject_async_create(void); +mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size); + +void mcobject_async_clean(mcobject_async_t *mcobj_async); +mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self); + +size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status); +void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx); +void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async); +void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx); + +void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status); +mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry); + +mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); +mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mcobject_async_h */ + + + + diff --git a/include/mycore/utils/mcsimple.h b/include/mycore/utils/mcsimple.h new file mode 100644 index 0000000..90fd87d --- /dev/null +++ b/include/mycore/utils/mcsimple.h @@ -0,0 +1,61 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCSIMPLE_H +#define MyCORE_UTILS_MCSIMPLE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct mcsimple { + size_t struct_size; + + uint8_t **list; + + size_t list_pos_size; + size_t list_pos_length; + size_t list_pos_length_used; + size_t list_size; + size_t list_length; +} +typedef mcsimple_t; + + +mcsimple_t * mcsimple_create(void); +void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size); +void mcsimple_clean(mcsimple_t *mcsimple); +mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self); + +uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos); + +void * mcsimple_malloc(mcsimple_t *mcsimple); +void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_MCSIMPLE_H */ + diff --git a/include/mycore/utils/mcsync.h b/include/mycore/utils/mcsync.h new file mode 100644 index 0000000..1e272e0 --- /dev/null +++ b/include/mycore/utils/mcsync.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCSYNC_H +#define MyCORE_UTILS_MCSYNC_H +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum mcsync_status { + MCSYNC_STATUS_OK = 0x00, + MCSYNC_STATUS_NOT_OK = 0x01, + MCSYNC_STATUS_ERROR_MEM_ALLOCATE = 0x02 +} +typedef mcsync_status_t; + +struct mcsync { + int* spinlock; + void* mutex; +} +typedef mcsync_t; + +mcsync_t * mcsync_create(void); +mcsync_status_t mcsync_init(mcsync_t* mcsync); +void mcsync_clean(mcsync_t* mcsync); +mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self); + +mcsync_status_t mcsync_lock(mcsync_t* mcsync); +mcsync_status_t mcsync_unlock(mcsync_t* mcsync); + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mcsync_status_t mcsync_spin_lock(void* spinlock); +mcsync_status_t mcsync_spin_unlock(void* spinlock); + +mcsync_status_t mcsync_mutex_lock(void* mutex); +mcsync_status_t mcsync_mutex_try_lock(void* mutex); +mcsync_status_t mcsync_mutex_unlock(void* mutex); + +void * mcsync_spin_create(void); +mcsync_status_t mcsync_spin_init(void* spinlock); +void mcsync_spin_clean(void* spinlock); +void mcsync_spin_destroy(void* spinlock); + +void * mcsync_mutex_create(void); +mcsync_status_t mcsync_mutex_init(void* mutex); +void mcsync_mutex_clean(void* mutex); +void mcsync_mutex_destroy(void* mutex); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mcsync_h */ diff --git a/include/mycore/utils/mctree.h b/include/mycore/utils/mctree.h new file mode 100644 index 0000000..98bb6ba --- /dev/null +++ b/include/mycore/utils/mctree.h @@ -0,0 +1,97 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCTREE_H +#define MyCORE_UTILS_MCTREE_H +#pragma once + +#include +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define mctree_node_get_free_id(mctree) mctree->nodes_length + +#define mctree_node_clean(mctree, idx) \ + mctree->nodes[idx].str = NULL; \ + mctree->nodes[idx].value = NULL; \ + mctree->nodes[idx].child_count = 0; \ + mctree->nodes[idx].prev = 0; \ + mctree->nodes[idx].next = 0; \ + mctree->nodes[idx].child = 0 + +#define mctree_node_add(mctree) \ + mctree->nodes_length++; \ + if(mctree->nodes_length >= mctree->nodes_size) { \ + mctree->nodes_size = mctree->nodes_length + 4096; \ + mctree->nodes = (mctree_node_t*)mycore_realloc(mctree->nodes, \ + sizeof(mctree_node_t) * mctree->nodes_size); \ + } \ + mctree_node_clean(mctree, mctree->nodes_length) + +#define mctree_make_first_idx(mctree, key, size) \ + ((mycore_string_chars_lowercase_map[ (const unsigned char)(key[0]) ] + mycore_string_chars_lowercase_map[ (const unsigned char)(key[size - 1]) ]) % mctree->start_size) + 1 + + +typedef size_t mctree_index_t; + +struct mctree_node { + const char* str; + size_t str_size; + void* value; + + size_t child_count; + mctree_index_t prev; + mctree_index_t next; + mctree_index_t child; +} +typedef mctree_node_t; + +struct mctree_tree { + mctree_node_t* nodes; + size_t nodes_length; + size_t nodes_size; + + size_t start_size; +} +typedef mctree_t; + +typedef void (*mctree_before_insert_f)(const char* key, size_t key_size, void **value); + + +mctree_t * mctree_create(size_t start_size); +void mctree_clean(mctree_t* mctree); +mctree_t * mctree_destroy(mctree_t* mctree); + +mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert); +mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size); +mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* defined(__mhtml__mtree__) */ diff --git a/include/mycore/utils/mhash.h b/include/mycore/utils/mhash.h new file mode 100644 index 0000000..0d968f7 --- /dev/null +++ b/include/mycore/utils/mhash.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MHASH_H +#define MyCORE_UTILS_MHASH_H + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycore_utils_mhash_entry mycore_utils_mhash_entry_t; + +struct mycore_utils_mhash_entry { + char* key; + size_t key_length; + + void *value; + + mycore_utils_mhash_entry_t* next; +}; + +struct mycore_utils_mhash { + mchar_async_t* mchar_obj; + size_t mchar_node; + + mycore_utils_mhash_entry_t** table; + size_t table_size; + size_t table_length; + + size_t table_max_depth; +} +typedef mycore_utils_mhash_t; + +mycore_utils_mhash_t * mycore_utils_mhash_create(void); +mystatus_t mycore_utils_mhash_init(mycore_utils_mhash_t* mhash, size_t table_size, size_t depth); +void mycore_utils_mhash_clean(mycore_utils_mhash_t* mhash); +mycore_utils_mhash_t * mycore_utils_mhash_destroy(mycore_utils_mhash_t* mhash, bool self_destroy); +mycore_utils_mhash_entry_t * mycore_utils_mhash_create_entry(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); + +mycore_utils_mhash_entry_t * mycore_utils_mhash_add(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); +mycore_utils_mhash_entry_t * mycore_utils_mhash_search(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); +mycore_utils_mhash_entry_t * mycore_utils_mhash_add_with_choice(mycore_utils_mhash_t* mhash, const char* key, size_t key_size); + +mycore_utils_mhash_entry_t * mycore_utils_mhash_entry_by_id(mycore_utils_mhash_t* mhash, size_t id); +size_t mycore_utils_mhash_get_table_size(mycore_utils_mhash_t* mhash); + +mycore_utils_mhash_entry_t ** mycore_utils_mhash_rebuld(mycore_utils_mhash_t* mhash); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_MHASH_H */ diff --git a/include/mycore/utils/resources.h b/include/mycore/utils/resources.h new file mode 100644 index 0000000..da99a00 --- /dev/null +++ b/include/mycore/utils/resources.h @@ -0,0 +1,317 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_RESOURCES_H +#define MyCORE_UTILS_RESOURCES_H +#pragma once + +#include + +#define MyCORE_STRING_MAP_CHAR_OTHER '\000' +#define MyCORE_STRING_MAP_CHAR_A_Z_a_z '\001' +#define MyCORE_STRING_MAP_CHAR_WHITESPACE '\002' + +static const unsigned char mycore_string_chars_num_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char mycore_string_chars_hex_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char mycore_string_chars_lowercase_map[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, + 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, + 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff +}; + +static const unsigned char mycore_string_chars_uppercase_map[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, + 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, + 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff +}; + +static const size_t replacement_character[] = { + 65533, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 8364, 129, 8218, 402, 8222, 8230, 8224, + 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, + 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, + 8482, 353, 8250, 339, 157, 382, 376 +}; + +static const size_t mycore_string_alphanumeric_character[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const size_t mycore_string_alpha_character[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char mycore_tokenizer_chars_map[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char mycore_string_hex_to_char_map[] = { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00 +}; + +static const char * mycore_string_char_to_two_hex_value[257] = { + "00", "01", "02", "03", "04", "05", "06", "07", + "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", + "10", "11", "12", "13", "14", "15", "16", "17", + "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", + "20", "21", "22", "23", "24", "25", "26", "27", + "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", + "30", "31", "32", "33", "34", "35", "36", "37", + "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", + "40", "41", "42", "43", "44", "45", "46", "47", + "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", + "50", "51", "52", "53", "54", "55", "56", "57", + "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", + "60", "61", "62", "63", "64", "65", "66", "67", + "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", + "70", "71", "72", "73", "74", "75", "76", "77", + "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", + "80", "81", "82", "83", "84", "85", "86", "87", + "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", + "90", "91", "92", "93", "94", "95", "96", "97", + "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", + "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", + "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", + "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", + "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", + "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", + "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", + "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF", + NULL +}; + +#endif /* MyCORE_UTILS_RESOURCES_H */ diff --git a/include/mycss/an_plus_b.h b/include/mycss/an_plus_b.h index b3d72e5..7308fc3 100644 --- a/include/mycss/an_plus_b.h +++ b/include/mycss/an_plus_b.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,15 +45,15 @@ struct mycss_an_plus_b_entry { }; mycss_an_plus_b_t * mycss_an_plus_b_create(void); -mycss_status_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb); -mycss_status_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb); +mystatus_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb); +mystatus_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb); mycss_an_plus_b_t * mycss_an_plus_b_destroy(mycss_an_plus_b_t* anb, bool self_destroy); mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry); void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry); mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy); -void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycss_callback_serialization_f callback, void* context); +void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycore_callback_serialize_f callback, void* context); void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry); diff --git a/include/mycss/api.h b/include/mycss/api.h index 02a8594..9daef46 100644 --- a/include/mycss/api.h +++ b/include/mycss/api.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -36,10 +36,14 @@ */ #define MyCSS_VERSION_MAJOR 0 -#define MyCSS_VERSION_MINOR 0 -#define MyCSS_VERSION_PATCH 9 +#define MyCSS_VERSION_MINOR 1 +#define MyCSS_VERSION_PATCH 0 -#include +#include +#include +#include +#include +#include #ifdef __cplusplus extern "C" { @@ -52,7 +56,6 @@ extern "C" { // base /* Very important!!! - see modest/myosi.h:modest_status_tv */ enum mycss_status { MyCSS_STATUS_OK = 0x000000, @@ -185,7 +188,7 @@ mycss_create(void); * * @return MyCSS_STATUS_OK if successful, otherwise an error status value. */ -mycss_status_t +mystatus_t mycss_init(mycss_t* mycss); /** @@ -203,7 +206,7 @@ mycss_destroy(mycss_t* mycss, bool self_destroy); * Parsing CSS * * @param[in] previously created structure mycss_entry_t* - * @param[in] Now is not working! Coming Soon. Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Now is not working! Coming Soon. Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] CSS data * @param[in] CSS data size * @@ -211,8 +214,8 @@ mycss_destroy(mycss_t* mycss, bool self_destroy); * * @return MyCSS_STATUS_OK if successful, otherwise an error status */ -mycss_status_t -mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); +mystatus_t +mycss_parse(mycss_entry_t* entry, myencoding_t encoding, const char* css, size_t css_size); /** * Parsing CSS chunk. For End Parsing call mycss_parse_chunk_end function @@ -225,7 +228,7 @@ mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, s * * @return MyCSS_STATUS_OK if successful, otherwise an error status */ -mycss_status_t +mystatus_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); /** @@ -235,7 +238,7 @@ mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); * * @return MyCSS_STATUS_OK if successful, otherwise an error status */ -mycss_status_t +mystatus_t mycss_parse_chunk_end(mycss_entry_t* entry); /*********************************************************************************** @@ -260,7 +263,7 @@ mycss_entry_create(void); * * @return MyCSS_STATUS_OK if successful, otherwise an error status value. */ -mycss_status_t +mystatus_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); /** @@ -270,7 +273,7 @@ mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); * * @return MyCSS_STATUS_OK if successful, otherwise an error status value. */ -mycss_status_t +mystatus_t mycss_entry_clean_all(mycss_entry_t* entry); /** @@ -321,9 +324,9 @@ mycss_entry_token_count(mycss_entry_t* entry); * * @param[in] mycss_entry_t* * - * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + * @return mycore_incoming_buffer_t* if successful, otherwise an NULL value. */ -myhtml_incoming_buffer_t* +mycore_incoming_buffer_t* mycss_entry_incoming_buffer_current(mycss_entry_t* entry); /** @@ -332,9 +335,9 @@ mycss_entry_incoming_buffer_current(mycss_entry_t* entry); * * @param[in] mycss_entry_t* * - * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + * @return mycore_incoming_buffer_t* if successful, otherwise an NULL value. */ -myhtml_incoming_buffer_t* +mycore_incoming_buffer_t* mycss_entry_incoming_buffer_first(mycss_entry_t* entry); /*********************************************************************************** @@ -400,14 +403,14 @@ mycss_token_name_by_type(mycss_token_type_t type); * * @param[in] mycss_entry_t* * @param[in] mycss_token_t*, token from which data will be obtained - * @param[in] myhtml_string_t*, a pointer to the row in which the data will be written - * @param[in] initialization myhtml_string_t* object + * @param[in] mycore_string_t*, a pointer to the row in which the data will be written + * @param[in] initialization mycore_string_t* object * * @return length of processed data */ size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, - myhtml_string_t* str, bool init_string); + mycore_string_t* str, bool init_string); /*********************************************************************************** * @@ -424,20 +427,20 @@ mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, * @param[in] mycss_entry_t* * @param[in] Input character encoding. * See https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h - * myhtml_encoding_t + * myencoding_t * */ void -mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); +mycss_encoding_set(mycss_entry_t* entry, myencoding_t encoding); /** * Get character encoding for current stream * * @param[in] mycss_entry_t* * - * @return myhtml_encoding_t + * @return myencoding_t */ -myhtml_encoding_t +myencoding_t mycss_encoding_get(mycss_entry_t* entry); /** @@ -446,16 +449,16 @@ mycss_encoding_get(mycss_entry_t* entry); * See for information: * https://www.w3.org/TR/css-syntax-3/#get-an-encoding * https://www.w3.org/TR/css-syntax-3/#charset-rule - * myhtml_encoding_by_name in https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h + * myencoding_by_name in https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h * - * If @charset rule is missing or encoding not found return MyHTML_ENCODING_UTF_8 by default + * If @charset rule is missing or encoding not found return MyENCODING_UTF_8 by default * * @param[in] css data stream * @param[in] css data stream size * - * @return myhtml_encoding_t + * @return myencoding_t */ -myhtml_encoding_t +myencoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); /*********************************************************************************** diff --git a/include/mycss/check.h b/include/mycss/check.h index 2f8f39c..8b07b9e 100644 --- a/include/mycss/check.h +++ b/include/mycss/check.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/convert.h b/include/mycss/convert.h index 49e72d6..d36c452 100644 --- a/include/mycss/convert.h +++ b/include/mycss/convert.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,7 +30,7 @@ extern "C" { #include #include -const char * mycss_convert_split_dimension_string(myhtml_string_t* str, double* value, bool* is_float); +const char * mycss_convert_split_dimension_string(mycore_string_t* str, double* value, bool* is_float); size_t mycss_convert_data_to_integer(const char* data, size_t size, long* return_num); size_t mycss_convert_data_to_double(const char *data, size_t size, double *return_num, bool* is_float); diff --git a/include/mycss/declaration/default.h b/include/mycss/declaration/default.h index 565e7e9..ca78c4b 100644 --- a/include/mycss/declaration/default.h +++ b/include/mycss/declaration/default.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/default_entries.h b/include/mycss/declaration/default_entries.h index f1d0df5..5016ec3 100644 --- a/include/mycss/declaration/default_entries.h +++ b/include/mycss/declaration/default_entries.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/default_resources.h b/include/mycss/declaration/default_resources.h index 9c96d47..97d6348 100644 --- a/include/mycss/declaration/default_resources.h +++ b/include/mycss/declaration/default_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/entry.h b/include/mycss/declaration/entry.h index 9b0d741..8975d89 100644 --- a/include/mycss/declaration/entry.h +++ b/include/mycss/declaration/entry.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,7 +31,7 @@ extern "C" { #endif -mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, mystatus_t* status); void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); mycss_declaration_entry_t * mycss_declaration_entry_destroy(mycss_declaration_t* declaration, mycss_declaration_entry_t* decl_entry, bool self_destroy); diff --git a/include/mycss/declaration/entry_destroy.h b/include/mycss/declaration/entry_destroy.h index 3e6e774..454457d 100644 --- a/include/mycss/declaration/entry_destroy.h +++ b/include/mycss/declaration/entry_destroy.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/entry_destroy_resources.h b/include/mycss/declaration/entry_destroy_resources.h index 6d21555..206fafe 100644 --- a/include/mycss/declaration/entry_destroy_resources.h +++ b/include/mycss/declaration/entry_destroy_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/init.h b/include/mycss/declaration/init.h index 448290e..6db94dd 100644 --- a/include/mycss/declaration/init.h +++ b/include/mycss/declaration/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,18 +30,18 @@ extern "C" { #endif mycss_declaration_t * mycss_declaration_create(void); -mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration); +mystatus_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration); void mycss_declaration_clean_all(mycss_declaration_t* declaration); void mycss_declaration_clean(mycss_declaration_t* declaration); mycss_declaration_t * mycss_declaration_destroy(mycss_declaration_t* declaration, bool self_destroy); void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); -mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, mystatus_t* status); void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); -mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); +mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status); mycss_token_type_t mycss_declaration_ending_token_type(mycss_declaration_t* declaration); void mycss_declaration_ending_token_type_set(mycss_declaration_t* declaration, mycss_token_type_t ending_token_type); diff --git a/include/mycss/declaration/myosi.h b/include/mycss/declaration/myosi.h index b696a9e..726f001 100644 --- a/include/mycss/declaration/myosi.h +++ b/include/mycss/declaration/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/mycss/declaration/parser.h b/include/mycss/declaration/parser.h index ab4e4c2..eae2ad7 100644 --- a/include/mycss/declaration/parser.h +++ b/include/mycss/declaration/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/serialization.h b/include/mycss/declaration/serialization.h index 04f92e8..54a8715 100644 --- a/include/mycss/declaration/serialization.h +++ b/include/mycss/declaration/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,31 +32,31 @@ extern "C" { #endif typedef bool (*mycss_declaration_serialization_f)(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context); + mycore_callback_serialize_f callback, void* context); -bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_entry_only_value(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_entry_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_entry_only_value_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycss_callback_serialization_f callback, void* context); +bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_entry_only_value(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_entry_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_entry_only_value_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycore_callback_serialize_f callback, void* context); -bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_shorthand_four(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_shorthand_two(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_shorthand_two_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_type_list(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_border_radius(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_text_decoration(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_text_decoration_line(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_text_decoration_skip(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_font(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_image(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_repeat(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_size(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_border_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); +bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_shorthand_four(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_shorthand_two(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_shorthand_two_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_type_list(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_border_radius(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_text_decoration(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_text_decoration_line(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_text_decoration_skip(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_font(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_image(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_repeat(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_size(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_border_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/declaration/serialization_resources.h b/include/mycss/declaration/serialization_resources.h index a9fa1a1..09ff31b 100644 --- a/include/mycss/declaration/serialization_resources.h +++ b/include/mycss/declaration/serialization_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/declaration/state.h b/include/mycss/declaration/state.h index 4616196..ce991ca 100644 --- a/include/mycss/declaration/state.h +++ b/include/mycss/declaration/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/entry.h b/include/mycss/entry.h index 35abcee..fb080d3 100644 --- a/include/mycss/entry.h +++ b/include/mycss/entry.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -40,8 +40,8 @@ extern "C" { #include #include #include -#include -#include +#include +#include struct mycss_entry_parser_list_entry { mycss_parser_token_f parser; @@ -83,12 +83,12 @@ struct mycss_entry { /* incoming buffer */ mcobject_t* mcobject_incoming_buffer; - myhtml_incoming_buffer_t* first_buffer; - myhtml_incoming_buffer_t* current_buffer; + mycore_incoming_buffer_t* first_buffer; + mycore_incoming_buffer_t* current_buffer; /* options */ mycss_entry_type_t type; - myhtml_encoding_t encoding; + myencoding_t encoding; /* tokenizer */ mycss_tokenizer_state_t state; @@ -112,9 +112,9 @@ struct mycss_entry { }; mycss_entry_t * mycss_entry_create(void); -mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); -mycss_status_t mycss_entry_clean(mycss_entry_t* entry); -mycss_status_t mycss_entry_clean_all(mycss_entry_t* entry); +mystatus_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); +mystatus_t mycss_entry_clean(mycss_entry_t* entry); +mystatus_t mycss_entry_clean_all(mycss_entry_t* entry); mycss_entry_t * mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy); void mycss_entry_end(mycss_entry_t* entry); @@ -125,10 +125,10 @@ mycss_selectors_t * mycss_entry_selectors(mycss_entry_t* entry); mycss_token_ready_callback_f mycss_entry_token_ready_callback(mycss_entry_t* entry, mycss_token_ready_callback_f callback_f); size_t mycss_entry_token_count(mycss_entry_t* entry); -myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry); -myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry); +mycore_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry); +mycore_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry); -myhtml_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size); +mycore_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size); mycss_stylesheet_t * mycss_entry_stylesheet(mycss_entry_t* entry); mycss_selectors_list_t * mycss_entry_current_selectors_list(mycss_entry_t* entry); @@ -142,7 +142,7 @@ mycss_entry_parser_list_t * mycss_entry_parser_list_create_and_init(size_t size) void mycss_entry_parser_list_clean(mycss_entry_parser_list_t* parser_list); mycss_entry_parser_list_t * mycss_entry_parser_list_destroy(mycss_entry_parser_list_t* parser_list, bool self_destroy); -mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, +mystatus_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, mycss_parser_token_f parser_switch, mycss_token_type_t ending_token, bool is_local); diff --git a/include/mycss/media/init.h b/include/mycss/media/init.h index 78c6915..9e9e8c6 100644 --- a/include/mycss/media/init.h +++ b/include/mycss/media/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,8 @@ extern "C" { #endif mycss_media_t * mycss_media_create(void); -mycss_status_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media); -mycss_status_t mycss_media_clean_all(mycss_media_t* media); +mystatus_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media); +mystatus_t mycss_media_clean_all(mycss_media_t* media); mycss_media_t * mycss_media_destroy(mycss_media_t* media, bool self_destroy); #ifdef __cplusplus diff --git a/include/mycss/media/myosi.h b/include/mycss/media/myosi.h index ef45cc3..1656c6e 100644 --- a/include/mycss/media/myosi.h +++ b/include/mycss/media/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,6 +32,7 @@ typedef struct mycss_media mycss_media_t; struct mycss_media { + mystatus_t error; }; diff --git a/include/mycss/media/state.h b/include/mycss/media/state.h index 29a4f87..439d19f 100644 --- a/include/mycss/media/state.h +++ b/include/mycss/media/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/mycss.h b/include/mycss/mycss.h index 46a34bf..701d122 100644 --- a/include/mycss/mycss.h +++ b/include/mycss/mycss.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,51 +26,37 @@ extern "C" { #endif -#ifdef MyCSS_DEBUG - #define MyCSS_DEBUG_MESSAGE(format, ...) \ - myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) -#else - #define MyCSS_DEBUG_MESSAGE(format, ...) -#endif - -#ifdef DEBUG_MODE -#define MyHTML_DEBUG_ERROR(format, ...) \ -myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) -#else -#define MyHTML_DEBUG_ERROR(format, ...) -#endif - #include #include #include #include -#include +#include struct mycss { mycss_tokenizer_state_f* parse_state_func; }; mycss_t * mycss_create(void); -mycss_status_t mycss_init(mycss_t* mycss); +mystatus_t mycss_init(mycss_t* mycss); mycss_t * mycss_destroy(mycss_t* mycss, bool self_destroy); -mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); -mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); -mycss_status_t mycss_parse_chunk_end(mycss_entry_t* entry); +mystatus_t mycss_parse(mycss_entry_t* entry, myencoding_t encoding, const char* css, size_t css_size); +mystatus_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); +mystatus_t mycss_parse_chunk_end(mycss_entry_t* entry); size_t mycss_token_begin(mycss_token_t* token); size_t mycss_token_length(mycss_token_t* token); size_t mycss_token_position(mycss_token_t* token, size_t *return_length); mycss_token_type_t mycss_token_type(mycss_token_t* token); const char * mycss_token_name_by_type(mycss_token_type_t type); -size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool init_string, bool case_insensitive); +size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str, bool init_string, bool case_insensitive); -myhtml_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token); +mycore_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token); // encoding -void mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); -myhtml_encoding_t mycss_encoding_get(mycss_entry_t* entry); -myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); +void mycss_encoding_set(mycss_entry_t* entry, myencoding_t encoding); +myencoding_t mycss_encoding_get(mycss_entry_t* entry); +myencoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/myosi.h b/include/mycss/myosi.h index 5b61995..f754a0c 100644 --- a/include/mycss/myosi.h +++ b/include/mycss/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,12 @@ #define MyHTML_MyCSS_MYOSI_H #pragma once +#define MyCSS_VERSION_MAJOR 0 +#define MyCSS_VERSION_MINOR 1 +#define MyCSS_VERSION_PATCH 0 + +#define MyCSS_VERSION_STRING MyCORE_STR(MyCSS_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyCSS_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyCSS_VERSION_PATCH) + #ifdef __cplusplus extern "C" { #endif @@ -31,7 +37,7 @@ extern "C" { // base /* Very important!!! - see modest/myosi.h:modest_status_t + see modest/myosi.h:mystatus_t */ enum mycss_status { MyCSS_STATUS_OK = 0x000000, @@ -260,10 +266,9 @@ typedef struct mycss_string_res mycss_string_res_t; typedef size_t (*mycss_tokenizer_state_f)(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); typedef mycss_token_t * (*mycss_token_ready_callback_f)(mycss_entry_t* entry, mycss_token_t* token); -typedef size_t (*mycss_string_process_state_f)(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +typedef size_t (*mycss_string_process_state_f)(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); typedef bool (*mycss_parser_token_f)(mycss_entry_t* entry, mycss_token_t* token, bool last_response); typedef bool (*mycss_an_plus_b_state_f)(mycss_entry_t* entry, mycss_an_plus_b_t* anb, mycss_an_plus_b_entry_t* anb_entry, mycss_token_t* token); -typedef void (*mycss_callback_serialization_f)(const char* buffer, size_t size, void* ctx); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/mystring.h b/include/mycss/mystring.h index 7f109c0..b71c68a 100644 --- a/include/mycss/mystring.h +++ b/include/mycss/mystring.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,9 +27,10 @@ extern "C" { #endif #include -#include -#include - +#include +#include +#include + enum mycss_string_process_state { MyCSS_STRING_PROCESS_STATE_DATA = 0x00, MyCSS_STRING_PROCESS_STATE_ESCAPED = 0x01, @@ -46,18 +47,18 @@ struct mycss_string_res { mycss_string_escaped_res_t escaped; mycss_string_process_state_t state; - myhtml_encoding_t encoding; - myhtml_encoding_result_t encoding_res; + myencoding_t encoding; + myencoding_result_t encoding_res; bool case_insensitive; }; -size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out_res); +size_t mycss_string_data_process(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +void mycss_string_data_process_end(mycore_string_t* str, mycss_string_res_t *out_res); -size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -size_t mycss_string_process_state_escaped_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_data(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_data_utf_8(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped_utf_8(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); void mycss_string_res_clean(mycss_string_res_t* res); void mycss_string_escaped_res_clean(mycss_string_escaped_res_t* res); diff --git a/include/mycss/namespace/init.h b/include/mycss/namespace/init.h index 0f1669a..dbdf139 100644 --- a/include/mycss/namespace/init.h +++ b/include/mycss/namespace/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,16 +31,16 @@ extern "C" { #include mycss_namespace_t * mycss_namespace_create(void); -mycss_status_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns); +mystatus_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns); void mycss_namespace_clean(mycss_namespace_t* ns); -mycss_status_t mycss_namespace_clean_all(mycss_namespace_t* ns); +mystatus_t mycss_namespace_clean_all(mycss_namespace_t* ns); mycss_namespace_t * mycss_namespace_destroy(mycss_namespace_t* ns, bool self_destroy); -mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); -mycss_status_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mystatus_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mystatus_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); mycss_namespace_stylesheet_t * mycss_namespace_stylesheet_destroy(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, bool self_destroy); -mycss_status_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns); +mystatus_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns); void mycss_namespace_stylesheet_append_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_namespace_entry_t* ns_entry); void mycss_namespace_stylesheet_destroy_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); diff --git a/include/mycss/namespace/myosi.h b/include/mycss/namespace/myosi.h index 906ed18..6a50ee7 100644 --- a/include/mycss/namespace/myosi.h +++ b/include/mycss/namespace/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,16 +28,16 @@ extern "C" { #include #include -#include -#include +#include +#include typedef struct mycss_namespace mycss_namespace_t; typedef struct mycss_namespace_entry mycss_namespace_entry_t; typedef struct mycss_namespace_stylesheet mycss_namespace_stylesheet_t; struct mycss_namespace_entry { - myhtml_string_t* name; - myhtml_string_t* url; + mycore_string_t* name; + mycore_string_t* url; myhtml_namespace_t ns_id; size_t mctree_id; diff --git a/include/mycss/namespace/parser.h b/include/mycss/namespace/parser.h index bfec173..7f1531f 100644 --- a/include/mycss/namespace/parser.h +++ b/include/mycss/namespace/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,7 +29,7 @@ extern "C" { #include #include #include -#include +#include void mycss_namespace_parser_begin(mycss_entry_t* entry); diff --git a/include/mycss/namespace/serialization.h b/include/mycss/namespace/serialization.h index 0dd5c15..35cb036 100644 --- a/include/mycss/namespace/serialization.h +++ b/include/mycss/namespace/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,8 @@ extern "C" { #endif -void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_callback_serialization_f callback, void* context); -void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycss_callback_serialization_f callback, void* context, bool with_vbar); +void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycore_callback_serialize_f callback, void* context); +void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycore_callback_serialize_f callback, void* context, bool with_vbar); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/namespace/state.h b/include/mycss/namespace/state.h index ee3003f..1581e11 100644 --- a/include/mycss/namespace/state.h +++ b/include/mycss/namespace/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,7 +29,7 @@ extern "C" { #include #include #include -#include +#include bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_namespace_state_namespace_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/include/mycss/parser.h b/include/mycss/parser.h index f4c660c..6057b16 100644 --- a/include/mycss/parser.h +++ b/include/mycss/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -35,7 +35,7 @@ extern "C" { #include #include #include -#include +#include mycss_token_t * mycss_parser_token_ready_callback_function(mycss_entry_t* entry, mycss_token_t* token); diff --git a/include/mycss/property/const.h b/include/mycss/property/const.h index cd430ea..8881359 100644 --- a/include/mycss/property/const.h +++ b/include/mycss/property/const.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/property/init.h b/include/mycss/property/init.h index 62a36c0..ad5b208 100644 --- a/include/mycss/property/init.h +++ b/include/mycss/property/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,7 +25,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/include/mycss/property/myosi.h b/include/mycss/property/myosi.h index 1dce753..7f32e55 100644 --- a/include/mycss/property/myosi.h +++ b/include/mycss/property/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/property/parser.h b/include/mycss/property/parser.h index 3ff15e5..76694ea 100644 --- a/include/mycss/property/parser.h +++ b/include/mycss/property/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -34,7 +34,7 @@ extern "C" { /* custom added */ bool mycss_property_parser_background_position_check(mycss_values_background_position_t *position); -bool mycss_property_parser_destroy_string(myhtml_string_t* str, bool return_value); +bool mycss_property_parser_destroy_string(mycore_string_t* str, bool return_value); bool mycss_property_parser_switcher_to_find_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_property_parser_text_decoration_line_not_none(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_property_parser_text_decoration_line_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/include/mycss/property/resources.h b/include/mycss/property/resources.h index dd9d86a..b42e068 100644 --- a/include/mycss/property/resources.h +++ b/include/mycss/property/resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/property/resources_name.h b/include/mycss/property/resources_name.h index ad25497..45a04de 100644 --- a/include/mycss/property/resources_name.h +++ b/include/mycss/property/resources_name.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/property/serialization.h b/include/mycss/property/serialization.h index 748d52d..9a88c62 100644 --- a/include/mycss/property/serialization.h +++ b/include/mycss/property/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,8 +30,8 @@ extern "C" { #endif -void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycss_callback_serialization_f callback, void* context); -void mycss_property_serialization_value(unsigned int value_type, void* value, mycss_callback_serialization_f callback, void* context); +void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycore_callback_serialize_f callback, void* context); +void mycss_property_serialization_value(unsigned int value_type, void* value, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/property/shared.h b/include/mycss/property/shared.h index dd05f10..eaa0bbf 100644 --- a/include/mycss/property/shared.h +++ b/include/mycss/property/shared.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ #include #include #include -#include +#include #ifdef __cplusplus extern "C" { @@ -37,42 +37,42 @@ bool mycss_property_shared_switch_to_find_important(mycss_entry_t* entry); bool mycss_property_shared_switch_to_parse_error(mycss_entry_t* entry); bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_token_t* token); -bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); +bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); bool mycss_property_shared_custom_ident(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type); -bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str, bool* parser_changed); -bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str); -bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, myhtml_string_t* str); -bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, myhtml_string_t* str, bool with_global); -bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, myhtml_string_t* str, bool with_global); +bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed); +bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str); +bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, mycore_string_t* str); +bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, mycore_string_t* str, bool with_global); +bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, mycore_string_t* str, bool with_global); -bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool *dont_destroy_str, myhtml_string_t* str); +bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool *dont_destroy_str, mycore_string_t* str); -bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str, bool* parser_changed); +bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed); -bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, myhtml_string_t* str); +bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str); -void mycss_property_shared_destroy_string(myhtml_string_t* str); +void mycss_property_shared_destroy_string(mycore_string_t* str); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/selectors/function.h b/include/mycss/selectors/function.h index 7f73f05..7b2d4d3 100644 --- a/include/mycss/selectors/function.h +++ b/include/mycss/selectors/function.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/function_parser.h b/include/mycss/selectors/function_parser.h index f619dd3..2a7e690 100644 --- a/include/mycss/selectors/function_parser.h +++ b/include/mycss/selectors/function_parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/function_resource.h b/include/mycss/selectors/function_resource.h index a3a369e..67c48ac 100644 --- a/include/mycss/selectors/function_resource.h +++ b/include/mycss/selectors/function_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/init.h b/include/mycss/selectors/init.h index 0004125..a2f6f21 100644 --- a/include/mycss/selectors/init.h +++ b/include/mycss/selectors/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,9 +31,9 @@ extern "C" { #include mycss_selectors_t * mycss_selectors_create(void); -mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors); +mystatus_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors); void mycss_selectors_clean(mycss_selectors_t* selectors); -mycss_status_t mycss_selectors_clean_all(mycss_selectors_t* selectors); +mystatus_t mycss_selectors_clean_all(mycss_selectors_t* selectors); mycss_selectors_t * mycss_selectors_destroy(mycss_selectors_t* selectors, bool self_destroy); void mycss_selectors_entry_clean(mycss_selectors_entry_t* sel_entry); @@ -41,8 +41,8 @@ mycss_selectors_entry_t * mycss_selectors_entry_destroy(mycss_selectors_t* selec void * mycss_selectors_entry_value_destroy(mycss_entry_t* entry, mycss_selectors_entry_t* selector_entry, bool destroy_self); -mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); -mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); +mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status); +mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status); mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector); diff --git a/include/mycss/selectors/list.h b/include/mycss/selectors/list.h index 1320494..a46d519 100644 --- a/include/mycss/selectors/list.h +++ b/include/mycss/selectors/list.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/myosi.h b/include/mycss/selectors/myosi.h index a255e75..525bf00 100644 --- a/include/mycss/selectors/myosi.h +++ b/include/mycss/selectors/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -36,7 +36,7 @@ typedef struct mycss_selectors_specificity mycss_selectors_specificity_t; #include #include #include -#include +#include typedef bool (*mycss_selectors_state_f)(mycss_entry_t* entry, mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_token_t* token); typedef void (*mycss_callback_selector_done_f)(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); @@ -218,7 +218,7 @@ struct mycss_selectors_entry { mycss_namespace_entry_t* ns_entry; - myhtml_string_t* key; + mycore_string_t* key; void* value; mycss_selectors_combinator_t combinator; diff --git a/include/mycss/selectors/myosi_resource.h b/include/mycss/selectors/myosi_resource.h index 70a0b6a..21baa67 100644 --- a/include/mycss/selectors/myosi_resource.h +++ b/include/mycss/selectors/myosi_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/parser.h b/include/mycss/selectors/parser.h index f8be137..6eab0e9 100644 --- a/include/mycss/selectors/parser.h +++ b/include/mycss/selectors/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/pseudo.h b/include/mycss/selectors/pseudo.h index 470ba8d..c16fb0d 100644 --- a/include/mycss/selectors/pseudo.h +++ b/include/mycss/selectors/pseudo.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/pseudo_resource.h b/include/mycss/selectors/pseudo_resource.h index 4bb9994..9a8ce37 100644 --- a/include/mycss/selectors/pseudo_resource.h +++ b/include/mycss/selectors/pseudo_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/selectors/serialization.h b/include/mycss/selectors/serialization.h index e2038d5..c0bd64e 100644 --- a/include/mycss/selectors/serialization.h +++ b/include/mycss/selectors/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,9 +30,9 @@ extern "C" { #include #include -void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context); -bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, mycss_callback_serialization_f callback, void* context); -bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context); +void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycore_callback_serialize_f callback, void* context); +bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, mycore_callback_serialize_f callback, void* context); +bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/selectors/state.h b/include/mycss/selectors/state.h index 5753e7a..62f7fc8 100644 --- a/include/mycss/selectors/state.h +++ b/include/mycss/selectors/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,7 +29,7 @@ extern "C" { #include #include #include -#include +#include void mycss_selectors_state_end(mycss_entry_t* entry); bool mycss_selectors_state_function_skip_all(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/include/mycss/selectors/value.h b/include/mycss/selectors/value.h index 35c93cc..f7db204 100644 --- a/include/mycss/selectors/value.h +++ b/include/mycss/selectors/value.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ #pragma once #define mycss_selector_value_attribute(obj) ((mycss_selectors_object_attribute_t*)(obj)) -#define mycss_selector_value_string(obj) ((myhtml_string_t*)(obj)) +#define mycss_selector_value_string(obj) ((mycore_string_t*)(obj)) #define mycss_selector_value_an_plus_b(obj) ((mycss_an_plus_b_entry_t*)(obj)) #define mycss_selector_value_drop(obj) ((mycss_selectors_function_drop_type_t)(obj)) #define mycss_selector_value_lang(obj) ((mycss_selectors_value_lang_t*)(obj)) @@ -36,13 +36,13 @@ extern "C" { #include #include -#include +#include typedef void * (*mycss_selectors_value_destroy_f)(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); typedef void * (*mycss_selectors_value_function_destroy_f)(mycss_entry_t* entry, void* value, bool self_destroy); struct mycss_selectors_value_attribute { - myhtml_string_t* value; + mycore_string_t* value; mycss_selectors_match_t match; mycss_selectors_mod_t mod; @@ -50,7 +50,7 @@ struct mycss_selectors_value_attribute { typedef mycss_selectors_object_attribute_t; struct mycss_selectors_value_lang { - myhtml_string_t str; + mycore_string_t str; struct mycss_selectors_value_lang* next; } typedef mycss_selectors_value_lang_t; diff --git a/include/mycss/selectors/value_resource.h b/include/mycss/selectors/value_resource.h index f40fdb0..7bbc06d 100644 --- a/include/mycss/selectors/value_resource.h +++ b/include/mycss/selectors/value_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/stack.h b/include/mycss/stack.h index 7a272d7..b50fb0f 100644 --- a/include/mycss/stack.h +++ b/include/mycss/stack.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -42,11 +42,11 @@ struct mycss_stack { typedef mycss_stack_t; mycss_stack_t * mycss_stack_create(void); -mycss_status_t mycss_stack_init(mycss_stack_t *stack, size_t size); +mystatus_t mycss_stack_init(mycss_stack_t *stack, size_t size); void mycss_stack_clean(mycss_stack_t *stack); mycss_stack_t * mycss_stack_destroy(mycss_stack_t *stack, bool self_destroy); -mycss_status_t mycss_stack_push(mycss_stack_t *stack, void* value, mycss_parser_token_f parser); +mystatus_t mycss_stack_push(mycss_stack_t *stack, void* value, mycss_parser_token_f parser); mycss_stack_entry_t * mycss_stack_pop(mycss_stack_t *stack); mycss_stack_entry_t * mycss_stack_current(mycss_stack_t *stack); diff --git a/include/mycss/stylesheet.h b/include/mycss/stylesheet.h index 523d3d1..7b3fb7e 100644 --- a/include/mycss/stylesheet.h +++ b/include/mycss/stylesheet.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,11 +45,11 @@ struct mycss_stylesheet { }; mycss_stylesheet_t * mycss_stylesheet_create(void); -mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry); -mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet); +mystatus_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry); +mystatus_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet); mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy); -void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycss_callback_serialization_f callback, void* context); +void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/tokenizer.h b/include/mycss/tokenizer.h index 1fa7609..fac9b84 100644 --- a/include/mycss/tokenizer.h +++ b/include/mycss/tokenizer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -33,7 +33,7 @@ extern "C" { #include #include -#include +#include #define MyCSS_TOKEN_READY_CALLBACK_FUNCTION(ENTRY, TOKEN) \ ++ENTRY->token_counter; \ @@ -53,12 +53,12 @@ struct mycss_token { const char* data; }; -mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss); +mystatus_t mycss_tokenizer_state_init(mycss_t* mycss); void mycss_tokenizer_state_destroy(mycss_t* mycss); -mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length); -mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length); -mycss_status_t mycss_tokenizer_end(mycss_entry_t* entry); +mystatus_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length); +mystatus_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length); +mystatus_t mycss_tokenizer_end(mycss_entry_t* entry); size_t mycss_tokenizer_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size); size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entry, size_t css_offset, size_t css_minus_offset); diff --git a/include/mycss/tokenizer_end.h b/include/mycss/tokenizer_end.h index f7c4e61..6daafce 100644 --- a/include/mycss/tokenizer_end.h +++ b/include/mycss/tokenizer_end.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/tokenizer_global.h b/include/mycss/tokenizer_global.h index 4a9d5da..30f3691 100644 --- a/include/mycss/tokenizer_global.h +++ b/include/mycss/tokenizer_global.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/tokenizer_resource.h b/include/mycss/tokenizer_resource.h index 623a904..4d39109 100644 --- a/include/mycss/tokenizer_resource.h +++ b/include/mycss/tokenizer_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/color.h b/include/mycss/values/color.h index fa92a7e..35e1919 100644 --- a/include/mycss/values/color.h +++ b/include/mycss/values/color.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/color_const.h b/include/mycss/values/color_const.h index fb28243..0c614b8 100644 --- a/include/mycss/values/color_const.h +++ b/include/mycss/values/color_const.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/color_parser.h b/include/mycss/values/color_parser.h index 0261c4e..bb26830 100644 --- a/include/mycss/values/color_parser.h +++ b/include/mycss/values/color_parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -55,7 +55,7 @@ bool mycss_values_color_parser_hsl_lightness(mycss_entry_t* entry, mycss_token_t bool mycss_values_color_parser_hsl_before_alpha(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_values_color_parser_hsl_alpha(mycss_entry_t* entry, mycss_token_t* token, bool last_response); -bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); +bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); bool mycss_values_color_parser_hwb(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_values_color_parser_hwb_before_whiteness(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/include/mycss/values/color_resources.h b/include/mycss/values/color_resources.h index b06cba3..108a410 100644 --- a/include/mycss/values/color_resources.h +++ b/include/mycss/values/color_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/consume.h b/include/mycss/values/consume.h index 2113db7..5c69578 100644 --- a/include/mycss/values/consume.h +++ b/include/mycss/values/consume.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/destroy.h b/include/mycss/values/destroy.h index 29670a0..651ec76 100644 --- a/include/mycss/values/destroy.h +++ b/include/mycss/values/destroy.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/image.h b/include/mycss/values/image.h index ed6b9dc..efa5632 100644 --- a/include/mycss/values/image.h +++ b/include/mycss/values/image.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/image_resources.h b/include/mycss/values/image_resources.h index a612ec7..02863c9 100644 --- a/include/mycss/values/image_resources.h +++ b/include/mycss/values/image_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/resources.h b/include/mycss/values/resources.h index 1c7efd4..faf67a5 100644 --- a/include/mycss/values/resources.h +++ b/include/mycss/values/resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/serialization.h b/include/mycss/values/serialization.h index 5ff89bf..871ccdb 100644 --- a/include/mycss/values/serialization.h +++ b/include/mycss/values/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,21 +30,21 @@ extern "C" { #include #include -void mycss_values_serialization_string(myhtml_string_t* str, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_number(mycss_values_number_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_angle(mycss_values_angle_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_resolution(mycss_values_resolution_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_type_length_percentage(mycss_values_type_length_percentage_entry_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_color_alpha(mycss_values_color_alpha_value_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_text_decoration_line(mycss_values_text_decoration_line_t value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoration_skip_t value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_url(mycss_values_url_t* url, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_background_size_entry(mycss_values_background_size_entry_t* bg_size_entry, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_border(mycss_values_border_t* border, mycss_callback_serialization_f callback, void* context); +void mycss_values_serialization_string(mycore_string_t* str, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_number(mycss_values_number_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_length(mycss_values_length_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_angle(mycss_values_angle_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_resolution(mycss_values_resolution_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_type_length_percentage(mycss_values_type_length_percentage_entry_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_color(mycss_values_color_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_color_alpha(mycss_values_color_alpha_value_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_text_decoration_line(mycss_values_text_decoration_line_t value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoration_skip_t value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_url(mycss_values_url_t* url, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_image(mycss_values_image_t* image, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_background_size_entry(mycss_values_background_size_entry_t* bg_size_entry, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_border(mycss_values_border_t* border, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/mycss/values/units.h b/include/mycss/values/units.h index 4d1a7ef..e506f84 100644 --- a/include/mycss/values/units.h +++ b/include/mycss/values/units.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ #pragma once #include -#include +#include #define mycss_units_is_angel_type(type) (type >= 1 && type <= 4) #define mycss_units_is_frequency_type(type) (type >= 5 && type <= 6) diff --git a/include/mycss/values/units_resources.h b/include/mycss/values/units_resources.h index 7d7c8e1..e602fac 100644 --- a/include/mycss/values/units_resources.h +++ b/include/mycss/values/units_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/mycss/values/values.h b/include/mycss/values/values.h index 5dfe23f..d05cc9f 100644 --- a/include/mycss/values/values.h +++ b/include/mycss/values/values.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ #include #include #include -#include +#include #include #include @@ -115,12 +115,13 @@ struct mycss_values_type_list { size_t entries_length; }; -struct mycss_values_type_length_percentage_entry { - union { - mycss_values_percentage_t* percentage; - mycss_values_length_t* length; - }; +union mycss_values_type_length_percentage_union { + mycss_values_percentage_t* percentage; + mycss_values_length_t* length; +}; +struct mycss_values_type_length_percentage_entry { + union mycss_values_type_length_percentage_union value; unsigned int type; }; @@ -128,7 +129,7 @@ struct mycss_values_number { union { int i; float f; - }; + } value; bool is_float; }; @@ -137,9 +138,10 @@ struct mycss_values_length { union { int i; float f; - }; + } value; bool is_float; + mycss_units_type_t type; }; @@ -147,7 +149,7 @@ struct mycss_values_percentage { union { int i; float f; - }; + } value; bool is_float; }; @@ -156,7 +158,7 @@ struct mycss_values_angle { union { int i; float f; - }; + } value; bool is_float; mycss_units_type_t type; @@ -166,14 +168,14 @@ struct mycss_values_resolution { union { int i; float f; - }; + } value; bool is_float; mycss_units_type_t type; }; struct mycss_values_custom_ident { - myhtml_string_t str; + mycore_string_t str; }; /* @@ -211,7 +213,7 @@ struct mycss_values_color_alpha_value { union { mycss_values_number_t number; mycss_values_percentage_t percentage; - }; + } value; mycss_values_color_type_value_t type_value; }; @@ -220,7 +222,7 @@ struct mycss_values_color_hue_value { union { mycss_values_number_t number; mycss_values_angle_t angle; - }; + } value; mycss_values_color_type_value_t type_value; }; @@ -267,7 +269,7 @@ struct mycss_values_color { mycss_values_color_hwb_t hwb; mycss_values_color_gray_t gray; mycss_values_color_id_t name_id; - }; + } value; mycss_values_color_type_t type; mycss_values_color_type_value_t type_value; @@ -287,7 +289,7 @@ struct mycss_values_color_stop_list { URL */ struct mycss_values_url { - myhtml_string_t str; + mycore_string_t str; }; /* @@ -308,7 +310,7 @@ struct mycss_values_image { mycss_values_image_image_set_t* ii_set; mycss_values_element_t* element; mycss_values_cross_fade_t* cross_fade; - }; + } value; mycss_property_value_t type; }; @@ -320,14 +322,14 @@ struct mycss_values_image_list { /* image() */ struct mycss_values_image_image { - myhtml_string_t* str; + mycore_string_t* str; mycss_values_image_t* image; mycss_values_color_t* color; }; /* image-set() */ struct mycss_values_image_image_set_option { - myhtml_string_t* str; + mycore_string_t* str; mycss_values_image_t* image; mycss_values_resolution_t* resolution; }; @@ -378,7 +380,7 @@ struct mycss_values_gradient_linear { union { mycss_values_angle_t angle; mycss_values_gradient_side_or_corner_t side_or_corner; - }; + } value; mycss_values_color_stop_list_t color_stop_list; }; @@ -398,9 +400,9 @@ typedef mycss_values_font_family_type_t; struct mycss_values_font_family_entry { union { - myhtml_string_t str; + mycore_string_t str; mycss_property_font_family_t prop_type; - }; + } value; mycss_values_font_family_type_t type; }; diff --git a/include/myencoding/detect_resource.h b/include/myencoding/detect_resource.h new file mode 100644 index 0000000..3aba646 --- /dev/null +++ b/include/myencoding/detect_resource.h @@ -0,0 +1,5626 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_DETECT_RESOURCE_H +#define MyENCODING_DETECT_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define MyENCODING_DETECT_NAME_STATIC_SIZE 419 + +#include + +static const myencoding_detect_name_entry_t myencoding_detect_name_entry_static_list_index[] = +{ + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "x-cp1257", 8, MyENCODING_WINDOWS_1257, 0, 7}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-874", 11, "tis-620", 7, MyENCODING_WINDOWS_874, 0, 10}, + {"iso-8859-3", 10, "iso8859-3", 9, MyENCODING_ISO_8859_3, 420, 11}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "ms932", 5, MyENCODING_SHIFT_JIS, 0, 16}, + {"gbk", 3, "gb_2312", 7, MyENCODING_GBK, 421, 17}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "iso8859-7", 9, MyENCODING_ISO_8859_7, 422, 20}, + {"windows-1250", 12, "cp1250", 6, MyENCODING_WINDOWS_1250, 423, 21}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "shift-jis", 9, MyENCODING_SHIFT_JIS, 424, 30}, + {"ibm866", 6, "csibm866", 8, MyENCODING_IBM866, 425, 31}, + {"euc-kr", 6, "windows-949", 11, MyENCODING_EUC_KR, 0, 32}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-2022-jp", 11, "csiso2022jp", 11, MyENCODING_ISO_2022_JP, 0, 40}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "iso-8859-15", 11, MyENCODING_ISO_8859_15, 426, 42}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ksc_5601", 8, MyENCODING_EUC_KR, 0, 45}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "csiso58gb231280", 15, MyENCODING_GBK, 0, 51}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "cyrillic", 8, MyENCODING_ISO_8859_5, 0, 56}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "cp1255", 6, MyENCODING_WINDOWS_1255, 427, 58}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "x-cp1254", 8, MyENCODING_WINDOWS_1254, 0, 60}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "csisolatin9", 11, MyENCODING_ISO_8859_15, 0, 62}, + {"koi8-u", 6, "koi8-ru", 7, MyENCODING_KOI8_U, 0, 63}, + {"iso-8859-4", 10, "csisolatin4", 11, MyENCODING_ISO_8859_4, 0, 64}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "windows-31j", 11, MyENCODING_SHIFT_JIS, 0, 66}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "utf-8", 5, MyENCODING_UTF_8, 0, 79}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"ibm866", 6, "ibm866", 6, MyENCODING_IBM866, 0, 82}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi8", 4, MyENCODING_KOI8_R, 0, 86}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "x-gbk", 5, MyENCODING_GBK, 428, 94}, + {"iso-8859-7", 10, "csisolatingreek", 15, MyENCODING_ISO_8859_7, 0, 95}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "iso88591", 8, MyENCODING_WINDOWS_1252, 0, 99}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso88592", 8, MyENCODING_ISO_8859_2, 0, 101}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "iso88593", 8, MyENCODING_ISO_8859_3, 0, 103}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso88594", 8, MyENCODING_ISO_8859_4, 0, 105}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "sjis", 4, MyENCODING_SHIFT_JIS, 430, 107}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso88596", 8, MyENCODING_ISO_8859_6, 431, 109}, + {"windows-1252", 12, "l1", 2, MyENCODING_WINDOWS_1252, 432, 110}, + {"macintosh", 9, "mac", 3, MyENCODING_MACINTOSH, 433, 111}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "iso88598", 8, MyENCODING_ISO_8859_8, 435, 113}, + {"koi8-u", 6, "koi8-u", 6, MyENCODING_KOI8_U, 0, 114}, + {"windows-1254", 12, "iso88599", 8, MyENCODING_WINDOWS_1254, 0, 115}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "ecma-114", 8, MyENCODING_ISO_8859_6, 0, 117}, + {"iso-8859-4", 10, "iso8859-4", 9, MyENCODING_ISO_8859_4, 436, 118}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso-ir-110", 10, MyENCODING_ISO_8859_4, 437, 121}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "l3", 2, MyENCODING_ISO_8859_3, 0, 123}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso-8859-2", 10, MyENCODING_ISO_8859_2, 439, 126}, + {"windows-1253", 12, "cp1253", 6, MyENCODING_WINDOWS_1253, 440, 127}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1258", 12, "x-cp1258", 8, MyENCODING_WINDOWS_1258, 0, 129}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "iso-8859-4", 10, MyENCODING_ISO_8859_4, 443, 131}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "iso-8859-10", 11, MyENCODING_ISO_8859_10, 0, 133}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "l5", 2, MyENCODING_WINDOWS_1254, 446, 136}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "latin2", 6, MyENCODING_ISO_8859_2, 0, 138}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "iso-8859-8", 10, MyENCODING_ISO_8859_8, 449, 141}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "cp819", 5, MyENCODING_WINDOWS_1252, 0, 143}, + {"iso-8859-14", 11, "iso-8859-14", 11, MyENCODING_ISO_8859_14, 0, 144}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "csisolatin6", 11, MyENCODING_ISO_8859_10, 0, 147}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "csisolatin1", 11, MyENCODING_WINDOWS_1252, 0, 149}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-15", 11, "l9", 2, MyENCODING_ISO_8859_15, 0, 162}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1258", 12, "cp1258", 6, MyENCODING_WINDOWS_1258, 0, 164}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "windows-1252", 12, MyENCODING_WINDOWS_1252, 0, 171}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "sun_eu_greek", 12, MyENCODING_ISO_8859_7, 0, 173}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "cseucpkdfmtjapanese", 19, MyENCODING_EUC_JP, 0, 175}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-4", 10, "latin4", 6, MyENCODING_ISO_8859_4, 0, 177}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "x-cp1255", 8, MyENCODING_WINDOWS_1255, 452, 182}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi", 3, MyENCODING_KOI8_R, 0, 186}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "windows-1257", 12, MyENCODING_WINDOWS_1257, 0, 188}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-874", 11, "windows-874", 11, MyENCODING_WINDOWS_874, 0, 191}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1251", 12, "cp1251", 6, MyENCODING_WINDOWS_1251, 0, 196}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-16le", 8, "utf-16", 6, MyENCODING_UTF_16LE, 0, 199}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "visual", 6, MyENCODING_ISO_8859_8, 0, 207}, + {"macintosh", 9, "macintosh", 9, MyENCODING_MACINTOSH, 0, 208}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ansi_x3.4-1968", 14, MyENCODING_WINDOWS_1252, 0, 210}, + {"iso-8859-3", 10, "iso_8859-3:1988", 15, MyENCODING_ISO_8859_3, 453, 211}, + {"iso-8859-6", 10, "csiso88596e", 11, MyENCODING_ISO_8859_6, 456, 212}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "csgb2312", 8, MyENCODING_GBK, 0, 215}, + {"iso-8859-6", 10, "arabic", 6, MyENCODING_ISO_8859_6, 457, 216}, + {"iso-8859-7", 10, "greek", 5, MyENCODING_ISO_8859_7, 0, 217}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"shift_jis", 9, "ms_kanji", 8, MyENCODING_SHIFT_JIS, 0, 219}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-5", 10, "iso8859-5", 9, MyENCODING_ISO_8859_5, 460, 225}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ascii", 5, MyENCODING_WINDOWS_1252, 461, 227}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "korean", 6, MyENCODING_EUC_KR, 0, 229}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "utf8", 4, MyENCODING_UTF_8, 462, 231}, + {"iso-8859-3", 10, "csisolatin3", 11, MyENCODING_ISO_8859_3, 0, 232}, + {"windows-1256", 12, "cp1256", 6, MyENCODING_WINDOWS_1256, 464, 233}, + {"windows-1254", 12, "iso8859-9", 9, MyENCODING_WINDOWS_1254, 0, 234}, + {"windows-1252", 12, "us-ascii", 8, MyENCODING_WINDOWS_1252, 465, 235}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"big5", 4, "big5", 4, MyENCODING_BIG5, 466, 246}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1250", 12, "windows-1250", 12, MyENCODING_WINDOWS_1250, 0, 248}, + {"euc-kr", 6, "ksc5601", 7, MyENCODING_EUC_KR, 0, 249}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "greek8", 6, MyENCODING_ISO_8859_7, 467, 251}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "x-euc-jp", 8, MyENCODING_EUC_JP, 0, 257}, + {"shift_jis", 9, "x-sjis", 6, MyENCODING_SHIFT_JIS, 0, 258}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-16be", 8, "utf-16be", 8, MyENCODING_UTF_16BE, 468, 262}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1255", 12, "windows-1255", 12, MyENCODING_WINDOWS_1255, 0, 265}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ks_c_5601-1987", 14, MyENCODING_EUC_KR, 0, 267}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"ibm866", 6, "866", 3, MyENCODING_IBM866, 0, 274}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"big5", 4, "cn-big5", 7, MyENCODING_BIG5, 0, 277}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"koi8-r", 6, "koi8-r", 6, MyENCODING_KOI8_R, 469, 283}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "ibm819", 6, MyENCODING_WINDOWS_1252, 0, 296}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "asmo-708", 8, MyENCODING_ISO_8859_6, 0, 300}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "cp1254", 6, MyENCODING_WINDOWS_1254, 470, 302}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1256", 12, "x-cp1256", 8, MyENCODING_WINDOWS_1256, 471, 304}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-2022-jp", 11, "iso-2022-jp", 11, MyENCODING_ISO_2022_JP, 0, 309}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso_8859-2:1987", 15, MyENCODING_ISO_8859_2, 473, 312}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gb2312", 6, MyENCODING_GBK, 0, 314}, + {"windows-1254", 12, "csisolatin5", 11, MyENCODING_WINDOWS_1254, 0, 315}, + {"iso-8859-6", 10, "iso-8859-6-i", 12, MyENCODING_ISO_8859_6, 476, 316}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "iso8859-2", 9, MyENCODING_ISO_8859_2, 0, 323}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "l2", 2, MyENCODING_ISO_8859_2, 0, 326}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "latin1", 6, MyENCODING_WINDOWS_1252, 0, 328}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "ks_c_5601-1989", 14, MyENCODING_EUC_KR, 0, 330}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso8859-6", 9, MyENCODING_ISO_8859_6, 0, 332}, + {"iso-8859-2", 10, "iso-ir-101", 10, MyENCODING_ISO_8859_2, 477, 333}, + {"ibm866", 6, "cp866", 5, MyENCODING_IBM866, 0, 334}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-3", 10, "iso-8859-3", 10, MyENCODING_ISO_8859_3, 480, 338}, + {"iso-8859-4", 10, "l4", 2, MyENCODING_ISO_8859_4, 0, 339}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1253", 12, "windows-1253", 12, MyENCODING_WINDOWS_1253, 0, 342}, + {"iso-8859-5", 10, "iso-8859-5", 10, MyENCODING_ISO_8859_5, 482, 343}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "iso-ir-127", 10, MyENCODING_ISO_8859_6, 484, 348}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"utf-8", 5, "unicode-1-1-utf-8", 17, MyENCODING_UTF_8, 0, 350}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-10", 11, "l6", 2, MyENCODING_ISO_8859_10, 0, 352}, + {"iso-8859-3", 10, "iso-ir-109", 10, MyENCODING_ISO_8859_3, 487, 353}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1253", 12, "x-cp1253", 8, MyENCODING_WINDOWS_1253, 0, 357}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-16", 11, "iso-8859-16", 11, MyENCODING_ISO_8859_16, 490, 359}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8-i", 12, "logical", 7, MyENCODING_ISO_8859_8_I, 0, 363}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-8", 10, "csisolatinhebrew", 16, MyENCODING_ISO_8859_8, 0, 366}, + {"iso-8859-3", 10, "latin3", 6, MyENCODING_ISO_8859_3, 491, 367}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "euc-kr", 6, MyENCODING_EUC_KR, 0, 369}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1252", 12, "cp1252", 6, MyENCODING_WINDOWS_1252, 0, 371}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-6", 10, "csiso88596i", 11, MyENCODING_ISO_8859_6, 492, 378}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gbk", 3, MyENCODING_GBK, 0, 382}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-kr", 6, "csksc56011987", 13, MyENCODING_EUC_KR, 0, 394}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"x-mac-cyrillic", 14, "x-mac-cyrillic", 14, MyENCODING_X_MAC_CYRILLIC, 0, 397}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-2", 10, "csisolatin2", 11, MyENCODING_ISO_8859_2, 0, 400}, + {"x-user-defined", 14, "x-user-defined", 14, MyENCODING_X_USER_DEFINED, 0, 401}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1254", 12, "latin5", 6, MyENCODING_WINDOWS_1254, 0, 406}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"windows-1257", 12, "cp1257", 6, MyENCODING_WINDOWS_1257, 0, 408}, + {"big5", 4, "big5-hkscs", 10, MyENCODING_BIG5, 0, 409}, + {"windows-1250", 12, "x-cp1250", 8, MyENCODING_WINDOWS_1250, 0, 410}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"euc-jp", 6, "euc-jp", 6, MyENCODING_EUC_JP, 0, 414}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"iso-8859-7", 10, "ecma-118", 8, MyENCODING_ISO_8859_7, 493, 416}, + {NULL, 0, NULL, 0, 0, 0, 0}, + {"gbk", 3, "gb_2312-80", 10, MyENCODING_GBK, 0, 418}, + {"windows-1251", 12, "windows-1251", 12, MyENCODING_WINDOWS_1251, 0, 419}, + {"iso-8859-13", 11, "iso885913", 9, MyENCODING_ISO_8859_13, 0, 420}, + {"windows-1256", 12, "windows-1256", 12, MyENCODING_WINDOWS_1256, 0, 421}, + {"iso-8859-5", 10, "csisolatincyrillic", 18, MyENCODING_ISO_8859_5, 0, 422}, + {"gbk", 3, "chinese", 7, MyENCODING_GBK, 0, 423}, + {"shift_jis", 9, "shift_jis", 9, MyENCODING_SHIFT_JIS, 0, 424}, + {"windows-874", 11, "iso-8859-11", 11, MyENCODING_WINDOWS_874, 0, 425}, + {"iso-8859-15", 11, "iso_8859-15", 11, MyENCODING_ISO_8859_15, 0, 426}, + {"big5", 4, "csbig5", 6, MyENCODING_BIG5, 0, 427}, + {"iso-8859-8", 10, "hebrew", 6, MyENCODING_ISO_8859_8, 429, 428}, + {"windows-1254", 12, "windows-1254", 12, MyENCODING_WINDOWS_1254, 0, 429}, + {"iso-8859-5", 10, "iso88595", 8, MyENCODING_ISO_8859_5, 0, 430}, + {"iso-8859-10", 11, "iso885910", 9, MyENCODING_ISO_8859_10, 0, 431}, + {"windows-1254", 12, "iso_8859-9:1989", 15, MyENCODING_WINDOWS_1254, 0, 432}, + {"iso-8859-7", 10, "iso88597", 8, MyENCODING_ISO_8859_7, 434, 433}, + {"iso-8859-6", 10, "csisolatinarabic", 16, MyENCODING_ISO_8859_6, 0, 434}, + {"windows-1251", 12, "x-cp1251", 8, MyENCODING_WINDOWS_1251, 0, 435}, + {"iso-8859-14", 11, "iso885914", 9, MyENCODING_ISO_8859_14, 0, 436}, + {"iso-8859-10", 11, "iso8859-10", 10, MyENCODING_ISO_8859_10, 438, 437}, + {"windows-1252", 12, "iso-ir-100", 10, MyENCODING_WINDOWS_1252, 0, 438}, + {"iso-8859-2", 10, "iso_8859-2", 10, MyENCODING_ISO_8859_2, 0, 439}, + {"iso-8859-8", 10, "iso8859-8", 9, MyENCODING_ISO_8859_8, 441, 440}, + {"gbk", 3, "iso-ir-58", 9, MyENCODING_GBK, 442, 441}, + {"macintosh", 9, "csmacintosh", 11, MyENCODING_MACINTOSH, 0, 442}, + {"iso-8859-4", 10, "iso_8859-4", 10, MyENCODING_ISO_8859_4, 444, 443}, + {"iso-8859-5", 10, "iso-ir-144", 10, MyENCODING_ISO_8859_5, 445, 444}, + {"iso-8859-14", 11, "iso8859-14", 10, MyENCODING_ISO_8859_14, 0, 445}, + {"iso-8859-6", 10, "iso-8859-6", 10, MyENCODING_ISO_8859_6, 447, 446}, + {"iso-8859-6", 10, "iso_8859-6", 10, MyENCODING_ISO_8859_6, 448, 447}, + {"iso-8859-7", 10, "iso-ir-126", 10, MyENCODING_ISO_8859_7, 0, 448}, + {"iso-8859-8", 10, "iso-ir-138", 10, MyENCODING_ISO_8859_8, 450, 449}, + {"iso-8859-8", 10, "iso_8859-8", 10, MyENCODING_ISO_8859_8, 451, 450}, + {"windows-1254", 12, "iso-ir-148", 10, MyENCODING_WINDOWS_1254, 0, 451}, + {"big5", 4, "x-x-big5", 8, MyENCODING_BIG5, 0, 452}, + {"iso-8859-4", 10, "iso_8859-4:1988", 15, MyENCODING_ISO_8859_4, 454, 453}, + {"iso-8859-5", 10, "iso_8859-5:1988", 15, MyENCODING_ISO_8859_5, 455, 454}, + {"iso-8859-8", 10, "iso_8859-8:1988", 15, MyENCODING_ISO_8859_8, 0, 455}, + {"iso-8859-8", 10, "csiso88598e", 11, MyENCODING_ISO_8859_8, 0, 456}, + {"iso-8859-10", 11, "latin6", 6, MyENCODING_ISO_8859_10, 458, 457}, + {"windows-874", 11, "iso885911", 9, MyENCODING_WINDOWS_874, 459, 458}, + {"windows-1252", 12, "iso8859-1", 9, MyENCODING_WINDOWS_1252, 0, 459}, + {"iso-8859-15", 11, "iso885915", 9, MyENCODING_ISO_8859_15, 0, 460}, + {"macintosh", 9, "x-mac-roman", 11, MyENCODING_MACINTOSH, 0, 461}, + {"koi8-r", 6, "cskoi8r", 7, MyENCODING_KOI8_R, 463, 462}, + {"euc-kr", 6, "cseuckr", 7, MyENCODING_EUC_KR, 0, 463}, + {"x-mac-cyrillic", 14, "x-mac-ukrainian", 15, MyENCODING_X_MAC_CYRILLIC, 0, 464}, + {"windows-1252", 12, "x-cp1252", 8, MyENCODING_WINDOWS_1252, 0, 465}, + {"iso-8859-13", 11, "iso-8859-13", 11, MyENCODING_ISO_8859_13, 0, 466}, + {"gb18030", 7, "gb18030", 7, MyENCODING_GB18030, 0, 467}, + {"utf-16le", 8, "utf-16le", 8, MyENCODING_UTF_16LE, 0, 468}, + {"koi8-r", 6, "koi8_r", 6, MyENCODING_KOI8_R, 0, 469}, + {"shift_jis", 9, "csshiftjis", 10, MyENCODING_SHIFT_JIS, 0, 470}, + {"iso-8859-6", 10, "iso-8859-6-e", 12, MyENCODING_ISO_8859_6, 472, 471}, + {"iso-8859-8", 10, "iso-8859-8-e", 12, MyENCODING_ISO_8859_8, 0, 472}, + {"iso-8859-6", 10, "iso_8859-6:1987", 15, MyENCODING_ISO_8859_6, 474, 473}, + {"iso-8859-7", 10, "iso_8859-7:1987", 15, MyENCODING_ISO_8859_7, 475, 474}, + {"windows-1252", 12, "iso_8859-1:1987", 15, MyENCODING_WINDOWS_1252, 0, 475}, + {"iso-8859-8-i", 12, "iso-8859-8-i", 12, MyENCODING_ISO_8859_8_I, 0, 476}, + {"windows-874", 11, "iso8859-11", 10, MyENCODING_WINDOWS_874, 478, 477}, + {"windows-1252", 12, "iso-8859-1", 10, MyENCODING_WINDOWS_1252, 479, 478}, + {"windows-1252", 12, "iso_8859-1", 10, MyENCODING_WINDOWS_1252, 0, 479}, + {"iso-8859-3", 10, "iso_8859-3", 10, MyENCODING_ISO_8859_3, 481, 480}, + {"iso-8859-13", 11, "iso8859-13", 10, MyENCODING_ISO_8859_13, 0, 481}, + {"iso-8859-5", 10, "iso_8859-5", 10, MyENCODING_ISO_8859_5, 483, 482}, + {"iso-8859-15", 11, "iso8859-15", 10, MyENCODING_ISO_8859_15, 0, 483}, + {"iso-8859-7", 10, "iso-8859-7", 10, MyENCODING_ISO_8859_7, 485, 484}, + {"iso-8859-7", 10, "iso_8859-7", 10, MyENCODING_ISO_8859_7, 486, 485}, + {"iso-8859-10", 11, "iso-ir-157", 10, MyENCODING_ISO_8859_10, 0, 486}, + {"windows-1254", 12, "iso-8859-9", 10, MyENCODING_WINDOWS_1254, 488, 487}, + {"windows-1254", 12, "iso_8859-9", 10, MyENCODING_WINDOWS_1254, 489, 488}, + {"euc-kr", 6, "iso-ir-149", 10, MyENCODING_EUC_KR, 0, 489}, + {"windows-1258", 12, "windows-1258", 12, MyENCODING_WINDOWS_1258, 0, 490}, + {"windows-874", 11, "dos-874", 7, MyENCODING_WINDOWS_874, 0, 491}, + {"iso-8859-8-i", 12, "csiso88598i", 11, MyENCODING_ISO_8859_8_I, 0, 492}, + {"iso-8859-7", 10, "elot_928", 8, MyENCODING_ISO_8859_7, 0, 493}, +}; + +static const myencoding_entry_name_index_t myencoding_entry_name_index_static_list_index[(MyENCODING_LAST_ENTRY + 1)] = +{ + {"UTF-8", 5}, + {"AUTO", 4}, + {"NOT-DETERMINED", 14}, + {"UTF-16LE", 8}, + {"UTF-16BE", 8}, + {"X-USER-DEFINED", 14}, + {"BIG5", 4}, + {"EUC-JP", 6}, + {"EUC-KR", 6}, + {"GB18030", 7}, + {"GBK", 3}, + {"IBM866", 6}, + {"ISO-2022-JP", 11}, + {"ISO-8859-10", 11}, + {"ISO-8859-13", 11}, + {"ISO-8859-14", 11}, + {"ISO-8859-15", 11}, + {"ISO-8859-16", 11}, + {"ISO-8859-2", 10}, + {"ISO-8859-3", 10}, + {"ISO-8859-4", 10}, + {"ISO-8859-5", 10}, + {"ISO-8859-6", 10}, + {"ISO-8859-7", 10}, + {"ISO-8859-8", 10}, + {"ISO-8859-8-I", 12}, + {"KOI8-R", 6}, + {"KOI8-U", 6}, + {"MACINTOSH", 9}, + {"SHIFT_JIS", 9}, + {"WINDOWS-1250", 12}, + {"WINDOWS-1251", 12}, + {"WINDOWS-1252", 12}, + {"WINDOWS-1253", 12}, + {"WINDOWS-1254", 12}, + {"WINDOWS-1255", 12}, + {"WINDOWS-1256", 12}, + {"WINDOWS-1257", 12}, + {"WINDOWS-1258", 12}, + {"WINDOWS-874", 11}, + {"X-MAC-CYRILLIC", 14}, + {"", 0}, +}; + +static const myencoding_trigram_t myencoding_detect_trigrams_index_ibm866[] = { + {{0xA5, 0xAD, 0xA8}, 991}, /* ени */ + {{0xAE, 0xA3, 0xAE}, 806}, /* ого */ + {{0xE1, 0xE2, 0xA2}, 659}, /* ств */ + {{0xAD, 0xA8, 0xEF}, 629}, /* ния */ + {{0xAE, 0xA2, 0xA0}, 566}, /* ова */ + {{0xE2, 0xA5, 0xAB}, 555}, /* тел */ + {{0xE0, 0xA5, 0xA4}, 507}, /* ред */ + {{0xA5, 0xAD, 0xAD}, 499}, /* енн */ + {{0xAE, 0xA2, 0xAE}, 443}, /* ово */ + {{0xA0, 0xAD, 0xA8}, 443}, /* ани */ + {{0xE2, 0xE0, 0xA0}, 429}, /* тра */ + {{0xAE, 0xE1, 0xE2}, 428}, /* ост */ + {{0xAD, 0xA8, 0xA5}, 419}, /* ние */ + {{0xAD, 0xAD, 0xAE}, 412}, /* нно */ + {{0xA0, 0xE5, 0xAE}, 396}, /* ахо */ + {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ + {{0xE0, 0xA0, 0xE5}, 386}, /* рах */ + {{0xE5, 0xAE, 0xA2}, 379}, /* хов */ + {{0xA5, 0xAB, 0xEC}, 365}, /* ель */ + {{0xA3, 0xAE, 0xA2}, 360}, /* гов */ + {{0xA2, 0xAE, 0xE0}, 356}, /* вор */ + {{0xA5, 0xE1, 0xE2}, 349}, /* ест */ + {{0xA0, 0xE2, 0xEC}, 345}, /* ать */ + {{0xE0, 0xA0, 0xA2}, 337}, /* рав */ + {{0xAF, 0xE0, 0xA8}, 330}, /* при */ + {{0xAF, 0xE0, 0xA5}, 323}, /* пре */ + {{0xA4, 0xAE, 0xA3}, 318}, /* дог */ + {{0xAD, 0xA5, 0xAD}, 310}, /* нен */ + {{0xAF, 0xE0, 0xA0}, 309}, /* пра */ + {{0xA2, 0xA0, 0xAD}, 304}, /* ван */ + {{0xA8, 0xE2, 0xA5}, 295}, /* ите */ + {{0xE2, 0xA2, 0xA5}, 281}, /* тве */ + {{0xAB, 0xA5, 0xAD}, 266}, /* лен */ + {{0xE1, 0xE2, 0xAE}, 261}, /* сто */ + {{0xE2, 0xA0, 0xE2}, 260}, /* тат */ + {{0xAD, 0xAD, 0xEB}, 260}, /* нны */ + {{0xAB, 0xEC, 0xAD}, 256}, /* льн */ + {{0xA2, 0xAE, 0xA7}, 255}, /* воз */ + {{0xA8, 0xAB, 0xA8}, 254}, /* или */ + {{0xA0, 0xE2, 0xA5}, 252}, /* ате */ + {{0xA5, 0xA3, 0xAE}, 241}, /* его */ + {{0xA5, 0xE2, 0xE1}, 238}, /* етс */ + {{0xAD, 0xAE, 0xE1}, 236}, /* нос */ + {{0xE9, 0xA5, 0xE1}, 235}, /* щес */ + {{0xAF, 0xAE, 0xAB}, 232}, /* пол */ + {{0xE0, 0xA0, 0xAD}, 231}, /* ран */ + {{0xAD, 0xAE, 0xA3}, 230}, /* ног */ + {{0xE1, 0xE2, 0xA0}, 229}, /* ста */ + {{0xE7, 0xA5, 0xAD}, 226}, /* чен */ + {{0xE2, 0xE0, 0xA5}, 224}, /* тре */ + {{0xA7, 0xAC, 0xA5}, 214}, /* зме */ + {{0xE3, 0xE9, 0xA5}, 212}, /* уще */ + {{0xE1, 0xE2, 0xA8}, 210}, /* сти */ + {{0xAA, 0xAE, 0xAC}, 207}, /* ком */ + {{0xAE, 0xE0, 0xAE}, 206}, /* оро */ + {{0xA2, 0xAB, 0xA5}, 195}, /* вле */ + {{0xA7, 0xA0, 0xAD}, 194}, /* зан */ + {{0xA0, 0xE1, 0xE2}, 193}, /* аст */ + {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ + {{0xE5, 0xE0, 0xA0}, 187}, /* хра */ + {{0xA0, 0xAD, 0xAD}, 182}, /* анн */ + {{0xA5, 0xE0, 0xA5}, 182}, /* ере */ + {{0xA2, 0xE0, 0xA5}, 178}, /* вре */ + {{0xAE, 0xA2, 0xA5}, 173}, /* ове */ + {{0xEC, 0xAD, 0xAE}, 173}, /* ьно */ + {{0xA2, 0xA5, 0xE0}, 172}, /* вер */ + {{0xAC, 0xA5, 0xAD}, 170}, /* мен */ + {{0xAB, 0xA8, 0xE6}, 168}, /* лиц */ + {{0xE2, 0xAE, 0xE0}, 167}, /* тор */ + {{0xE0, 0xA5, 0xAD}, 167}, /* рен */ + {{0xE9, 0xA5, 0xAD}, 165}, /* щен */ + {{0xAE, 0xA7, 0xAC}, 164}, /* озм */ + {{0xA5, 0xA4, 0xA0}, 163}, /* еда */ + {{0xE2, 0xA2, 0xA8}, 159}, /* тви */ + {{0xEF, 0xA7, 0xA0}, 159}, /* яза */ + {{0xA1, 0xEF, 0xA7}, 158}, /* бяз */ + {{0xAD, 0xA8, 0xA8}, 153}, /* нии */ + {{0xAD, 0xEB, 0xE5}, 153}, /* ных */ + {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ + {{0xAC, 0xA5, 0xE0}, 153}, /* мер */ + {{0xE1, 0xAB, 0xA8}, 150}, /* сли */ + {{0xE2, 0xAE, 0xA2}, 148}, /* тов */ + {{0xE2, 0xA2, 0xA0}, 147}, /* тва */ + {{0xAE, 0xE0, 0xA0}, 146}, /* ора */ + {{0xAD, 0xAE, 0xAC}, 144}, /* ном */ + {{0xA4, 0xA5, 0xAD}, 144}, /* ден */ + {{0xA0, 0xAD, 0xA5}, 142}, /* ане */ + {{0xAA, 0xAE, 0xAD}, 141}, /* кон */ + {{0xAB, 0xE3, 0xE7}, 141}, /* луч */ + {{0xAC, 0xE3, 0xE9}, 140}, /* мущ */ + {{0xAE, 0xA1, 0xEF}, 140}, /* обя */ + {{0xA2, 0xA0, 0xE2}, 138}, /* ват */ + {{0xA2, 0xA0, 0xE0}, 137}, /* вар */ + {{0xA5, 0xE9, 0xA5}, 137}, /* еще */ + {{0xAE, 0xE2, 0xE0}, 137}, /* отр */ + {{0xA4, 0xA5, 0xAB}, 137}, /* дел */ + {{0xAD, 0xEB, 0xAC}, 136}, /* ным */ + {{0xA8, 0xAC, 0xE3}, 136}, /* иму */ + {{0x91, 0xE2, 0xA0}, 134}, /* Ста */ + {{0xE3, 0xE7, 0xA0}, 133}, /* уча */ + {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ + {{0xA5, 0xAB, 0xEF}, 130}, /* еля */ + {{0xE1, 0xAB, 0xE3}, 130}, /* слу */ + {{0xA7, 0xA0, 0xAA}, 130}, /* зак */ + {{0xE2, 0xAE, 0xEF}, 129}, /* тоя */ + {{0xAE, 0xAC, 0xA8}, 128}, /* оми */ + {{0xAC, 0xA5, 0xE9}, 128}, /* мещ */ + {{0xA5, 0xA4, 0xE3}, 127}, /* еду */ + {{0xA2, 0xA5, 0xAD}, 127}, /* вен */ + {{0xAD, 0xAE, 0xA2}, 127}, /* нов */ + {{0xAD, 0xAE, 0xA5}, 126}, /* ное */ + {{0xAE, 0xE2, 0xA2}, 125}, /* отв */ + {{0xAA, 0xA0, 0xA7}, 125}, /* каз */ + {{0xA0, 0xA5, 0xE2}, 125}, /* ает */ + {{0xE1, 0xAA, 0xAE}, 125}, /* ско */ + {{0xA5, 0xAD, 0xE2}, 124}, /* ент */ + {{0xAC, 0xAE, 0xE2}, 123}, /* мот */ + {{0xA0, 0xA2, 0xAB}, 122}, /* авл */ + {{0xE1, 0xAC, 0xAE}, 122}, /* смо */ + {{0xA8, 0xE7, 0xA8}, 121}, /* ичи */ + {{0xA1, 0xEB, 0xE2}, 120}, /* быт */ + {{0xE3, 0xE1, 0xAC}, 118}, /* усм */ + {{0xE1, 0xE1, 0xA8}, 117}, /* сси */ + {{0xA4, 0xE3, 0xE1}, 117}, /* дус */ + {{0xE5, 0xAE, 0xA4}, 117}, /* ход */ + {{0xE0, 0xA8, 0xE7}, 117}, /* рич */ + {{0xE7, 0xA5, 0xE1}, 115}, /* чес */ + {{0xA3, 0xE0, 0xA0}, 114}, /* гра */ + {{0xAF, 0xE0, 0xAE}, 114}, /* про */ + {{0xA4, 0xAE, 0xA2}, 113}, /* дов */ + {{0xA2, 0xA5, 0xE2}, 112}, /* вет */ + {{0xA5, 0xA4, 0xA5}, 112}, /* еде */ + {{0xE8, 0xA5, 0xAD}, 111}, /* шен */ + {{0xE7, 0xA8, 0xAD}, 110}, /* чин */ + {{0xAD, 0xA0, 0xE1}, 109}, /* нас */ + {{0xA8, 0xE2, 0xEC}, 105}, /* ить */ + {{0xE2, 0xA2, 0xAE}, 105}, /* тво */ + {{0xAA, 0xAB, 0xEE}, 104}, /* клю */ + {{0xE0, 0xA8, 0xE2}, 104}, /* рит */ + {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ + {{0xAB, 0xEE, 0xE7}, 104}, /* люч */ + {{0xE2, 0xAE, 0xAC}, 104}, /* том */ + {{0xE1, 0xAB, 0xA5}, 103}, /* сле */ + {{0xE1, 0xAF, 0xAE}, 102}, /* спо */ + {{0xAE, 0xAB, 0xAD}, 102}, /* олн */ + {{0xA5, 0xE1, 0xAB}, 102}, /* есл */ + {{0xA5, 0xE0, 0xA8}, 101}, /* ери */ + {{0xAD, 0xAE, 0xA9}, 101}, /* ной */ + {{0xE0, 0xAE, 0xAC}, 101}, /* ром */ + {{0xAE, 0xE2, 0xAE}, 99}, /* ото */ + {{0xAD, 0xEB, 0xA5}, 99}, /* ные */ + {{0xA7, 0xAD, 0xA0}, 99}, /* зна */ + {{0xA2, 0xAB, 0xEF}, 99}, /* вля */ + {{0xE2, 0xA5, 0xE0}, 98}, /* тер */ + {{0xE3, 0xAF, 0xE0}, 97}, /* упр */ + {{0xA0, 0xAA, 0xAE}, 96}, /* ако */ + {{0xAA, 0xAE, 0xA3}, 96}, /* ког */ + {{0xAD, 0xEB, 0xA9}, 96}, /* ный */ + {{0xAE, 0xE0, 0xE3}, 96}, /* ору */ + {{0xA5, 0xAB, 0xA5}, 95}, /* еле */ + {{0xA5, 0xE1, 0xAA}, 95}, /* еск */ + {{0xA0, 0xA7, 0xA0}, 95}, /* аза */ + {{0xA9, 0xE1, 0xE2}, 93}, /* йст */ + {{0xAF, 0xAE, 0xE0}, 93}, /* пор */ + {{0xAE, 0xA6, 0xA5}, 92}, /* оже */ + {{0xA8, 0xAD, 0xA5}, 91}, /* ине */ + {{0xE9, 0xA5, 0xA9}, 90}, /* щей */ + {{0xA6, 0xA4, 0xA5}, 90}, /* жде */ + {{0xAF, 0xA5, 0xE0}, 89}, /* пер */ + {{0xAD, 0xA8, 0xE2}, 89}, /* нит */ + {{0xAE, 0xAB, 0xEC}, 89}, /* оль */ + {{0xA0, 0xA6, 0xA4}, 88}, /* ажд */ + {{0xA6, 0xA5, 0xAD}, 87}, /* жен */ + {{0xAB, 0xA0, 0xA4}, 87}, /* лад */ + {{0xA0, 0xAC, 0xA8}, 87}, /* ами */ + {{0xAA, 0xAE, 0xE2}, 86}, /* кот */ + {{0xE7, 0xA0, 0xA5}, 85}, /* чае */ + {{0xA2, 0xA5, 0xE9}, 85}, /* вещ */ + {{0xA2, 0xA8, 0xEF}, 85}, /* вия */ + {{0xEF, 0xE9, 0xA5}, 85}, /* яще */ + {{0xA8, 0xA5, 0xAC}, 85}, /* ием */ + {{0xAA, 0xAB, 0xA0}, 85}, /* кла */ + {{0xA5, 0xA9, 0xE1}, 84}, /* ейс */ + {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ + {{0xA0, 0xA2, 0xAE}, 84}, /* аво */ + {{0xE0, 0xA0, 0xA6}, 83}, /* раж */ + {{0xAB, 0xEC, 0xE1}, 83}, /* льс */ + {{0xAE, 0xEF, 0xE9}, 82}, /* оящ */ + {{0xA5, 0xAD, 0xAE}, 81}, /* ено */ + {{0xA4, 0xE1, 0xE2}, 81}, /* дст */ + {{0xA4, 0xA5, 0xA9}, 80}, /* дей */ + {{0xE0, 0xA5, 0xA1}, 80}, /* реб */ + {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ + {{0xA5, 0xA4, 0xE1}, 79}, /* едс */ + {{0xA0, 0xE0, 0xA8}, 79}, /* ари */ + {{0xA4, 0xA0, 0xAD}, 79}, /* дан */ + {{0xAC, 0xAE, 0xA6}, 78}, /* мож */ + {{0xA8, 0xAC, 0xA5}, 78}, /* име */ + {{0xA8, 0xAD, 0xAE}, 78}, /* ино */ + {{0xE0, 0xA8, 0xAD}, 77}, /* рин */ + {{0xA4, 0xAE, 0xE1}, 77}, /* дос */ + {{0xAF, 0xAE, 0xE1}, 77}, /* пос */ + {{0xE2, 0xA0, 0xAA}, 77}, /* так */ + {{0xE9, 0xA5, 0xA3}, 77}, /* щег */ + {{0xA4, 0xA0, 0xE2}, 77}, /* дат */ + {{0xAF, 0xAB, 0xA0}, 76}, /* пла */ + {{0xE3, 0xE1, 0xAB}, 76}, /* усл */ + {{0xA8, 0xE6, 0xA0}, 76}, /* ица */ + {{0xE0, 0xAE, 0xA2}, 75}, /* ров */ + {{0xED, 0xE2, 0xAE}, 75}, /* это */ + {{0xE3, 0xE7, 0xA5}, 74}, /* уче */ + {{0xA4, 0xAE, 0xAB}, 73}, /* дол */ + {{0xEC, 0xAD, 0xEB}, 73}, /* ьны */ + {{0xE0, 0xA0, 0xA7}, 73}, /* раз */ + {{0xAC, 0xA8, 0xE1}, 73}, /* мис */ + {{0xA0, 0xAD, 0xAE}, 72}, /* ано */ + {{0xE1, 0xE0, 0xAE}, 72}, /* сро */ + {{0xA0, 0xA2, 0xA8}, 72}, /* ави */ + {{0xE2, 0xEC, 0xA8}, 71}, /* тьи */ + {{0xEE, 0xE7, 0xA5}, 70}, /* юче */ + {{0xE1, 0xAA, 0xAB}, 70}, /* скл */ + {{0xA8, 0xE1, 0xE1}, 70}, /* исс */ + {{0xA6, 0xA5, 0xE2}, 69}, /* жет */ + {{0xA5, 0xA4, 0xAE}, 69}, /* едо */ + {{0xAB, 0xA5, 0xA4}, 69}, /* лед */ + {{0xAB, 0xAE, 0xA2}, 69}, /* лов */ + {{0xEE, 0xE9, 0xA8}, 68}, /* ющи */ + {{0xA8, 0xA1, 0xAE}, 68}, /* ибо */ + {{0xAB, 0xA0, 0xE2}, 67}, /* лат */ + {{0xE0, 0xAE, 0xAA}, 67}, /* рок */ + {{0xA0, 0xAA, 0xAB}, 67}, /* акл */ + {{0xE0, 0xA8, 0xE9}, 67}, /* рищ */ + {{0xA1, 0xAE, 0xA2}, 67}, /* бов */ + {{0xA8, 0xE1, 0xAA}, 67}, /* иск */ + {{0xA5, 0xA1, 0xAE}, 67}, /* ебо */ + {{0xAB, 0xEC, 0xA7}, 67}, /* льз */ + {{0xE3, 0xAA, 0xA0}, 67}, /* ука */ + {{0xAB, 0xA8, 0xA1}, 66}, /* либ */ + {{0xAE, 0xAC, 0xE3}, 66}, /* ому */ + {{0xAE, 0xA2, 0xAB}, 66}, /* овл */ + {{0xE2, 0xAD, 0xAE}, 65}, /* тно */ + {{0xA2, 0xAE, 0xA9}, 64}, /* вой */ + {{0xE2, 0xAE, 0xA3}, 64}, /* тог */ + {{0xE1, 0xAB, 0xAE}, 64}, /* сло */ + {{0xAE, 0xA7, 0xAD}, 64}, /* озн */ + {{0xE1, 0xAE, 0xAE}, 64}, /* соо */ + {{0xA7, 0xA0, 0xE2}, 63}, /* зат */ + {{0xA8, 0xE1, 0xAF}, 63}, /* исп */ + {{0xA0, 0xE7, 0xA5}, 63}, /* аче */ + {{0xAD, 0xA8, 0xEE}, 63}, /* нию */ + {{0xAE, 0xAD, 0xA5}, 63}, /* оне */ + {{0xAE, 0xAB, 0xA6}, 62}, /* олж */ + {{0xAE, 0xA2, 0xE9}, 61}, /* овщ */ + {{0xE0, 0xA0, 0xE1}, 61}, /* рас */ + {{0xA2, 0xA8, 0xA4}, 61}, /* вид */ + {{0xA2, 0xE9, 0xA8}, 61}, /* вщи */ + {{0xE1, 0xAD, 0xAE}, 61}, /* сно */ + {{0xA8, 0xE6, 0xAE}, 61}, /* ицо */ + {{0xA8, 0xE7, 0xA5}, 61}, /* иче */ + {{0xA0, 0xA2, 0xA5}, 61}, /* аве */ + {{0xA3, 0xAB, 0xA0}, 61}, /* гла */ + {{0xE7, 0xA5, 0xE2}, 61}, /* чет */ + {{0xE9, 0xA8, 0xAA}, 61}, /* щик */ + {{0xE0, 0xE3, 0xA3}, 60}, /* руг */ + {{0xE2, 0xA0, 0xAD}, 60}, /* тан */ + {{0xA8, 0xAC, 0xAE}, 60}, /* имо */ + {{0xA0, 0xAB, 0xEC}, 60}, /* аль */ + {{0xAE, 0xA2, 0xA8}, 60}, /* ови */ + {{0xA6, 0xA4, 0xA0}, 60}, /* жда */ + {{0xAF, 0xAE, 0xA2}, 60}, /* пов */ + {{0xA5, 0xAC, 0xE3}, 60}, /* ему */ + {{0xEF, 0xE2, 0xA5}, 60}, /* яте */ + {{0xE1, 0xA8, 0xA8}, 59}, /* сии */ + {{0xA1, 0xAE, 0xE2}, 59}, /* бот */ + {{0xA2, 0xEB, 0xAF}, 59}, /* вып */ + {{0xA0, 0xA1, 0xAE}, 59}, /* або */ + {{0xAB, 0xEF, 0xEE}, 59}, /* ляю */ + {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ + {{0xAE, 0xA4, 0xA5}, 58}, /* оде */ + {{0xA8, 0xAD, 0xA8}, 58}, /* ини */ + {{0xE0, 0xA0, 0xE2}, 58}, /* рат */ + {{0xEF, 0xA2, 0xAB}, 58}, /* явл */ + {{0xAD, 0xA0, 0xA3}, 57}, /* наг */ + {{0xA4, 0xE0, 0xE3}, 57}, /* дру */ + {{0xE0, 0xA0, 0xA1}, 57}, /* раб */ + {{0xA0, 0xA3, 0xE0}, 57}, /* агр */ + {{0xA8, 0xAE, 0xAD}, 57}, /* ион */ + {{0xAC, 0xA5, 0xE1}, 57}, /* мес */ + {{0xA0, 0xE6, 0xA8}, 56}, /* аци */ + {{0xAE, 0xE1, 0xE3}, 56}, /* осу */ + {{0xAA, 0xAE, 0xA9}, 55}, /* кой */ + {{0xE1, 0xA2, 0xAE}, 55}, /* сво */ + {{0xA7, 0xAE, 0xA2}, 55}, /* зов */ + {{0xAE, 0xAF, 0xE0}, 54}, /* опр */ + {{0xE1, 0xAE, 0xA1}, 54}, /* соб */ + {{0xA2, 0xAF, 0xE0}, 54}, /* впр */ + {{0xAB, 0xAD, 0xA5}, 54}, /* лне */ + {{0xAE, 0xAC, 0xAC}, 54}, /* омм */ + {{0xA5, 0xE0, 0xA0}, 54}, /* ера */ + {{0xE7, 0xA8, 0xE2}, 54}, /* чит */ + {{0xA5, 0xE0, 0xE7}, 54}, /* ерч */ + {{0xE0, 0xE7, 0xA5}, 54}, /* рче */ + {{0xA0, 0xE2, 0xA8}, 54}, /* ати */ + {{0xAD, 0xA8, 0xAA}, 54}, /* ник */ + {{0xAC, 0xAC, 0xA5}, 54}, /* мме */ + {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ + {{0xE2, 0xA5, 0xAD}, 53}, /* тен */ + {{0xA2, 0xA5, 0xA4}, 53}, /* вед */ + {{0xE1, 0xAE, 0xA2}, 52}, /* сов */ + {{0xA0, 0xA6, 0xA5}, 52}, /* аже */ + {{0xAE, 0xAA, 0xA0}, 52}, /* ока */ + {{0xEB, 0xAC, 0xA8}, 52}, /* ыми */ + {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ + {{0xAE, 0xAE, 0xE2}, 52}, /* оот */ + {{0xAC, 0xA8, 0xE2}, 52}, /* мит */ + {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ + {{0xA2, 0xE8, 0xA5}, 51}, /* вше */ + {{0xE1, 0xA8, 0xAE}, 51}, /* сио */ + {{0xAE, 0xAD, 0xAE}, 51}, /* оно */ + {{0xA0, 0xA2, 0xA0}, 51}, /* ава */ + {{0xA0, 0xE9, 0xA5}, 51}, /* аще */ + {{0xAB, 0xEF, 0xA5}, 50}, /* ляе */ + {{0xA5, 0xAD, 0xA5}, 50}, /* ене */ + {{0xAE, 0xA4, 0xA8}, 50}, /* оди */ + {{0xAF, 0xE3, 0xAD}, 49}, /* пун */ + {{0xAB, 0xA8, 0xE7}, 49}, /* лич */ + {{0xA2, 0xAE, 0xAC}, 49}, /* вом */ + {{0xAD, 0xAA, 0xE2}, 49}, /* нкт */ + {{0xAD, 0xA5, 0xE1}, 49}, /* нес */ + {{0xA2, 0xA8, 0xAB}, 49}, /* вил */ + {{0xA5, 0xA6, 0xA4}, 49}, /* ежд */ + {{0xE0, 0xA5, 0xE1}, 49}, /* рес */ + {{0xEE, 0xE9, 0xA5}, 49}, /* юще */ + {{0xEC, 0xA7, 0xAE}, 49}, /* ьзо */ + {{0xAF, 0xAE, 0xE2}, 49}, /* пот */ + {{0xE3, 0xAD, 0xAA}, 49}, /* унк */ + {{0xE1, 0xE2, 0xA5}, 49}, /* сте */ + {{0xAA, 0xAE, 0xA2}, 49}, /* ков */ + {{0xAE, 0xE1, 0xAB}, 48}, /* осл */ + {{0xEF, 0xA5, 0xE2}, 48}, /* яет */ + {{0x85, 0xE1, 0xAB}, 48}, /* Есл */ + {{0x8F, 0xE0, 0xA8}, 48}, /* При */ + {{0xE2, 0xA0, 0xA2}, 48}, /* тав */ + {{0xAD, 0xA5, 0xE0}, 48}, /* нер */ + {{0xE7, 0xAD, 0xAE}, 47}, /* чно */ + {{0xAF, 0xAE, 0xA4}, 47}, /* под */ + {{0xAD, 0xE2, 0xA0}, 47}, /* нта */ + {{0xA8, 0xE9, 0xA5}, 47}, /* ище */ + {{0xAE, 0xA1, 0xE9}, 47}, /* общ */ + {{0xA0, 0xA7, 0xAC}, 47}, /* азм */ + {{0xA6, 0xAD, 0xAE}, 47}, /* жно */ + {{0xA2, 0xA8, 0xA8}, 46}, /* вии */ + {{0xE0, 0xA0, 0xE9}, 46}, /* ращ */ + {{0xAE, 0xE0, 0xA5}, 46}, /* оре */ + {{0xA2, 0xE8, 0xA8}, 46}, /* вши */ + {{0xA5, 0xAA, 0xE1}, 46}, /* екс */ + {{0xA2, 0xAE, 0xA3}, 46}, /* вог */ + {{0xE7, 0xE2, 0xAE}, 46}, /* что */ + {{0xA8, 0xE7, 0xAD}, 45}, /* ичн */ + {{0xAB, 0xA5, 0xAC}, 45}, /* лем */ + {{0xAC, 0xAE, 0xA3}, 45}, /* мог */ + {{0xE2, 0xA2, 0xAB}, 45}, /* твл */ + {{0xA4, 0xAB, 0xA5}, 45}, /* дле */ + {{0xA4, 0xAB, 0xEF}, 45}, /* для */ + {{0xE0, 0xA5, 0xE2}, 45}, /* рет */ + {{0xA0, 0xE0, 0xA0}, 45}, /* ара */ + {{0xAD, 0xEF, 0xE2}, 44}, /* нят */ + {{0xA5, 0xE7, 0xA5}, 44}, /* ече */ + {{0xAE, 0xE2, 0xA5}, 44}, /* оте */ + {{0xAE, 0xE0, 0xEB}, 44}, /* оры */ + {{0xAE, 0xE1, 0xAD}, 43}, /* осн */ + {{0xAE, 0xA1, 0xAE}, 43}, /* обо */ + {{0xAE, 0xA3, 0xAB}, 43}, /* огл */ + {{0xA8, 0xAD, 0xEB}, 43}, /* ины */ + {{0xA5, 0xE1, 0xE1}, 43}, /* есс */ + {{0xAE, 0xA1, 0xE0}, 43}, /* обр */ + {{0xAA, 0xE0, 0xA0}, 43}, /* кра */ + {{0xA8, 0xEF, 0xAC}, 43}, /* иям */ + {{0xA0, 0xAB, 0xAE}, 43}, /* ало */ + {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ + {{0xAE, 0xE0, 0xA3}, 43}, /* орг */ + {{0xE7, 0xA0, 0xEF}, 42}, /* чая */ + {{0xAD, 0xA8, 0xAC}, 42}, /* ним */ + {{0xA8, 0xA7, 0xAD}, 42}, /* изн */ + {{0xAF, 0xAE, 0xAA}, 42}, /* пок */ + {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ + {{0xA5, 0xAB, 0xEE}, 42}, /* елю */ + {{0xE2, 0xA8, 0xE2}, 42}, /* тит */ + {{0xE6, 0xA5, 0xAD}, 42}, /* цен */ + {{0xE7, 0xA0, 0xE1}, 42}, /* час */ + {{0xA3, 0xA0, 0xAD}, 42}, /* ган */ + {{0xE0, 0xA3, 0xA0}, 42}, /* рга */ + {{0xE1, 0xE2, 0xAD}, 42}, /* стн */ + {{0xE0, 0xA5, 0xA6}, 42}, /* реж */ + {{0xE3, 0xAC, 0xAC}, 42}, /* умм */ + {{0xE2, 0xA2, 0xE3}, 41}, /* тву */ + {{0xE2, 0xE3, 0xAF}, 41}, /* туп */ + {{0xE1, 0xAA, 0xA8}, 40}, /* ски */ + {{0xA4, 0xA5, 0xAA}, 40}, /* дек */ + {{0xAB, 0xA5, 0xA6}, 40}, /* леж */ + {{0xA5, 0xE1, 0xA5}, 40}, /* есе */ + {{0xA2, 0xA8, 0xA5}, 40}, /* вие */ + {{0xE2, 0xAA, 0xA0}, 40}, /* тка */ + {{0xA5, 0xAA, 0xE0}, 40}, /* екр */ + {{0xAE, 0xA4, 0xAE}, 40}, /* одо */ + {{0xAA, 0xE1, 0xA0}, 40}, /* кса */ + {{0xE0, 0xA5, 0xAA}, 40}, /* рек */ + {{0xAD, 0xE2, 0xA5}, 40}, /* нте */ + {{0xE3, 0xA3, 0xA8}, 40}, /* уги */ + {{0xA1, 0xEB, 0xAB}, 40}, /* был */ + {{0xA8, 0xAD, 0xEF}, 40}, /* иня */ + {{0xA5, 0xE9, 0xA8}, 39}, /* ещи */ + {{0xA3, 0xA5, 0xAD}, 39}, /* ген */ + {{0x8A, 0xAE, 0xA4}, 39}, /* Код */ + {{0xA4, 0xA8, 0xE2}, 39}, /* дит */ + {{0xE1, 0xE5, 0xAE}, 39}, /* схо */ + {{0xA8, 0xAD, 0xE2}, 39}, /* инт */ + {{0xE1, 0xE3, 0xAC}, 39}, /* сум */ + {{0xE0, 0xAE, 0xAD}, 39}, /* рон */ + {{0xAE, 0xE2, 0xAA}, 39}, /* отк */ + {{0xA4, 0xAE, 0xAA}, 39}, /* док */ + {{0xA8, 0xAB, 0xA0}, 38}, /* ила */ + {{0xE6, 0xA5, 0xE1}, 38}, /* цес */ + {{0xA8, 0xAA, 0xA0}, 38}, /* ика */ + {{0xA7, 0xAD, 0xA8}, 38}, /* зни */ + {{0xAE, 0xA2, 0xEB}, 38}, /* овы */ + {{0xAB, 0xA6, 0xAD}, 38}, /* лжн */ + {{0xE3, 0xAF, 0xAB}, 38}, /* упл */ + {{0xA3, 0xA4, 0xA0}, 37}, /* гда */ + {{0xAB, 0xA0, 0xA6}, 37}, /* лаж */ + {{0xA6, 0xA5, 0xA4}, 37}, /* жед */ + {{0xA1, 0xA5, 0xA7}, 37}, /* без */ + {{0xA4, 0xA5, 0xE2}, 37}, /* дет */ + {{0xAE, 0xE0, 0xEF}, 37}, /* оря */ + {{0xE0, 0xAE, 0xE1}, 37}, /* рос */ + {{0xAE, 0xA1, 0xAB}, 37}, /* обл */ + {{0xE6, 0xA8, 0xA8}, 37}, /* ции */ + {{0xA4, 0xAE, 0xAC}, 37}, /* дом */ + {{0xAD, 0xE6, 0xA5}, 37}, /* нце */ + {{0xE8, 0xA5, 0xA3}, 37}, /* шег */ + {{0xAB, 0xAE, 0xA6}, 37}, /* лож */ + {{0xAE, 0xAD, 0xA0}, 37}, /* она */ + {{0xAE, 0xAA, 0xAB}, 37}, /* окл */ + {{0xAE, 0xA3, 0xA4}, 37}, /* огд */ + {{0xE0, 0xAE, 0xA4}, 37}, /* род */ + {{0xA5, 0xAD, 0xA0}, 37}, /* ена */ + {{0xAE, 0xAD, 0xE6}, 37}, /* онц */ + {{0xAE, 0xE2, 0xAD}, 37}, /* отн */ + {{0xE1, 0xAE, 0xA3}, 37}, /* сог */ + {{0xA5, 0xA2, 0xE8}, 37}, /* евш */ + {{0xA2, 0xA8, 0xE2}, 36}, /* вит */ + {{0xA5, 0xE0, 0xAF}, 36}, /* ерп */ + {{0xAE, 0xA4, 0xA0}, 36}, /* ода */ + {{0xA5, 0xE2, 0xA5}, 36}, /* ете */ + {{0xAD, 0xA5, 0xAE}, 36}, /* нео */ + {{0xE0, 0xAF, 0xA5}, 36}, /* рпе */ + {{0xA5, 0xE0, 0xE8}, 36}, /* ерш */ + {{0xA8, 0xAC, 0xA8}, 36}, /* ими */ + {{0xA8, 0xA2, 0xE8}, 36}, /* ивш */ + {{0xEB, 0xAF, 0xAB}, 36}, /* ыпл */ + {{0xAF, 0xA5, 0xA2}, 36}, /* пев */ + {{0xA0, 0xA4, 0xA0}, 36}, /* ада */ + {{0xAC, 0xAE, 0xE1}, 35}, /* мос */ + {{0xAE, 0xA1, 0xE1}, 35}, /* обс */ + {{0xAD, 0xA5, 0xA4}, 34}, /* нед */ + {{0xA8, 0xAA, 0xAE}, 34}, /* ико */ + {{0xE9, 0xA8, 0xAC}, 34}, /* щим */ + {{0xA4, 0xA5, 0xE0}, 34}, /* дер */ + {{0xE1, 0xAA, 0xA0}, 34}, /* ска */ + {{0xAE, 0xE0, 0xAC}, 34}, /* орм */ + {{0xE3, 0xAC, 0xA5}, 34}, /* уме */ + {{0xAE, 0xAE, 0xA1}, 34}, /* ооб */ + {{0xE0, 0xA8, 0xE1}, 34}, /* рис */ + {{0xAE, 0xA1, 0xEA}, 33}, /* объ */ + {{0xAE, 0xAB, 0xE3}, 33}, /* олу */ + {{0xEA, 0xEF, 0xA2}, 33}, /* ъяв */ + {{0xE0, 0xA5, 0xAC}, 33}, /* рем */ + {{0xE9, 0xA8, 0xE5}, 33}, /* щих */ + {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ + {{0xAA, 0xA6, 0xA5}, 33}, /* кже */ + {{0xA8, 0xA4, 0xA5}, 33}, /* иде */ + {{0xA1, 0xE1, 0xE2}, 33}, /* бст */ + {{0xA0, 0xAA, 0xA6}, 33}, /* акж */ + {{0xA2, 0xE3, 0xEE}, 33}, /* вую */ + {{0xA0, 0xE1, 0xE5}, 33}, /* асх */ + {{0xA0, 0xAD, 0xA0}, 32}, /* ана */ + {{0xAD, 0xA0, 0xA4}, 32}, /* над */ + {{0xAE, 0xA1, 0xA5}, 32}, /* обе */ + {{0xEB, 0xE2, 0xAA}, 32}, /* ытк */ + {{0xED, 0xE2, 0xA8}, 32}, /* эти */ + {{0xAE, 0xA6, 0xAD}, 32}, /* ожн */ + {{0xA0, 0xE2, 0xEB}, 31}, /* аты */ + {{0xE1, 0xA4, 0xA5}, 31}, /* сде */ + {{0xA0, 0xEE, 0xE2}, 31}, /* ают */ + {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ + {{0xAE, 0xEF, 0xE2}, 31}, /* оят */ + {{0xA5, 0xE2, 0xEC}, 31}, /* еть */ + {{0xA0, 0xA3, 0xA5}, 31}, /* аге */ + {{0xE7, 0xE0, 0xA5}, 31}, /* чре */ + {{0xA5, 0xAD, 0xEB}, 31}, /* ены */ + {{0xE3, 0xA1, 0xEB}, 31}, /* убы */ + {{0xA8, 0xE1, 0xE2}, 30}, /* ист */ + {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ + {{0xE0, 0xEF, 0xA4}, 30}, /* ряд */ + {{0xA3, 0xAE, 0xE1}, 30}, /* гос */ + {{0xA8, 0xAC, 0xA0}, 30}, /* има */ + {{0xA7, 0xA0, 0xE1}, 30}, /* зас */ + {{0xA0, 0xEE, 0xE9}, 30}, /* ающ */ + {{0xAE, 0xA7, 0xA2}, 30}, /* озв */ + {{0xA5, 0xA4, 0xA8}, 30}, /* еди */ + {{0xAE, 0xAC, 0xA5}, 30}, /* оме */ + {{0xAD, 0xA8, 0xA9}, 30}, /* ний */ + {{0xE1, 0xE3, 0xA4}, 30}, /* суд */ + {{0xA7, 0xA4, 0xAE}, 29}, /* здо */ + {{0xE1, 0xA2, 0xA8}, 29}, /* сви */ + {{0xAE, 0xAB, 0xA8}, 29}, /* оли */ + {{0xAE, 0xA2, 0xEC}, 29}, /* овь */ + {{0xA2, 0xA8, 0xA9}, 29}, /* вий */ + {{0xA4, 0xAE, 0xE0}, 29}, /* дор */ + {{0xA4, 0xA5, 0xEF}, 29}, /* дея */ + {{0xA5, 0xEF, 0xE2}, 29}, /* еят */ + {{0xE6, 0xAE, 0xAC}, 29}, /* цом */ + {{0xA8, 0xA7, 0xA0}, 28}, /* иза */ + {{0xE1, 0xE7, 0xA5}, 28}, /* сче */ + {{0xAA, 0xE2, 0xA0}, 28}, /* кта */ + {{0xAE, 0xA4, 0xAD}, 28}, /* одн */ + {{0xA1, 0xAB, 0xA0}, 28}, /* бла */ + {{0xAE, 0xA4, 0xAB}, 28}, /* одл */ + {{0xA8, 0xE2, 0xA0}, 28}, /* ита */ + {{0x84, 0xAE, 0xA3}, 28}, /* Дог */ + {{0xAE, 0xE1, 0xAE}, 28}, /* осо */ + {{0xAD, 0xAE, 0xE8}, 28}, /* нош */ + {{0xAA, 0xE3, 0xE0}, 28}, /* кур */ + {{0xA8, 0xAD, 0xA0}, 28}, /* ина */ + {{0xAE, 0xE8, 0xA5}, 28}, /* оше */ + {{0xAD, 0xA0, 0xAB}, 28}, /* нал */ + {{0xAD, 0xA8, 0xA7}, 27}, /* низ */ + {{0xA7, 0xA2, 0xE0}, 27}, /* звр */ + {{0xA2, 0xE0, 0xA0}, 27}, /* вра */ + {{0xAB, 0xA5, 0xE2}, 27}, /* лет */ + {{0xA5, 0xE9, 0xEC}, 27}, /* ещь */ + {{0xE0, 0xA8, 0xA4}, 27}, /* рид */ + {{0xA4, 0xAD, 0xAE}, 27}, /* дно */ + {{0xE0, 0xA8, 0xAE}, 27}, /* рио */ + {{0xAE, 0xA8, 0xAC}, 27}, /* оим */ + {{0xA5, 0xE0, 0xA6}, 27}, /* ерж */ + {{0xE3, 0xA2, 0xA5}, 26}, /* уве */ + {{0xAE, 0xAD, 0xAA}, 26}, /* онк */ + {{0xA5, 0xAB, 0xAA}, 26}, /* елк */ + {{0xAB, 0xA0, 0xA2}, 26}, /* лав */ + {{0xA0, 0xE2, 0xAE}, 26}, /* ато */ + {{0xEF, 0xAC, 0xA8}, 26}, /* ями */ + {{0xAC, 0xAC, 0xEB}, 26}, /* ммы */ + {{0xA5, 0xE1, 0xAF}, 26}, /* есп */ + {{0xAD, 0xAA, 0xE3}, 26}, /* нку */ + {{0xA8, 0xE6, 0xE3}, 25}, /* ицу */ + {{0xA4, 0xE1, 0xAA}, 25}, /* дск */ + {{0xAD, 0xA8, 0xAD}, 25}, /* нин */ + {{0xAF, 0xAB, 0xA5}, 25}, /* пле */ + {{0xE4, 0xAE, 0xE0}, 25}, /* фор */ + {{0xAB, 0xA0, 0xE1}, 25}, /* лас */ + {{0xA4, 0xA8, 0xAC}, 25}, /* дим */ + {{0xA5, 0xE1, 0xEF}, 25}, /* еся */ + {{0xAD, 0xA8, 0xE7}, 25}, /* нич */ + {{0xAE, 0xA2, 0xE0}, 25}, /* овр */ + {{0xA2, 0xE1, 0xAB}, 25}, /* всл */ + {{0xE0, 0xE8, 0xA5}, 25}, /* рше */ + {{0xA5, 0xE9, 0xA0}, 25}, /* еща */ + {{0xA6, 0xAD, 0xEB}, 25}, /* жны */ + {{0xE0, 0xA8, 0xAC}, 25}, /* рим */ + {{0xA7, 0xA0, 0xE6}, 25}, /* зац */ + {{0xA1, 0xE9, 0xA5}, 25}, /* бще */ + {{0xA0, 0xAA, 0xE2}, 25}, /* акт */ + {{0xA0, 0xA4, 0xE1}, 25}, /* адс */ + {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ + {{0xE9, 0xA8, 0xA5}, 25}, /* щие */ + {{0xA6, 0xA8, 0xE2}, 24}, /* жит */ + {{0xA1, 0xE0, 0xA5}, 24}, /* бре */ + {{0xE3, 0xA3, 0xAE}, 24}, /* уго */ + {{0xA8, 0xEF, 0xE5}, 24}, /* иях */ + {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ + {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ + {{0xA2, 0xAE, 0xA2}, 24}, /* вов */ + {{0xAE, 0xE7, 0xAD}, 24}, /* очн */ + {{0xA2, 0xAE, 0xAE}, 24}, /* воо */ + {{0xAE, 0xA4, 0xEB}, 24}, /* оды */ + {{0xAB, 0xAE, 0xA3}, 24}, /* лог */ + {{0xA2, 0xA0, 0xA5}, 24}, /* вае */ + {{0xA0, 0xEF, 0xE5}, 24}, /* аях */ + {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ + {{0xA4, 0xA8, 0xE7}, 24}, /* дич */ + {{0xAA, 0xA8, 0xE5}, 24}, /* ких */ + {{0xE6, 0xA0, 0xAC}, 24}, /* цам */ + {{0xA8, 0xA7, 0xA2}, 24}, /* изв */ + {{0xE2, 0xA8, 0xA2}, 24}, /* тив */ + {{0xA5, 0xAE, 0xA1}, 24}, /* еоб */ + {{0xE1, 0xAE, 0xE1}, 24}, /* сос */ + {{0xE8, 0xA8, 0xAC}, 24}, /* шим */ + {{0xEB, 0xAF, 0xAE}, 24}, /* ыпо */ + {{0xA5, 0xA6, 0xA0}, 24}, /* ежа */ + {{0xE2, 0xAE, 0xA8}, 24}, /* тои */ + {{0xAA, 0xE2, 0xAE}, 24}, /* кто */ + {{0xA5, 0xE7, 0xA0}, 24}, /* еча */ + {{0xA8, 0xA4, 0xA8}, 24}, /* иди */ + {{0xA1, 0xE9, 0xA8}, 23}, /* бщи */ + {{0xE2, 0xEC, 0xA5}, 23}, /* тье */ + {{0xA1, 0xEA, 0xEF}, 23}, /* бъя */ + {{0xAD, 0xA0, 0xE7}, 23}, /* нач */ + {{0xE2, 0xA5, 0xE7}, 23}, /* теч */ + {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ + {{0xA2, 0xA5, 0xE7}, 23}, /* веч */ + {{0xA5, 0xAC, 0xA5}, 23}, /* еме */ + {{0xAE, 0xA1, 0xE5}, 23}, /* обх */ + {{0xA1, 0xE5, 0xAE}, 23}, /* бхо */ + {{0xA4, 0xA0, 0xA5}, 23}, /* дае */ + {{0xE0, 0xA5, 0xA7}, 23}, /* рез */ + {{0xAA, 0xA0, 0xA6}, 22}, /* каж */ + {{0xAE, 0xAA, 0xE3}, 22}, /* оку */ + {{0xA0, 0xAC, 0xA5}, 22}, /* аме */ + {{0xAD, 0xA5, 0xA7}, 22}, /* нез */ + {{0xEB, 0xA2, 0xA0}, 22}, /* ыва */ + {{0xE1, 0xA2, 0xEF}, 22}, /* свя */ + {{0xE0, 0xA0, 0xA4}, 22}, /* рад */ + {{0xA5, 0xA7, 0xA0}, 22}, /* еза */ + {{0xA8, 0xA2, 0xA0}, 22}, /* ива */ + {{0xAA, 0xA0, 0xAC}, 22}, /* кам */ + {{0xAD, 0xA5, 0xAC}, 22}, /* нем */ + {{0xE2, 0xAA, 0xAE}, 22}, /* тко */ + {{0xA7, 0xA2, 0xA5}, 22}, /* зве */ + {{0xA2, 0xEF, 0xA7}, 22}, /* вяз */ + {{0xEF, 0xE2, 0xA8}, 22}, /* яти */ + {{0xAE, 0xE5, 0xE0}, 22}, /* охр */ + {{0xE0, 0xAE, 0xE2}, 22}, /* рот */ + {{0xAE, 0xAB, 0xA5}, 22}, /* оле */ + {{0xA1, 0xE0, 0xA0}, 22}, /* бра */ + {{0xA0, 0xA5, 0xAC}, 22}, /* аем */ + {{0xAB, 0xA0, 0xE8}, 21}, /* лаш */ + {{0xA8, 0xA7, 0xAC}, 21}, /* изм */ + {{0xA3, 0xE3, 0xE2}, 21}, /* гут */ + {{0xAE, 0xA6, 0xA4}, 21}, /* ожд */ + {{0xAA, 0xA0, 0xAA}, 21}, /* как */ + {{0xAA, 0xA0, 0xE7}, 21}, /* кач */ + {{0xAD, 0xA0, 0xAC}, 21}, /* нам */ + {{0xA4, 0xAE, 0xE5}, 21}, /* дох */ + {{0xAE, 0xE5, 0xAE}, 21}, /* охо */ + {{0xEE, 0xE0, 0xA8}, 21}, /* юри */ + {{0xA2, 0xA0, 0xAC}, 21}, /* вам */ + {{0xA7, 0xAC, 0xAE}, 21}, /* змо */ + {{0xA4, 0xAA, 0xA5}, 21}, /* дке */ + {{0xA1, 0xA0, 0xAD}, 21}, /* бан */ + {{0xA5, 0xAB, 0xA8}, 21}, /* ели */ + {{0xE0, 0xA8, 0xA7}, 21}, /* риз */ + {{0xAB, 0xAD, 0xAE}, 21}, /* лно */ + {{0xA2, 0xEB, 0xE8}, 21}, /* выш */ + {{0xA4, 0xE6, 0xA0}, 21}, /* дца */ + {{0xEF, 0xA4, 0xAA}, 21}, /* ядк */ + {{0xAE, 0xE2, 0xE1}, 21}, /* отс */ + {{0xE2, 0xA5, 0xA9}, 21}, /* тей */ + {{0xA0, 0xAD, 0xAA}, 21}, /* анк */ + {{0xAD, 0xA5, 0xA3}, 21}, /* нег */ + {{0xE6, 0xA0, 0xE2}, 21}, /* цат */ + {{0xA5, 0xAC, 0xEB}, 21}, /* емы */ + {{0xA2, 0xAE, 0xA5}, 21}, /* вое */ + {{0xA4, 0xA0, 0xE7}, 21}, /* дач */ + {{0xAE, 0xA3, 0xE3}, 21}, /* огу */ + {{0xAB, 0xA6, 0xA5}, 21}, /* лже */ + {{0xE2, 0xAD, 0xA8}, 21}, /* тни */ + {{0xA7, 0xA0, 0xA2}, 21}, /* зав */ + {{0xA2, 0xA5, 0xE1}, 21}, /* вес */ + {{0xE1, 0xA0, 0xAC}, 20}, /* сам */ + {{0xA0, 0xE0, 0xAD}, 20}, /* арн */ + {{0xE7, 0xAD, 0xEB}, 20}, /* чны */ + {{0xE1, 0xE0, 0xA5}, 20}, /* сре */ + {{0xE2, 0xA8, 0xEF}, 20}, /* тия */ + {{0xA8, 0xE1, 0xAB}, 20}, /* исл */ + {{0x91, 0xE2, 0xE0}, 20}, /* Стр */ + {{0xAD, 0xE2, 0xAE}, 20}, /* нто */ + {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ + {{0xA0, 0xE8, 0xA5}, 20}, /* аше */ + {{0xA5, 0xAB, 0xA0}, 20}, /* ела */ + {{0xE3, 0xA4, 0xAE}, 20}, /* удо */ + {{0xA6, 0xA8, 0xA7}, 19}, /* жиз */ + {{0xAF, 0xA8, 0xE1}, 19}, /* пис */ + {{0xA0, 0xA8, 0xAC}, 19}, /* аим */ + {{0xE7, 0xA8, 0xE1}, 19}, /* чис */ + {{0xA5, 0xA6, 0xA8}, 19}, /* ежи */ + {{0xA2, 0xE1, 0xA5}, 19}, /* все */ + {{0xAB, 0xEC, 0xAA}, 19}, /* льк */ + {{0xA0, 0xE2, 0xE3}, 19}, /* ату */ + {{0xE3, 0xA4, 0xA0}, 19}, /* уда */ + {{0xE8, 0xA8, 0xA9}, 19}, /* ший */ + {{0xA7, 0xA0, 0xE0}, 19}, /* зар */ + {{0xA5, 0xA4, 0xAD}, 19}, /* едн */ + {{0xA0, 0xA2, 0xE8}, 19}, /* авш */ + {{0xE0, 0xAE, 0xA8}, 19}, /* рои */ + {{0xA8, 0xA4, 0xA0}, 19}, /* ида */ + {{0xA0, 0xE0, 0xAE}, 19}, /* аро */ + {{0xE2, 0xAE, 0xA9}, 19}, /* той */ + {{0xA6, 0xA0, 0xE9}, 19}, /* жащ */ + {{0xA5, 0xE1, 0xAE}, 19}, /* есо */ + {{0xAF, 0xA0, 0xAB}, 19}, /* пал */ + {{0xE9, 0xA0, 0xA5}, 19}, /* щае */ + {{0xE0, 0xEB, 0xA5}, 19}, /* рые */ + {{0xA5, 0xAD, 0xEF}, 19}, /* еня */ + {{0xE9, 0xA8, 0xA9}, 19}, /* щий */ + {{0xAB, 0xE3, 0xA3}, 19}, /* луг */ + {{0xEE, 0xE7, 0xA8}, 18}, /* ючи */ + {{0xE3, 0xAB, 0xEC}, 18}, /* уль */ + {{0xAC, 0xEB, 0xE5}, 18}, /* мых */ + {{0xE0, 0xAE, 0xA3}, 18}, /* рог */ + {{0xE1, 0xAE, 0xE5}, 18}, /* сох */ + {{0xAA, 0xAE, 0xA5}, 18}, /* кое */ + {{0xAD, 0xE2, 0xE1}, 18}, /* нтс */ + {{0xA0, 0xA7, 0xAD}, 18}, /* азн */ + {{0xE2, 0xAD, 0xEB}, 18}, /* тны */ + {{0xAE, 0xA4, 0xEF}, 18}, /* одя */ + {{0xAE, 0xA1, 0xAD}, 18}, /* обн */ + {{0xA2, 0xEB, 0xA4}, 18}, /* выд */ + {{0xAE, 0xE1, 0xEF}, 18}, /* ося */ + {{0xEC, 0xE2, 0xA0}, 18}, /* ьта */ + {{0xAD, 0xEF, 0xEE}, 18}, /* няю */ + {{0xAD, 0xA0, 0xE0}, 18}, /* нар */ + {{0xA5, 0xA7, 0xE3}, 18}, /* езу */ + {{0xA0, 0xE1, 0xAD}, 18}, /* асн */ + {{0xA7, 0xE3, 0xAB}, 18}, /* зул */ + {{0xE6, 0xA8, 0xAF}, 18}, /* цип */ + {{0xAA, 0xE2, 0xA5}, 18}, /* кте */ + {{0xA4, 0xAE, 0xAF}, 18}, /* доп */ + {{0xAD, 0xE6, 0xA8}, 18}, /* нци */ + {{0xE1, 0xAF, 0xA5}, 18}, /* спе */ + {{0xA8, 0xAC, 0xEB}, 18}, /* имы */ + {{0xAC, 0xAE, 0xAC}, 18}, /* мом */ + {{0xAF, 0xA5, 0xE7}, 18}, /* печ */ + {{0x8E, 0xA1, 0xEF}, 18}, /* Обя */ + {{0x8F, 0xE0, 0xA0}, 18}, /* Пра */ + {{0xAE, 0xAB, 0xAE}, 18}, /* оло */ + {{0xE2, 0xE1, 0xAA}, 18}, /* тск */ + {{0xAB, 0xAD, 0xA8}, 18}, /* лни */ + {{0xA5, 0xE0, 0xE2}, 18}, /* ерт */ + {{0xA8, 0xE1, 0xEC}, 18}, /* ись */ + {{0xAB, 0xEC, 0xE2}, 18}, /* льт */ + {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ + {{0xA2, 0xAE, 0xA1}, 17}, /* воб */ + {{0xE0, 0xAD, 0xEB}, 17}, /* рны */ + {{0xA1, 0xAD, 0xEB}, 17}, /* бны */ + {{0xEB, 0xA4, 0xA0}, 17}, /* ыда */ + {{0xEC, 0xA7, 0xE3}, 17}, /* ьзу */ + {{0xA5, 0xA4, 0xAF}, 17}, /* едп */ + {{0xA0, 0xA4, 0xA5}, 17}, /* аде */ + {{0xA8, 0xAF, 0xA0}, 17}, /* ипа */ + {{0xE1, 0xA5, 0xA9}, 17}, /* сей */ + {{0xA5, 0xA5, 0xE1}, 17}, /* еес */ + {{0xAE, 0xA8, 0xA7}, 17}, /* оиз */ + {{0xAE, 0xE1, 0xA2}, 17}, /* осв */ + {{0xA4, 0xA8, 0xA2}, 17}, /* див */ + {{0xAD, 0xA0, 0xAD}, 17}, /* нан */ + {{0xA5, 0xE2, 0xA0}, 17}, /* ета */ + {{0xA4, 0xAD, 0xA5}, 17}, /* дне */ + {{0xA8, 0xAE, 0xA1}, 17}, /* иоб */ + {{0xE3, 0xA5, 0xE2}, 17}, /* ует */ + {{0xAD, 0xA0, 0xE5}, 17}, /* нах */ + {{0xE1, 0xAC, 0xA5}, 17}, /* сме */ + {{0xA0, 0xAB, 0xA8}, 17}, /* али */ + {{0xA1, 0xEA, 0xA5}, 17}, /* бъе */ + {{0xAF, 0xA0, 0xE1}, 17}, /* пас */ + {{0xA7, 0xA0, 0xAB}, 17}, /* зал */ + {{0xE0, 0xA6, 0xA0}, 16}, /* ржа */ + {{0xEF, 0xA2, 0xA8}, 16}, /* яви */ + {{0xA6, 0xA0, 0xE2}, 16}, /* жат */ + {{0xA1, 0xAE, 0xA6}, 16}, /* бож */ + {{0xE1, 0xA8, 0xAB}, 16}, /* сил */ + {{0xAD, 0xE3, 0xEE}, 16}, /* ную */ + {{0xAF, 0xA5, 0xAD}, 16}, /* пен */ + {{0xAC, 0xA0, 0xE2}, 16}, /* мат */ + {{0xAE, 0xAD, 0xAD}, 16}, /* онн */ + {{0xA2, 0xA8, 0xAD}, 16}, /* вин */ + {{0xE2, 0xAA, 0xA8}, 16}, /* тки */ + {{0xE2, 0xAE, 0xE7}, 16}, /* точ */ + {{0xE1, 0xE7, 0xA8}, 16}, /* счи */ + {{0xAD, 0xA8, 0xE6}, 16}, /* ниц */ + {{0xE9, 0xA5, 0xA5}, 16}, /* щее */ + {{0xA1, 0xA5, 0xE1}, 16}, /* бес */ + {{0xA0, 0xA4, 0xE6}, 16}, /* адц */ + {{0x8A, 0xAE, 0xAC}, 16}, /* Ком */ + {{0xEC, 0xA8, 0xAC}, 16}, /* ьим */ + {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ + {{0xA0, 0xE7, 0xA8}, 16}, /* ачи */ + {{0xAF, 0xAE, 0xAD}, 16}, /* пон */ + {{0xAA, 0xA0, 0xA5}, 16}, /* кае */ + {{0xA8, 0xA3, 0xE0}, 16}, /* игр */ + {{0xA0, 0xAA, 0xA8}, 16}, /* аки */ + {{0xA0, 0xE9, 0xA8}, 16}, /* ащи */ + {{0xAB, 0xEC, 0xE6}, 16}, /* льц */ + {{0xA2, 0xAD, 0xAE}, 16}, /* вно */ + {{0xEB, 0xE8, 0xA5}, 15}, /* ыше */ + {{0x8B, 0xA8, 0xE6}, 15}, /* Лиц */ + {{0xEC, 0xA5, 0xA9}, 15}, /* ьей */ + {{0xE8, 0xA5, 0xAC}, 15}, /* шем */ + {{0xE3, 0xA1, 0xAB}, 15}, /* убл */ + {{0xE0, 0xA0, 0xE6}, 15}, /* рац */ + {{0xAA, 0xE3, 0xAC}, 15}, /* кум */ + {{0xE0, 0xA5, 0xA3}, 15}, /* рег */ + {{0xAE, 0xAF, 0xA0}, 15}, /* опа */ + {{0x82, 0xAE, 0xA7}, 15}, /* Воз */ + {{0xE2, 0xA0, 0xA5}, 15}, /* тае */ + {{0xAE, 0xA1, 0xEB}, 15}, /* обы */ + {{0xA1, 0xAB, 0xA8}, 15}, /* бли */ + {{0xE0, 0xAC, 0xA5}, 15}, /* рме */ + {{0xA2, 0xAE, 0xE1}, 15}, /* вос */ + {{0xA0, 0xE1, 0xA8}, 15}, /* аси */ + {{0xE2, 0xA0, 0xAC}, 15}, /* там */ + {{0xEC, 0xAC, 0xA5}, 15}, /* ьме */ + {{0xAE, 0xA3, 0xA0}, 15}, /* ога */ + {{0xA8, 0xAB, 0xAE}, 15}, /* ило */ + {{0xE1, 0xEC, 0xAC}, 15}, /* сьм */ + {{0xE0, 0xE2, 0xA8}, 15}, /* рти */ + {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ + {{0xE1, 0xA5, 0xAD}, 15}, /* сен */ + {{0xE2, 0xA0, 0xAB}, 15}, /* тал */ + {{0xA4, 0xA0, 0xE0}, 15}, /* дар */ + {{0xA0, 0xAC, 0xAE}, 15}, /* амо */ + {{0xA5, 0xA4, 0xAB}, 15}, /* едл */ + {{0xE1, 0xE3, 0xA1}, 15}, /* суб */ + {{0xA5, 0xA9, 0xE4}, 15}, /* ейф */ + {{0x95, 0xE0, 0xA0}, 15}, /* Хра */ + {{0xAB, 0xA0, 0xAC}, 14}, /* лам */ + {{0xA0, 0xE0, 0xE3}, 14}, /* ару */ + {{0xA3, 0xA8, 0xE5}, 14}, /* гих */ + {{0xE6, 0xA8, 0xEF}, 14}, /* ция */ + {{0xA4, 0xA0, 0xA2}, 14}, /* дав */ + {{0xAB, 0xA8, 0xE8}, 14}, /* лиш */ + {{0xEE, 0xE7, 0xA0}, 14}, /* юча */ + {{0xA0, 0xAD, 0xE1}, 14}, /* анс */ + {{0xAE, 0xA3, 0xE0}, 14}, /* огр */ + {{0xA8, 0xE9, 0xA0}, 14}, /* ища */ + {{0xA5, 0xAD, 0xEC}, 14}, /* ень */ + {{0xAE, 0xE2, 0xA8}, 14}, /* оти */ + {{0xA0, 0xA4, 0xEB}, 13}, /* ады */ + {{0xA0, 0xE9, 0xA0}, 13}, /* аща */ + {{0xA2, 0xAE, 0xA8}, 13}, /* вои */ + {{0xA2, 0xEB, 0xAC}, 13}, /* вым */ + {{0xA2, 0xEC, 0xEF}, 13}, /* вья */ + {{0xAA, 0xA8, 0xA5}, 13}, /* кие */ + {{0xAB, 0xA8, 0xE1}, 13}, /* лис */ + {{0xAC, 0xA5, 0xA4}, 13}, /* мед */ + {{0xE2, 0xA8, 0xE5}, 13}, /* тих */ + {{0xA5, 0xE2, 0xAE}, 13}, /* ето */ + {{0xA7, 0xAB, 0xAE}, 13}, /* зло */ + {{0xAE, 0xAF, 0xA5}, 13}, /* опе */ + {{0xE1, 0xA8, 0xAC}, 13}, /* сим */ + {{0xEF, 0xA7, 0xA8}, 13}, /* язи */ + {{0xA8, 0xAD, 0xA4}, 13}, /* инд */ + {{0xE7, 0xE3, 0xA6}, 13}, /* чуж */ + {{0xAB, 0xAA, 0xA8}, 13}, /* лки */ + {{0xA4, 0xAF, 0xE0}, 13}, /* дпр */ + {{0xAD, 0xA4, 0xA8}, 13}, /* нди */ + {{0xAE, 0xE2, 0xA0}, 13}, /* ота */ + {{0xAE, 0xE2, 0xEB}, 13}, /* оты */ + {{0xAB, 0xA0, 0xE7}, 13}, /* лач */ + {{0xAA, 0xA8, 0xAC}, 13}, /* ким */ + {{0xA8, 0xE1, 0xA8}, 13}, /* иси */ + {{0xA2, 0xA0, 0xAB}, 13}, /* вал */ + {{0xA5, 0xAC, 0xAE}, 13}, /* емо */ + {{0xAF, 0xE3, 0xA1}, 13}, /* пуб */ + {{0xEF, 0xA5, 0xAC}, 13}, /* яем */ + {{0xA1, 0xAE, 0xAB}, 13}, /* бол */ + {{0xAD, 0xE2, 0xE3}, 13}, /* нту */ + {{0xAD, 0xA5, 0xA9}, 13}, /* ней */ + {{0xAD, 0xA0, 0xEF}, 13}, /* ная */ + {{0xA5, 0xE1, 0xA0}, 13}, /* еса */ + {{0xE0, 0xAD, 0xAE}, 13}, /* рно */ + {{0xE9, 0xA5, 0xAC}, 13}, /* щем */ + {{0xA0, 0xAD, 0xEB}, 13}, /* аны */ + {{0x84, 0xAE, 0xA2}, 13}, /* Дов */ + {{0xE7, 0xA8, 0xA2}, 13}, /* чив */ + {{0xA2, 0xA8, 0xE1}, 13}, /* вис */ + {{0xAE, 0xAF, 0xAE}, 13}, /* опо */ + {{0xA2, 0xEC, 0xEE}, 13}, /* вью */ + {{0xA0, 0xAB, 0xA0}, 13}, /* ала */ + {{0xAB, 0xA5, 0xA9}, 12}, /* лей */ + {{0xA0, 0xE7, 0xA0}, 12}, /* ача */ + {{0xA5, 0xA7, 0xA2}, 12}, /* езв */ + {{0xA2, 0xA0, 0xEF}, 12}, /* вая */ + {{0xA5, 0xAE, 0xE1}, 12}, /* еос */ + {{0xEF, 0xE9, 0xA8}, 12}, /* ящи */ + {{0xA8, 0xA2, 0xA8}, 12}, /* иви */ + {{0xAD, 0xA5, 0xA5}, 12}, /* нее */ + {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ + {{0xE8, 0xA5, 0xA5}, 12}, /* шее */ + {{0xE1, 0xA0, 0xE5}, 12}, /* сах */ + {{0xA8, 0xAD, 0xE6}, 12}, /* инц */ + {{0xAE, 0xAC, 0xAF}, 12}, /* омп */ + {{0xE3, 0xA6, 0xAE}, 12}, /* ужо */ + {{0xE3, 0xA0, 0xAB}, 12}, /* уал */ + {{0xAD, 0xA0, 0xE2}, 12}, /* нат */ + {{0xA8, 0xA4, 0xE3}, 12}, /* иду */ + {{0xA2, 0xAB, 0xA0}, 12}, /* вла */ + {{0xA7, 0xA2, 0xA0}, 12}, /* зва */ + {{0xAB, 0xA5, 0xA5}, 12}, /* лее */ + {{0xE0, 0xA5, 0xE5}, 12}, /* рех */ + {{0xA6, 0xA4, 0xE3}, 12}, /* жду */ + {{0xAC, 0xA0, 0xAB}, 12}, /* мал */ + {{0xA5, 0xAD, 0xE1}, 12}, /* енс */ + {{0xA8, 0xA9, 0xE1}, 12}, /* ийс */ + {{0xAA, 0xAE, 0xAB}, 12}, /* кол */ + {{0xAD, 0xA0, 0xA7}, 12}, /* наз */ + {{0xA4, 0xE3, 0xA0}, 12}, /* дуа */ + {{0xAE, 0xAD, 0xA8}, 12}, /* они */ + {{0xE1, 0xA5, 0xAC}, 12}, /* сем */ + {{0xA3, 0xAE, 0xA4}, 12}, /* год */ + {{0xAC, 0xA5, 0xA6}, 12}, /* меж */ + {{0xAE, 0xA7, 0xAB}, 12}, /* озл */ + {{0xA2, 0xAC, 0xA5}, 12}, /* вме */ + {{0xE3, 0xA4, 0xA5}, 12}, /* уде */ + {{0xEC, 0xAA, 0xAE}, 12}, /* ько */ + {{0xA5, 0xA2, 0xEB}, 12}, /* евы */ + {{0xA7, 0xA0, 0xAC}, 12}, /* зам */ + {{0xE1, 0xAE, 0xA4}, 12}, /* сод */ + {{0xE0, 0xAE, 0xA5}, 11}, /* рое */ + {{0xAE, 0xE2, 0xA4}, 11}, /* отд */ + {{0xE1, 0xA8, 0xEF}, 11}, /* сия */ + {{0xA8, 0xAA, 0xE3}, 11}, /* ику */ + {{0xEB, 0xAB, 0xA8}, 11}, /* ыли */ + {{0xA3, 0xA8, 0xAC}, 11}, /* гим */ + {{0xAD, 0xEC, 0xE8}, 11}, /* ньш */ + {{0xE2, 0xA8, 0xE7}, 11}, /* тич */ + {{0xE0, 0xA0, 0xAB}, 11}, /* рал */ + {{0xE3, 0xE7, 0xA8}, 11}, /* учи */ + {{0xAC, 0xA5, 0xEE}, 11}, /* мею */ + {{0xE2, 0xA5, 0xAA}, 11}, /* тек */ + {{0xAE, 0xA1, 0xE3}, 11}, /* обу */ + {{0xAD, 0xAD, 0xE3}, 11}, /* нну */ + {{0xAD, 0xA5, 0xAF}, 11}, /* неп */ + {{0xA2, 0xA5, 0xAB}, 11}, /* вел */ + {{0xE2, 0xAC, 0xA5}, 11}, /* тме */ + {{0xA1, 0xAE, 0xA3}, 11}, /* бог */ + {{0xAE, 0xE0, 0xA8}, 11}, /* ори */ + {{0xA0, 0xA2, 0xAD}, 11}, /* авн */ + {{0xA4, 0xA5, 0xA5}, 11}, /* дее */ + {{0xA6, 0xAE, 0xAC}, 11}, /* жом */ + {{0x82, 0xE0, 0xA5}, 11}, /* Вре */ + {{0xAC, 0xEB, 0xA5}, 11}, /* мые */ + {{0xEC, 0xE6, 0xA0}, 11}, /* ьца */ + {{0xAE, 0xE6, 0xA5}, 11}, /* оце */ + {{0xA8, 0xE2, 0xEB}, 10}, /* иты */ + {{0xA7, 0xE0, 0xA0}, 10}, /* зра */ + {{0xAE, 0xAD, 0xEB}, 10}, /* оны */ + {{0xE0, 0xA5, 0xE8}, 10}, /* реш */ + {{0xE3, 0xE8, 0xA5}, 10}, /* уше */ + {{0xE0, 0xA5, 0xA2}, 10}, /* рев */ + {{0xAE, 0xAF, 0xE3}, 10}, /* опу */ + {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ + {{0xE2, 0xA0, 0xE7}, 10}, /* тач */ + {{0xA5, 0xE0, 0xAE}, 10}, /* еро */ + {{0xA2, 0xAA, 0xAB}, 10}, /* вкл */ + {{0xA7, 0xEB, 0xA2}, 10}, /* зыв */ + {{0xA0, 0xAF, 0xE0}, 10}, /* апр */ + {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ + {{0x8E, 0xE2, 0xA2}, 10}, /* Отв */ + {{0xE0, 0xE1, 0xA0}, 10}, /* рса */ + {{0xA5, 0xAA, 0xE2}, 10}, /* ект */ + {{0xAB, 0xA5, 0xAA}, 10}, /* лек */ + {{0xA5, 0xA5, 0xE2}, 10}, /* еет */ + {{0xAE, 0xAF, 0xAB}, 10}, /* опл */ + {{0xE2, 0xE7, 0xA5}, 10}, /* тче */ + {{0xA3, 0xAE, 0xAC}, 10}, /* гом */ + {{0xE2, 0xAE, 0xA6}, 10}, /* тож */ + {{0xAB, 0xA5, 0xE7}, 10}, /* леч */ + {{0xA5, 0xE2, 0xEB}, 10}, /* еты */ + {{0xAE, 0xA6, 0xA8}, 10}, /* ожи */ + {{0xAC, 0xAD, 0xAE}, 10}, /* мно */ + {{0xAC, 0xAE, 0xA9}, 10}, /* мой */ + {{0xE6, 0xA5, 0xAB}, 10}, /* цел */ + {{0xE3, 0xAF, 0xA8}, 10}, /* упи */ + {{0xA0, 0xA5, 0xA2}, 10}, /* аев */ + {{0xAF, 0xAE, 0xAC}, 10}, /* пом */ + {{0xA4, 0xEF, 0xE9}, 10}, /* дящ */ + {{0xE2, 0xE0, 0xA8}, 10}, /* три */ + {{0xE8, 0xA8, 0xA5}, 10}, /* шие */ + {{0xA5, 0xAA, 0xA0}, 10}, /* ека */ + {{0xA5, 0xE8, 0xA5}, 10}, /* еше */ + {{0xA7, 0xA0, 0xA8}, 10}, /* заи */ + {{0xA8, 0xE2, 0xAE}, 10}, /* ито */ + {{0xA7, 0xAD, 0xEB}, 10}, /* зны */ + {{0xAE, 0xEF, 0xAD}, 10}, /* оян */ + {{0xA8, 0xA6, 0xA5}, 10}, /* иже */ + {{0xA2, 0xAD, 0xA5}, 10}, /* вне */ + {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ + {{0xA5, 0xAC, 0xEF}, 10}, /* емя */ + {{0xAD, 0xA0, 0xA8}, 10}, /* наи */ + {{0xE2, 0xAE, 0xAB}, 10}, /* тол */ + {{0xAB, 0xA8, 0xE2}, 10}, /* лит */ + {{0xAE, 0xE1, 0xE0}, 10}, /* оср */ + {{0xE2, 0xA4, 0xA5}, 10}, /* тде */ + {{0xA5, 0xAC, 0xA8}, 10}, /* еми */ + {{0xAC, 0xA5, 0xA5}, 10}, /* мее */ + {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ + {{0xAD, 0xA8, 0xA2}, 10}, /* нив */ + {{0xA5, 0xE0, 0xE3}, 10}, /* еру */ + {{0xE7, 0xA5, 0xAC}, 10}, /* чем */ + {{0xA4, 0xAE, 0xA1}, 10}, /* доб */ + {{0xA5, 0xAB, 0xAE}, 10}, /* ело */ + {{0xA8, 0xAB, 0xE3}, 10}, /* илу */ + {{0xA0, 0xA4, 0xAB}, 10}, /* адл */ + {{0xA8, 0xE7, 0xE2}, 10}, /* ичт */ + {{0xAC, 0xAB, 0xA5}, 10}, /* мле */ +}; + +static const myencoding_trigram_t myencoding_detect_trigrams_index_iso_8859_5[] = { + {{0xD5, 0xDD, 0xD8}, 991}, /* ени */ + {{0xDE, 0xD3, 0xDE}, 806}, /* ого */ + {{0xE1, 0xE2, 0xD2}, 659}, /* ств */ + {{0xDD, 0xD8, 0xEF}, 629}, /* ния */ + {{0xDE, 0xD2, 0xD0}, 566}, /* ова */ + {{0xE2, 0xD5, 0xDB}, 555}, /* тел */ + {{0xE0, 0xD5, 0xD4}, 507}, /* ред */ + {{0xD5, 0xDD, 0xDD}, 499}, /* енн */ + {{0xDE, 0xD2, 0xDE}, 443}, /* ово */ + {{0xD0, 0xDD, 0xD8}, 443}, /* ани */ + {{0xE2, 0xE0, 0xD0}, 429}, /* тра */ + {{0xDE, 0xE1, 0xE2}, 428}, /* ост */ + {{0xDD, 0xD8, 0xD5}, 419}, /* ние */ + {{0xDD, 0xDD, 0xDE}, 412}, /* нно */ + {{0xD0, 0xE5, 0xDE}, 396}, /* ахо */ + {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ + {{0xE0, 0xD0, 0xE5}, 386}, /* рах */ + {{0xE5, 0xDE, 0xD2}, 379}, /* хов */ + {{0xD5, 0xDB, 0xEC}, 365}, /* ель */ + {{0xD3, 0xDE, 0xD2}, 360}, /* гов */ + {{0xD2, 0xDE, 0xE0}, 356}, /* вор */ + {{0xD5, 0xE1, 0xE2}, 349}, /* ест */ + {{0xD0, 0xE2, 0xEC}, 345}, /* ать */ + {{0xE0, 0xD0, 0xD2}, 337}, /* рав */ + {{0xDF, 0xE0, 0xD8}, 330}, /* при */ + {{0xDF, 0xE0, 0xD5}, 323}, /* пре */ + {{0xD4, 0xDE, 0xD3}, 318}, /* дог */ + {{0xDD, 0xD5, 0xDD}, 310}, /* нен */ + {{0xDF, 0xE0, 0xD0}, 309}, /* пра */ + {{0xD2, 0xD0, 0xDD}, 304}, /* ван */ + {{0xD8, 0xE2, 0xD5}, 295}, /* ите */ + {{0xE2, 0xD2, 0xD5}, 281}, /* тве */ + {{0xDB, 0xD5, 0xDD}, 266}, /* лен */ + {{0xE1, 0xE2, 0xDE}, 261}, /* сто */ + {{0xE2, 0xD0, 0xE2}, 260}, /* тат */ + {{0xDD, 0xDD, 0xEB}, 260}, /* нны */ + {{0xDB, 0xEC, 0xDD}, 256}, /* льн */ + {{0xD2, 0xDE, 0xD7}, 255}, /* воз */ + {{0xD8, 0xDB, 0xD8}, 254}, /* или */ + {{0xD0, 0xE2, 0xD5}, 252}, /* ате */ + {{0xD5, 0xD3, 0xDE}, 241}, /* его */ + {{0xD5, 0xE2, 0xE1}, 238}, /* етс */ + {{0xDD, 0xDE, 0xE1}, 236}, /* нос */ + {{0xE9, 0xD5, 0xE1}, 235}, /* щес */ + {{0xDF, 0xDE, 0xDB}, 232}, /* пол */ + {{0xE0, 0xD0, 0xDD}, 231}, /* ран */ + {{0xDD, 0xDE, 0xD3}, 230}, /* ног */ + {{0xE1, 0xE2, 0xD0}, 229}, /* ста */ + {{0xE7, 0xD5, 0xDD}, 226}, /* чен */ + {{0xE2, 0xE0, 0xD5}, 224}, /* тре */ + {{0xD7, 0xDC, 0xD5}, 214}, /* зме */ + {{0xE3, 0xE9, 0xD5}, 212}, /* уще */ + {{0xE1, 0xE2, 0xD8}, 210}, /* сти */ + {{0xDA, 0xDE, 0xDC}, 207}, /* ком */ + {{0xDE, 0xE0, 0xDE}, 206}, /* оро */ + {{0xD2, 0xDB, 0xD5}, 195}, /* вле */ + {{0xD7, 0xD0, 0xDD}, 194}, /* зан */ + {{0xD0, 0xE1, 0xE2}, 193}, /* аст */ + {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ + {{0xE5, 0xE0, 0xD0}, 187}, /* хра */ + {{0xD0, 0xDD, 0xDD}, 182}, /* анн */ + {{0xD5, 0xE0, 0xD5}, 182}, /* ере */ + {{0xD2, 0xE0, 0xD5}, 178}, /* вре */ + {{0xDE, 0xD2, 0xD5}, 173}, /* ове */ + {{0xEC, 0xDD, 0xDE}, 173}, /* ьно */ + {{0xD2, 0xD5, 0xE0}, 172}, /* вер */ + {{0xDC, 0xD5, 0xDD}, 170}, /* мен */ + {{0xDB, 0xD8, 0xE6}, 168}, /* лиц */ + {{0xE2, 0xDE, 0xE0}, 167}, /* тор */ + {{0xE0, 0xD5, 0xDD}, 167}, /* рен */ + {{0xE9, 0xD5, 0xDD}, 165}, /* щен */ + {{0xDE, 0xD7, 0xDC}, 164}, /* озм */ + {{0xD5, 0xD4, 0xD0}, 163}, /* еда */ + {{0xE2, 0xD2, 0xD8}, 159}, /* тви */ + {{0xEF, 0xD7, 0xD0}, 159}, /* яза */ + {{0xD1, 0xEF, 0xD7}, 158}, /* бяз */ + {{0xDD, 0xD8, 0xD8}, 153}, /* нии */ + {{0xDD, 0xEB, 0xE5}, 153}, /* ных */ + {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ + {{0xDC, 0xD5, 0xE0}, 153}, /* мер */ + {{0xE1, 0xDB, 0xD8}, 150}, /* сли */ + {{0xE2, 0xDE, 0xD2}, 148}, /* тов */ + {{0xE2, 0xD2, 0xD0}, 147}, /* тва */ + {{0xDE, 0xE0, 0xD0}, 146}, /* ора */ + {{0xDD, 0xDE, 0xDC}, 144}, /* ном */ + {{0xD4, 0xD5, 0xDD}, 144}, /* ден */ + {{0xD0, 0xDD, 0xD5}, 142}, /* ане */ + {{0xDA, 0xDE, 0xDD}, 141}, /* кон */ + {{0xDB, 0xE3, 0xE7}, 141}, /* луч */ + {{0xDC, 0xE3, 0xE9}, 140}, /* мущ */ + {{0xDE, 0xD1, 0xEF}, 140}, /* обя */ + {{0xD2, 0xD0, 0xE2}, 138}, /* ват */ + {{0xD2, 0xD0, 0xE0}, 137}, /* вар */ + {{0xD5, 0xE9, 0xD5}, 137}, /* еще */ + {{0xDE, 0xE2, 0xE0}, 137}, /* отр */ + {{0xD4, 0xD5, 0xDB}, 137}, /* дел */ + {{0xDD, 0xEB, 0xDC}, 136}, /* ным */ + {{0xD8, 0xDC, 0xE3}, 136}, /* иму */ + {{0xC1, 0xE2, 0xD0}, 134}, /* Ста */ + {{0xE3, 0xE7, 0xD0}, 133}, /* уча */ + {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ + {{0xD5, 0xDB, 0xEF}, 130}, /* еля */ + {{0xE1, 0xDB, 0xE3}, 130}, /* слу */ + {{0xD7, 0xD0, 0xDA}, 130}, /* зак */ + {{0xE2, 0xDE, 0xEF}, 129}, /* тоя */ + {{0xDE, 0xDC, 0xD8}, 128}, /* оми */ + {{0xDC, 0xD5, 0xE9}, 128}, /* мещ */ + {{0xD5, 0xD4, 0xE3}, 127}, /* еду */ + {{0xD2, 0xD5, 0xDD}, 127}, /* вен */ + {{0xDD, 0xDE, 0xD2}, 127}, /* нов */ + {{0xDD, 0xDE, 0xD5}, 126}, /* ное */ + {{0xDE, 0xE2, 0xD2}, 125}, /* отв */ + {{0xDA, 0xD0, 0xD7}, 125}, /* каз */ + {{0xD0, 0xD5, 0xE2}, 125}, /* ает */ + {{0xE1, 0xDA, 0xDE}, 125}, /* ско */ + {{0xD5, 0xDD, 0xE2}, 124}, /* ент */ + {{0xDC, 0xDE, 0xE2}, 123}, /* мот */ + {{0xD0, 0xD2, 0xDB}, 122}, /* авл */ + {{0xE1, 0xDC, 0xDE}, 122}, /* смо */ + {{0xD8, 0xE7, 0xD8}, 121}, /* ичи */ + {{0xD1, 0xEB, 0xE2}, 120}, /* быт */ + {{0xE3, 0xE1, 0xDC}, 118}, /* усм */ + {{0xE1, 0xE1, 0xD8}, 117}, /* сси */ + {{0xD4, 0xE3, 0xE1}, 117}, /* дус */ + {{0xE5, 0xDE, 0xD4}, 117}, /* ход */ + {{0xE0, 0xD8, 0xE7}, 117}, /* рич */ + {{0xE7, 0xD5, 0xE1}, 115}, /* чес */ + {{0xD3, 0xE0, 0xD0}, 114}, /* гра */ + {{0xDF, 0xE0, 0xDE}, 114}, /* про */ + {{0xD4, 0xDE, 0xD2}, 113}, /* дов */ + {{0xD2, 0xD5, 0xE2}, 112}, /* вет */ + {{0xD5, 0xD4, 0xD5}, 112}, /* еде */ + {{0xE8, 0xD5, 0xDD}, 111}, /* шен */ + {{0xE7, 0xD8, 0xDD}, 110}, /* чин */ + {{0xDD, 0xD0, 0xE1}, 109}, /* нас */ + {{0xD8, 0xE2, 0xEC}, 105}, /* ить */ + {{0xE2, 0xD2, 0xDE}, 105}, /* тво */ + {{0xDA, 0xDB, 0xEE}, 104}, /* клю */ + {{0xE0, 0xD8, 0xE2}, 104}, /* рит */ + {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ + {{0xDB, 0xEE, 0xE7}, 104}, /* люч */ + {{0xE2, 0xDE, 0xDC}, 104}, /* том */ + {{0xE1, 0xDB, 0xD5}, 103}, /* сле */ + {{0xE1, 0xDF, 0xDE}, 102}, /* спо */ + {{0xDE, 0xDB, 0xDD}, 102}, /* олн */ + {{0xD5, 0xE1, 0xDB}, 102}, /* есл */ + {{0xD5, 0xE0, 0xD8}, 101}, /* ери */ + {{0xDD, 0xDE, 0xD9}, 101}, /* ной */ + {{0xE0, 0xDE, 0xDC}, 101}, /* ром */ + {{0xDE, 0xE2, 0xDE}, 99}, /* ото */ + {{0xDD, 0xEB, 0xD5}, 99}, /* ные */ + {{0xD7, 0xDD, 0xD0}, 99}, /* зна */ + {{0xD2, 0xDB, 0xEF}, 99}, /* вля */ + {{0xE2, 0xD5, 0xE0}, 98}, /* тер */ + {{0xE3, 0xDF, 0xE0}, 97}, /* упр */ + {{0xD0, 0xDA, 0xDE}, 96}, /* ако */ + {{0xDA, 0xDE, 0xD3}, 96}, /* ког */ + {{0xDD, 0xEB, 0xD9}, 96}, /* ный */ + {{0xDE, 0xE0, 0xE3}, 96}, /* ору */ + {{0xD5, 0xDB, 0xD5}, 95}, /* еле */ + {{0xD5, 0xE1, 0xDA}, 95}, /* еск */ + {{0xD0, 0xD7, 0xD0}, 95}, /* аза */ + {{0xD9, 0xE1, 0xE2}, 93}, /* йст */ + {{0xDF, 0xDE, 0xE0}, 93}, /* пор */ + {{0xDE, 0xD6, 0xD5}, 92}, /* оже */ + {{0xD8, 0xDD, 0xD5}, 91}, /* ине */ + {{0xE9, 0xD5, 0xD9}, 90}, /* щей */ + {{0xD6, 0xD4, 0xD5}, 90}, /* жде */ + {{0xDF, 0xD5, 0xE0}, 89}, /* пер */ + {{0xDD, 0xD8, 0xE2}, 89}, /* нит */ + {{0xDE, 0xDB, 0xEC}, 89}, /* оль */ + {{0xD0, 0xD6, 0xD4}, 88}, /* ажд */ + {{0xD6, 0xD5, 0xDD}, 87}, /* жен */ + {{0xDB, 0xD0, 0xD4}, 87}, /* лад */ + {{0xD0, 0xDC, 0xD8}, 87}, /* ами */ + {{0xDA, 0xDE, 0xE2}, 86}, /* кот */ + {{0xE7, 0xD0, 0xD5}, 85}, /* чае */ + {{0xD2, 0xD5, 0xE9}, 85}, /* вещ */ + {{0xD2, 0xD8, 0xEF}, 85}, /* вия */ + {{0xEF, 0xE9, 0xD5}, 85}, /* яще */ + {{0xD8, 0xD5, 0xDC}, 85}, /* ием */ + {{0xDA, 0xDB, 0xD0}, 85}, /* кла */ + {{0xD5, 0xD9, 0xE1}, 84}, /* ейс */ + {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ + {{0xD0, 0xD2, 0xDE}, 84}, /* аво */ + {{0xE0, 0xD0, 0xD6}, 83}, /* раж */ + {{0xDB, 0xEC, 0xE1}, 83}, /* льс */ + {{0xDE, 0xEF, 0xE9}, 82}, /* оящ */ + {{0xD5, 0xDD, 0xDE}, 81}, /* ено */ + {{0xD4, 0xE1, 0xE2}, 81}, /* дст */ + {{0xD4, 0xD5, 0xD9}, 80}, /* дей */ + {{0xE0, 0xD5, 0xD1}, 80}, /* реб */ + {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ + {{0xD5, 0xD4, 0xE1}, 79}, /* едс */ + {{0xD0, 0xE0, 0xD8}, 79}, /* ари */ + {{0xD4, 0xD0, 0xDD}, 79}, /* дан */ + {{0xDC, 0xDE, 0xD6}, 78}, /* мож */ + {{0xD8, 0xDC, 0xD5}, 78}, /* име */ + {{0xD8, 0xDD, 0xDE}, 78}, /* ино */ + {{0xE0, 0xD8, 0xDD}, 77}, /* рин */ + {{0xD4, 0xDE, 0xE1}, 77}, /* дос */ + {{0xDF, 0xDE, 0xE1}, 77}, /* пос */ + {{0xE2, 0xD0, 0xDA}, 77}, /* так */ + {{0xE9, 0xD5, 0xD3}, 77}, /* щег */ + {{0xD4, 0xD0, 0xE2}, 77}, /* дат */ + {{0xDF, 0xDB, 0xD0}, 76}, /* пла */ + {{0xE3, 0xE1, 0xDB}, 76}, /* усл */ + {{0xD8, 0xE6, 0xD0}, 76}, /* ица */ + {{0xE0, 0xDE, 0xD2}, 75}, /* ров */ + {{0xED, 0xE2, 0xDE}, 75}, /* это */ + {{0xE3, 0xE7, 0xD5}, 74}, /* уче */ + {{0xD4, 0xDE, 0xDB}, 73}, /* дол */ + {{0xEC, 0xDD, 0xEB}, 73}, /* ьны */ + {{0xE0, 0xD0, 0xD7}, 73}, /* раз */ + {{0xDC, 0xD8, 0xE1}, 73}, /* мис */ + {{0xD0, 0xDD, 0xDE}, 72}, /* ано */ + {{0xE1, 0xE0, 0xDE}, 72}, /* сро */ + {{0xD0, 0xD2, 0xD8}, 72}, /* ави */ + {{0xE2, 0xEC, 0xD8}, 71}, /* тьи */ + {{0xEE, 0xE7, 0xD5}, 70}, /* юче */ + {{0xE1, 0xDA, 0xDB}, 70}, /* скл */ + {{0xD8, 0xE1, 0xE1}, 70}, /* исс */ + {{0xD6, 0xD5, 0xE2}, 69}, /* жет */ + {{0xD5, 0xD4, 0xDE}, 69}, /* едо */ + {{0xDB, 0xD5, 0xD4}, 69}, /* лед */ + {{0xDB, 0xDE, 0xD2}, 69}, /* лов */ + {{0xEE, 0xE9, 0xD8}, 68}, /* ющи */ + {{0xD8, 0xD1, 0xDE}, 68}, /* ибо */ + {{0xDB, 0xD0, 0xE2}, 67}, /* лат */ + {{0xE0, 0xDE, 0xDA}, 67}, /* рок */ + {{0xD0, 0xDA, 0xDB}, 67}, /* акл */ + {{0xE0, 0xD8, 0xE9}, 67}, /* рищ */ + {{0xD1, 0xDE, 0xD2}, 67}, /* бов */ + {{0xD8, 0xE1, 0xDA}, 67}, /* иск */ + {{0xD5, 0xD1, 0xDE}, 67}, /* ебо */ + {{0xDB, 0xEC, 0xD7}, 67}, /* льз */ + {{0xE3, 0xDA, 0xD0}, 67}, /* ука */ + {{0xDB, 0xD8, 0xD1}, 66}, /* либ */ + {{0xDE, 0xDC, 0xE3}, 66}, /* ому */ + {{0xDE, 0xD2, 0xDB}, 66}, /* овл */ + {{0xE2, 0xDD, 0xDE}, 65}, /* тно */ + {{0xD2, 0xDE, 0xD9}, 64}, /* вой */ + {{0xE2, 0xDE, 0xD3}, 64}, /* тог */ + {{0xE1, 0xDB, 0xDE}, 64}, /* сло */ + {{0xDE, 0xD7, 0xDD}, 64}, /* озн */ + {{0xE1, 0xDE, 0xDE}, 64}, /* соо */ + {{0xD7, 0xD0, 0xE2}, 63}, /* зат */ + {{0xD8, 0xE1, 0xDF}, 63}, /* исп */ + {{0xD0, 0xE7, 0xD5}, 63}, /* аче */ + {{0xDD, 0xD8, 0xEE}, 63}, /* нию */ + {{0xDE, 0xDD, 0xD5}, 63}, /* оне */ + {{0xDE, 0xDB, 0xD6}, 62}, /* олж */ + {{0xDE, 0xD2, 0xE9}, 61}, /* овщ */ + {{0xE0, 0xD0, 0xE1}, 61}, /* рас */ + {{0xD2, 0xD8, 0xD4}, 61}, /* вид */ + {{0xD2, 0xE9, 0xD8}, 61}, /* вщи */ + {{0xE1, 0xDD, 0xDE}, 61}, /* сно */ + {{0xD8, 0xE6, 0xDE}, 61}, /* ицо */ + {{0xD8, 0xE7, 0xD5}, 61}, /* иче */ + {{0xD0, 0xD2, 0xD5}, 61}, /* аве */ + {{0xD3, 0xDB, 0xD0}, 61}, /* гла */ + {{0xE7, 0xD5, 0xE2}, 61}, /* чет */ + {{0xE9, 0xD8, 0xDA}, 61}, /* щик */ + {{0xE0, 0xE3, 0xD3}, 60}, /* руг */ + {{0xE2, 0xD0, 0xDD}, 60}, /* тан */ + {{0xD8, 0xDC, 0xDE}, 60}, /* имо */ + {{0xD0, 0xDB, 0xEC}, 60}, /* аль */ + {{0xDE, 0xD2, 0xD8}, 60}, /* ови */ + {{0xD6, 0xD4, 0xD0}, 60}, /* жда */ + {{0xDF, 0xDE, 0xD2}, 60}, /* пов */ + {{0xD5, 0xDC, 0xE3}, 60}, /* ему */ + {{0xEF, 0xE2, 0xD5}, 60}, /* яте */ + {{0xE1, 0xD8, 0xD8}, 59}, /* сии */ + {{0xD1, 0xDE, 0xE2}, 59}, /* бот */ + {{0xD2, 0xEB, 0xDF}, 59}, /* вып */ + {{0xD0, 0xD1, 0xDE}, 59}, /* або */ + {{0xDB, 0xEF, 0xEE}, 59}, /* ляю */ + {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ + {{0xDE, 0xD4, 0xD5}, 58}, /* оде */ + {{0xD8, 0xDD, 0xD8}, 58}, /* ини */ + {{0xE0, 0xD0, 0xE2}, 58}, /* рат */ + {{0xEF, 0xD2, 0xDB}, 58}, /* явл */ + {{0xDD, 0xD0, 0xD3}, 57}, /* наг */ + {{0xD4, 0xE0, 0xE3}, 57}, /* дру */ + {{0xE0, 0xD0, 0xD1}, 57}, /* раб */ + {{0xD0, 0xD3, 0xE0}, 57}, /* агр */ + {{0xD8, 0xDE, 0xDD}, 57}, /* ион */ + {{0xDC, 0xD5, 0xE1}, 57}, /* мес */ + {{0xD0, 0xE6, 0xD8}, 56}, /* аци */ + {{0xDE, 0xE1, 0xE3}, 56}, /* осу */ + {{0xDA, 0xDE, 0xD9}, 55}, /* кой */ + {{0xE1, 0xD2, 0xDE}, 55}, /* сво */ + {{0xD7, 0xDE, 0xD2}, 55}, /* зов */ + {{0xDE, 0xDF, 0xE0}, 54}, /* опр */ + {{0xE1, 0xDE, 0xD1}, 54}, /* соб */ + {{0xD2, 0xDF, 0xE0}, 54}, /* впр */ + {{0xDB, 0xDD, 0xD5}, 54}, /* лне */ + {{0xDE, 0xDC, 0xDC}, 54}, /* омм */ + {{0xD5, 0xE0, 0xD0}, 54}, /* ера */ + {{0xE7, 0xD8, 0xE2}, 54}, /* чит */ + {{0xD5, 0xE0, 0xE7}, 54}, /* ерч */ + {{0xE0, 0xE7, 0xD5}, 54}, /* рче */ + {{0xD0, 0xE2, 0xD8}, 54}, /* ати */ + {{0xDD, 0xD8, 0xDA}, 54}, /* ник */ + {{0xDC, 0xDC, 0xD5}, 54}, /* мме */ + {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ + {{0xE2, 0xD5, 0xDD}, 53}, /* тен */ + {{0xD2, 0xD5, 0xD4}, 53}, /* вед */ + {{0xE1, 0xDE, 0xD2}, 52}, /* сов */ + {{0xD0, 0xD6, 0xD5}, 52}, /* аже */ + {{0xDE, 0xDA, 0xD0}, 52}, /* ока */ + {{0xEB, 0xDC, 0xD8}, 52}, /* ыми */ + {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ + {{0xDE, 0xDE, 0xE2}, 52}, /* оот */ + {{0xDC, 0xD8, 0xE2}, 52}, /* мит */ + {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ + {{0xD2, 0xE8, 0xD5}, 51}, /* вше */ + {{0xE1, 0xD8, 0xDE}, 51}, /* сио */ + {{0xDE, 0xDD, 0xDE}, 51}, /* оно */ + {{0xD0, 0xD2, 0xD0}, 51}, /* ава */ + {{0xD0, 0xE9, 0xD5}, 51}, /* аще */ + {{0xDB, 0xEF, 0xD5}, 50}, /* ляе */ + {{0xD5, 0xDD, 0xD5}, 50}, /* ене */ + {{0xDE, 0xD4, 0xD8}, 50}, /* оди */ + {{0xDF, 0xE3, 0xDD}, 49}, /* пун */ + {{0xDB, 0xD8, 0xE7}, 49}, /* лич */ + {{0xD2, 0xDE, 0xDC}, 49}, /* вом */ + {{0xDD, 0xDA, 0xE2}, 49}, /* нкт */ + {{0xDD, 0xD5, 0xE1}, 49}, /* нес */ + {{0xD2, 0xD8, 0xDB}, 49}, /* вил */ + {{0xD5, 0xD6, 0xD4}, 49}, /* ежд */ + {{0xE0, 0xD5, 0xE1}, 49}, /* рес */ + {{0xEE, 0xE9, 0xD5}, 49}, /* юще */ + {{0xEC, 0xD7, 0xDE}, 49}, /* ьзо */ + {{0xDF, 0xDE, 0xE2}, 49}, /* пот */ + {{0xE3, 0xDD, 0xDA}, 49}, /* унк */ + {{0xE1, 0xE2, 0xD5}, 49}, /* сте */ + {{0xDA, 0xDE, 0xD2}, 49}, /* ков */ + {{0xDE, 0xE1, 0xDB}, 48}, /* осл */ + {{0xEF, 0xD5, 0xE2}, 48}, /* яет */ + {{0xB5, 0xE1, 0xDB}, 48}, /* Есл */ + {{0xBF, 0xE0, 0xD8}, 48}, /* При */ + {{0xE2, 0xD0, 0xD2}, 48}, /* тав */ + {{0xDD, 0xD5, 0xE0}, 48}, /* нер */ + {{0xE7, 0xDD, 0xDE}, 47}, /* чно */ + {{0xDF, 0xDE, 0xD4}, 47}, /* под */ + {{0xDD, 0xE2, 0xD0}, 47}, /* нта */ + {{0xD8, 0xE9, 0xD5}, 47}, /* ище */ + {{0xDE, 0xD1, 0xE9}, 47}, /* общ */ + {{0xD0, 0xD7, 0xDC}, 47}, /* азм */ + {{0xD6, 0xDD, 0xDE}, 47}, /* жно */ + {{0xD2, 0xD8, 0xD8}, 46}, /* вии */ + {{0xE0, 0xD0, 0xE9}, 46}, /* ращ */ + {{0xDE, 0xE0, 0xD5}, 46}, /* оре */ + {{0xD2, 0xE8, 0xD8}, 46}, /* вши */ + {{0xD5, 0xDA, 0xE1}, 46}, /* екс */ + {{0xD2, 0xDE, 0xD3}, 46}, /* вог */ + {{0xE7, 0xE2, 0xDE}, 46}, /* что */ + {{0xD8, 0xE7, 0xDD}, 45}, /* ичн */ + {{0xDB, 0xD5, 0xDC}, 45}, /* лем */ + {{0xDC, 0xDE, 0xD3}, 45}, /* мог */ + {{0xE2, 0xD2, 0xDB}, 45}, /* твл */ + {{0xD4, 0xDB, 0xD5}, 45}, /* дле */ + {{0xD4, 0xDB, 0xEF}, 45}, /* для */ + {{0xE0, 0xD5, 0xE2}, 45}, /* рет */ + {{0xD0, 0xE0, 0xD0}, 45}, /* ара */ + {{0xDD, 0xEF, 0xE2}, 44}, /* нят */ + {{0xD5, 0xE7, 0xD5}, 44}, /* ече */ + {{0xDE, 0xE2, 0xD5}, 44}, /* оте */ + {{0xDE, 0xE0, 0xEB}, 44}, /* оры */ + {{0xDE, 0xE1, 0xDD}, 43}, /* осн */ + {{0xDE, 0xD1, 0xDE}, 43}, /* обо */ + {{0xDE, 0xD3, 0xDB}, 43}, /* огл */ + {{0xD8, 0xDD, 0xEB}, 43}, /* ины */ + {{0xD5, 0xE1, 0xE1}, 43}, /* есс */ + {{0xDE, 0xD1, 0xE0}, 43}, /* обр */ + {{0xDA, 0xE0, 0xD0}, 43}, /* кра */ + {{0xD8, 0xEF, 0xDC}, 43}, /* иям */ + {{0xD0, 0xDB, 0xDE}, 43}, /* ало */ + {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ + {{0xDE, 0xE0, 0xD3}, 43}, /* орг */ + {{0xE7, 0xD0, 0xEF}, 42}, /* чая */ + {{0xDD, 0xD8, 0xDC}, 42}, /* ним */ + {{0xD8, 0xD7, 0xDD}, 42}, /* изн */ + {{0xDF, 0xDE, 0xDA}, 42}, /* пок */ + {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ + {{0xD5, 0xDB, 0xEE}, 42}, /* елю */ + {{0xE2, 0xD8, 0xE2}, 42}, /* тит */ + {{0xE6, 0xD5, 0xDD}, 42}, /* цен */ + {{0xE7, 0xD0, 0xE1}, 42}, /* час */ + {{0xD3, 0xD0, 0xDD}, 42}, /* ган */ + {{0xE0, 0xD3, 0xD0}, 42}, /* рга */ + {{0xE1, 0xE2, 0xDD}, 42}, /* стн */ + {{0xE0, 0xD5, 0xD6}, 42}, /* реж */ + {{0xE3, 0xDC, 0xDC}, 42}, /* умм */ + {{0xE2, 0xD2, 0xE3}, 41}, /* тву */ + {{0xE2, 0xE3, 0xDF}, 41}, /* туп */ + {{0xE1, 0xDA, 0xD8}, 40}, /* ски */ + {{0xD4, 0xD5, 0xDA}, 40}, /* дек */ + {{0xDB, 0xD5, 0xD6}, 40}, /* леж */ + {{0xD5, 0xE1, 0xD5}, 40}, /* есе */ + {{0xD2, 0xD8, 0xD5}, 40}, /* вие */ + {{0xE2, 0xDA, 0xD0}, 40}, /* тка */ + {{0xD5, 0xDA, 0xE0}, 40}, /* екр */ + {{0xDE, 0xD4, 0xDE}, 40}, /* одо */ + {{0xDA, 0xE1, 0xD0}, 40}, /* кса */ + {{0xE0, 0xD5, 0xDA}, 40}, /* рек */ + {{0xDD, 0xE2, 0xD5}, 40}, /* нте */ + {{0xE3, 0xD3, 0xD8}, 40}, /* уги */ + {{0xD1, 0xEB, 0xDB}, 40}, /* был */ + {{0xD8, 0xDD, 0xEF}, 40}, /* иня */ + {{0xD5, 0xE9, 0xD8}, 39}, /* ещи */ + {{0xD3, 0xD5, 0xDD}, 39}, /* ген */ + {{0xBA, 0xDE, 0xD4}, 39}, /* Код */ + {{0xD4, 0xD8, 0xE2}, 39}, /* дит */ + {{0xE1, 0xE5, 0xDE}, 39}, /* схо */ + {{0xD8, 0xDD, 0xE2}, 39}, /* инт */ + {{0xE1, 0xE3, 0xDC}, 39}, /* сум */ + {{0xE0, 0xDE, 0xDD}, 39}, /* рон */ + {{0xDE, 0xE2, 0xDA}, 39}, /* отк */ + {{0xD4, 0xDE, 0xDA}, 39}, /* док */ + {{0xD8, 0xDB, 0xD0}, 38}, /* ила */ + {{0xE6, 0xD5, 0xE1}, 38}, /* цес */ + {{0xD8, 0xDA, 0xD0}, 38}, /* ика */ + {{0xD7, 0xDD, 0xD8}, 38}, /* зни */ + {{0xDE, 0xD2, 0xEB}, 38}, /* овы */ + {{0xDB, 0xD6, 0xDD}, 38}, /* лжн */ + {{0xE3, 0xDF, 0xDB}, 38}, /* упл */ + {{0xD3, 0xD4, 0xD0}, 37}, /* гда */ + {{0xDB, 0xD0, 0xD6}, 37}, /* лаж */ + {{0xD6, 0xD5, 0xD4}, 37}, /* жед */ + {{0xD1, 0xD5, 0xD7}, 37}, /* без */ + {{0xD4, 0xD5, 0xE2}, 37}, /* дет */ + {{0xDE, 0xE0, 0xEF}, 37}, /* оря */ + {{0xE0, 0xDE, 0xE1}, 37}, /* рос */ + {{0xDE, 0xD1, 0xDB}, 37}, /* обл */ + {{0xE6, 0xD8, 0xD8}, 37}, /* ции */ + {{0xD4, 0xDE, 0xDC}, 37}, /* дом */ + {{0xDD, 0xE6, 0xD5}, 37}, /* нце */ + {{0xE8, 0xD5, 0xD3}, 37}, /* шег */ + {{0xDB, 0xDE, 0xD6}, 37}, /* лож */ + {{0xDE, 0xDD, 0xD0}, 37}, /* она */ + {{0xDE, 0xDA, 0xDB}, 37}, /* окл */ + {{0xDE, 0xD3, 0xD4}, 37}, /* огд */ + {{0xE0, 0xDE, 0xD4}, 37}, /* род */ + {{0xD5, 0xDD, 0xD0}, 37}, /* ена */ + {{0xDE, 0xDD, 0xE6}, 37}, /* онц */ + {{0xDE, 0xE2, 0xDD}, 37}, /* отн */ + {{0xE1, 0xDE, 0xD3}, 37}, /* сог */ + {{0xD5, 0xD2, 0xE8}, 37}, /* евш */ + {{0xD2, 0xD8, 0xE2}, 36}, /* вит */ + {{0xD5, 0xE0, 0xDF}, 36}, /* ерп */ + {{0xDE, 0xD4, 0xD0}, 36}, /* ода */ + {{0xD5, 0xE2, 0xD5}, 36}, /* ете */ + {{0xDD, 0xD5, 0xDE}, 36}, /* нео */ + {{0xE0, 0xDF, 0xD5}, 36}, /* рпе */ + {{0xD5, 0xE0, 0xE8}, 36}, /* ерш */ + {{0xD8, 0xDC, 0xD8}, 36}, /* ими */ + {{0xD8, 0xD2, 0xE8}, 36}, /* ивш */ + {{0xEB, 0xDF, 0xDB}, 36}, /* ыпл */ + {{0xDF, 0xD5, 0xD2}, 36}, /* пев */ + {{0xD0, 0xD4, 0xD0}, 36}, /* ада */ + {{0xDC, 0xDE, 0xE1}, 35}, /* мос */ + {{0xDE, 0xD1, 0xE1}, 35}, /* обс */ + {{0xDD, 0xD5, 0xD4}, 34}, /* нед */ + {{0xD8, 0xDA, 0xDE}, 34}, /* ико */ + {{0xE9, 0xD8, 0xDC}, 34}, /* щим */ + {{0xD4, 0xD5, 0xE0}, 34}, /* дер */ + {{0xE1, 0xDA, 0xD0}, 34}, /* ска */ + {{0xDE, 0xE0, 0xDC}, 34}, /* орм */ + {{0xE3, 0xDC, 0xD5}, 34}, /* уме */ + {{0xDE, 0xDE, 0xD1}, 34}, /* ооб */ + {{0xE0, 0xD8, 0xE1}, 34}, /* рис */ + {{0xDE, 0xD1, 0xEA}, 33}, /* объ */ + {{0xDE, 0xDB, 0xE3}, 33}, /* олу */ + {{0xEA, 0xEF, 0xD2}, 33}, /* ъяв */ + {{0xE0, 0xD5, 0xDC}, 33}, /* рем */ + {{0xE9, 0xD8, 0xE5}, 33}, /* щих */ + {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ + {{0xDA, 0xD6, 0xD5}, 33}, /* кже */ + {{0xD8, 0xD4, 0xD5}, 33}, /* иде */ + {{0xD1, 0xE1, 0xE2}, 33}, /* бст */ + {{0xD0, 0xDA, 0xD6}, 33}, /* акж */ + {{0xD2, 0xE3, 0xEE}, 33}, /* вую */ + {{0xD0, 0xE1, 0xE5}, 33}, /* асх */ + {{0xD0, 0xDD, 0xD0}, 32}, /* ана */ + {{0xDD, 0xD0, 0xD4}, 32}, /* над */ + {{0xDE, 0xD1, 0xD5}, 32}, /* обе */ + {{0xEB, 0xE2, 0xDA}, 32}, /* ытк */ + {{0xED, 0xE2, 0xD8}, 32}, /* эти */ + {{0xDE, 0xD6, 0xDD}, 32}, /* ожн */ + {{0xD0, 0xE2, 0xEB}, 31}, /* аты */ + {{0xE1, 0xD4, 0xD5}, 31}, /* сде */ + {{0xD0, 0xEE, 0xE2}, 31}, /* ают */ + {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ + {{0xDE, 0xEF, 0xE2}, 31}, /* оят */ + {{0xD5, 0xE2, 0xEC}, 31}, /* еть */ + {{0xD0, 0xD3, 0xD5}, 31}, /* аге */ + {{0xE7, 0xE0, 0xD5}, 31}, /* чре */ + {{0xD5, 0xDD, 0xEB}, 31}, /* ены */ + {{0xE3, 0xD1, 0xEB}, 31}, /* убы */ + {{0xD8, 0xE1, 0xE2}, 30}, /* ист */ + {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ + {{0xE0, 0xEF, 0xD4}, 30}, /* ряд */ + {{0xD3, 0xDE, 0xE1}, 30}, /* гос */ + {{0xD8, 0xDC, 0xD0}, 30}, /* има */ + {{0xD7, 0xD0, 0xE1}, 30}, /* зас */ + {{0xD0, 0xEE, 0xE9}, 30}, /* ающ */ + {{0xDE, 0xD7, 0xD2}, 30}, /* озв */ + {{0xD5, 0xD4, 0xD8}, 30}, /* еди */ + {{0xDE, 0xDC, 0xD5}, 30}, /* оме */ + {{0xDD, 0xD8, 0xD9}, 30}, /* ний */ + {{0xE1, 0xE3, 0xD4}, 30}, /* суд */ + {{0xD7, 0xD4, 0xDE}, 29}, /* здо */ + {{0xE1, 0xD2, 0xD8}, 29}, /* сви */ + {{0xDE, 0xDB, 0xD8}, 29}, /* оли */ + {{0xDE, 0xD2, 0xEC}, 29}, /* овь */ + {{0xD2, 0xD8, 0xD9}, 29}, /* вий */ + {{0xD4, 0xDE, 0xE0}, 29}, /* дор */ + {{0xD4, 0xD5, 0xEF}, 29}, /* дея */ + {{0xD5, 0xEF, 0xE2}, 29}, /* еят */ + {{0xE6, 0xDE, 0xDC}, 29}, /* цом */ + {{0xD8, 0xD7, 0xD0}, 28}, /* иза */ + {{0xE1, 0xE7, 0xD5}, 28}, /* сче */ + {{0xDA, 0xE2, 0xD0}, 28}, /* кта */ + {{0xDE, 0xD4, 0xDD}, 28}, /* одн */ + {{0xD1, 0xDB, 0xD0}, 28}, /* бла */ + {{0xDE, 0xD4, 0xDB}, 28}, /* одл */ + {{0xD8, 0xE2, 0xD0}, 28}, /* ита */ + {{0xB4, 0xDE, 0xD3}, 28}, /* Дог */ + {{0xDE, 0xE1, 0xDE}, 28}, /* осо */ + {{0xDD, 0xDE, 0xE8}, 28}, /* нош */ + {{0xDA, 0xE3, 0xE0}, 28}, /* кур */ + {{0xD8, 0xDD, 0xD0}, 28}, /* ина */ + {{0xDE, 0xE8, 0xD5}, 28}, /* оше */ + {{0xDD, 0xD0, 0xDB}, 28}, /* нал */ + {{0xDD, 0xD8, 0xD7}, 27}, /* низ */ + {{0xD7, 0xD2, 0xE0}, 27}, /* звр */ + {{0xD2, 0xE0, 0xD0}, 27}, /* вра */ + {{0xDB, 0xD5, 0xE2}, 27}, /* лет */ + {{0xD5, 0xE9, 0xEC}, 27}, /* ещь */ + {{0xE0, 0xD8, 0xD4}, 27}, /* рид */ + {{0xD4, 0xDD, 0xDE}, 27}, /* дно */ + {{0xE0, 0xD8, 0xDE}, 27}, /* рио */ + {{0xDE, 0xD8, 0xDC}, 27}, /* оим */ + {{0xD5, 0xE0, 0xD6}, 27}, /* ерж */ + {{0xE3, 0xD2, 0xD5}, 26}, /* уве */ + {{0xDE, 0xDD, 0xDA}, 26}, /* онк */ + {{0xD5, 0xDB, 0xDA}, 26}, /* елк */ + {{0xDB, 0xD0, 0xD2}, 26}, /* лав */ + {{0xD0, 0xE2, 0xDE}, 26}, /* ато */ + {{0xEF, 0xDC, 0xD8}, 26}, /* ями */ + {{0xDC, 0xDC, 0xEB}, 26}, /* ммы */ + {{0xD5, 0xE1, 0xDF}, 26}, /* есп */ + {{0xDD, 0xDA, 0xE3}, 26}, /* нку */ + {{0xD8, 0xE6, 0xE3}, 25}, /* ицу */ + {{0xD4, 0xE1, 0xDA}, 25}, /* дск */ + {{0xDD, 0xD8, 0xDD}, 25}, /* нин */ + {{0xDF, 0xDB, 0xD5}, 25}, /* пле */ + {{0xE4, 0xDE, 0xE0}, 25}, /* фор */ + {{0xDB, 0xD0, 0xE1}, 25}, /* лас */ + {{0xD4, 0xD8, 0xDC}, 25}, /* дим */ + {{0xD5, 0xE1, 0xEF}, 25}, /* еся */ + {{0xDD, 0xD8, 0xE7}, 25}, /* нич */ + {{0xDE, 0xD2, 0xE0}, 25}, /* овр */ + {{0xD2, 0xE1, 0xDB}, 25}, /* всл */ + {{0xE0, 0xE8, 0xD5}, 25}, /* рше */ + {{0xD5, 0xE9, 0xD0}, 25}, /* еща */ + {{0xD6, 0xDD, 0xEB}, 25}, /* жны */ + {{0xE0, 0xD8, 0xDC}, 25}, /* рим */ + {{0xD7, 0xD0, 0xE6}, 25}, /* зац */ + {{0xD1, 0xE9, 0xD5}, 25}, /* бще */ + {{0xD0, 0xDA, 0xE2}, 25}, /* акт */ + {{0xD0, 0xD4, 0xE1}, 25}, /* адс */ + {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ + {{0xE9, 0xD8, 0xD5}, 25}, /* щие */ + {{0xD6, 0xD8, 0xE2}, 24}, /* жит */ + {{0xD1, 0xE0, 0xD5}, 24}, /* бре */ + {{0xE3, 0xD3, 0xDE}, 24}, /* уго */ + {{0xD8, 0xEF, 0xE5}, 24}, /* иях */ + {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ + {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ + {{0xD2, 0xDE, 0xD2}, 24}, /* вов */ + {{0xDE, 0xE7, 0xDD}, 24}, /* очн */ + {{0xD2, 0xDE, 0xDE}, 24}, /* воо */ + {{0xDE, 0xD4, 0xEB}, 24}, /* оды */ + {{0xDB, 0xDE, 0xD3}, 24}, /* лог */ + {{0xD2, 0xD0, 0xD5}, 24}, /* вае */ + {{0xD0, 0xEF, 0xE5}, 24}, /* аях */ + {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ + {{0xD4, 0xD8, 0xE7}, 24}, /* дич */ + {{0xDA, 0xD8, 0xE5}, 24}, /* ких */ + {{0xE6, 0xD0, 0xDC}, 24}, /* цам */ + {{0xD8, 0xD7, 0xD2}, 24}, /* изв */ + {{0xE2, 0xD8, 0xD2}, 24}, /* тив */ + {{0xD5, 0xDE, 0xD1}, 24}, /* еоб */ + {{0xE1, 0xDE, 0xE1}, 24}, /* сос */ + {{0xE8, 0xD8, 0xDC}, 24}, /* шим */ + {{0xEB, 0xDF, 0xDE}, 24}, /* ыпо */ + {{0xD5, 0xD6, 0xD0}, 24}, /* ежа */ + {{0xE2, 0xDE, 0xD8}, 24}, /* тои */ + {{0xDA, 0xE2, 0xDE}, 24}, /* кто */ + {{0xD5, 0xE7, 0xD0}, 24}, /* еча */ + {{0xD8, 0xD4, 0xD8}, 24}, /* иди */ + {{0xD1, 0xE9, 0xD8}, 23}, /* бщи */ + {{0xE2, 0xEC, 0xD5}, 23}, /* тье */ + {{0xD1, 0xEA, 0xEF}, 23}, /* бъя */ + {{0xDD, 0xD0, 0xE7}, 23}, /* нач */ + {{0xE2, 0xD5, 0xE7}, 23}, /* теч */ + {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ + {{0xD2, 0xD5, 0xE7}, 23}, /* веч */ + {{0xD5, 0xDC, 0xD5}, 23}, /* еме */ + {{0xDE, 0xD1, 0xE5}, 23}, /* обх */ + {{0xD1, 0xE5, 0xDE}, 23}, /* бхо */ + {{0xD4, 0xD0, 0xD5}, 23}, /* дае */ + {{0xE0, 0xD5, 0xD7}, 23}, /* рез */ + {{0xDA, 0xD0, 0xD6}, 22}, /* каж */ + {{0xDE, 0xDA, 0xE3}, 22}, /* оку */ + {{0xD0, 0xDC, 0xD5}, 22}, /* аме */ + {{0xDD, 0xD5, 0xD7}, 22}, /* нез */ + {{0xEB, 0xD2, 0xD0}, 22}, /* ыва */ + {{0xE1, 0xD2, 0xEF}, 22}, /* свя */ + {{0xE0, 0xD0, 0xD4}, 22}, /* рад */ + {{0xD5, 0xD7, 0xD0}, 22}, /* еза */ + {{0xD8, 0xD2, 0xD0}, 22}, /* ива */ + {{0xDA, 0xD0, 0xDC}, 22}, /* кам */ + {{0xDD, 0xD5, 0xDC}, 22}, /* нем */ + {{0xE2, 0xDA, 0xDE}, 22}, /* тко */ + {{0xD7, 0xD2, 0xD5}, 22}, /* зве */ + {{0xD2, 0xEF, 0xD7}, 22}, /* вяз */ + {{0xEF, 0xE2, 0xD8}, 22}, /* яти */ + {{0xDE, 0xE5, 0xE0}, 22}, /* охр */ + {{0xE0, 0xDE, 0xE2}, 22}, /* рот */ + {{0xDE, 0xDB, 0xD5}, 22}, /* оле */ + {{0xD1, 0xE0, 0xD0}, 22}, /* бра */ + {{0xD0, 0xD5, 0xDC}, 22}, /* аем */ + {{0xDB, 0xD0, 0xE8}, 21}, /* лаш */ + {{0xD8, 0xD7, 0xDC}, 21}, /* изм */ + {{0xD3, 0xE3, 0xE2}, 21}, /* гут */ + {{0xDE, 0xD6, 0xD4}, 21}, /* ожд */ + {{0xDA, 0xD0, 0xDA}, 21}, /* как */ + {{0xDA, 0xD0, 0xE7}, 21}, /* кач */ + {{0xDD, 0xD0, 0xDC}, 21}, /* нам */ + {{0xD4, 0xDE, 0xE5}, 21}, /* дох */ + {{0xDE, 0xE5, 0xDE}, 21}, /* охо */ + {{0xEE, 0xE0, 0xD8}, 21}, /* юри */ + {{0xD2, 0xD0, 0xDC}, 21}, /* вам */ + {{0xD7, 0xDC, 0xDE}, 21}, /* змо */ + {{0xD4, 0xDA, 0xD5}, 21}, /* дке */ + {{0xD1, 0xD0, 0xDD}, 21}, /* бан */ + {{0xD5, 0xDB, 0xD8}, 21}, /* ели */ + {{0xE0, 0xD8, 0xD7}, 21}, /* риз */ + {{0xDB, 0xDD, 0xDE}, 21}, /* лно */ + {{0xD2, 0xEB, 0xE8}, 21}, /* выш */ + {{0xD4, 0xE6, 0xD0}, 21}, /* дца */ + {{0xEF, 0xD4, 0xDA}, 21}, /* ядк */ + {{0xDE, 0xE2, 0xE1}, 21}, /* отс */ + {{0xE2, 0xD5, 0xD9}, 21}, /* тей */ + {{0xD0, 0xDD, 0xDA}, 21}, /* анк */ + {{0xDD, 0xD5, 0xD3}, 21}, /* нег */ + {{0xE6, 0xD0, 0xE2}, 21}, /* цат */ + {{0xD5, 0xDC, 0xEB}, 21}, /* емы */ + {{0xD2, 0xDE, 0xD5}, 21}, /* вое */ + {{0xD4, 0xD0, 0xE7}, 21}, /* дач */ + {{0xDE, 0xD3, 0xE3}, 21}, /* огу */ + {{0xDB, 0xD6, 0xD5}, 21}, /* лже */ + {{0xE2, 0xDD, 0xD8}, 21}, /* тни */ + {{0xD7, 0xD0, 0xD2}, 21}, /* зав */ + {{0xD2, 0xD5, 0xE1}, 21}, /* вес */ + {{0xE1, 0xD0, 0xDC}, 20}, /* сам */ + {{0xD0, 0xE0, 0xDD}, 20}, /* арн */ + {{0xE7, 0xDD, 0xEB}, 20}, /* чны */ + {{0xE1, 0xE0, 0xD5}, 20}, /* сре */ + {{0xE2, 0xD8, 0xEF}, 20}, /* тия */ + {{0xD8, 0xE1, 0xDB}, 20}, /* исл */ + {{0xC1, 0xE2, 0xE0}, 20}, /* Стр */ + {{0xDD, 0xE2, 0xDE}, 20}, /* нто */ + {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ + {{0xD0, 0xE8, 0xD5}, 20}, /* аше */ + {{0xD5, 0xDB, 0xD0}, 20}, /* ела */ + {{0xE3, 0xD4, 0xDE}, 20}, /* удо */ + {{0xD6, 0xD8, 0xD7}, 19}, /* жиз */ + {{0xDF, 0xD8, 0xE1}, 19}, /* пис */ + {{0xD0, 0xD8, 0xDC}, 19}, /* аим */ + {{0xE7, 0xD8, 0xE1}, 19}, /* чис */ + {{0xD5, 0xD6, 0xD8}, 19}, /* ежи */ + {{0xD2, 0xE1, 0xD5}, 19}, /* все */ + {{0xDB, 0xEC, 0xDA}, 19}, /* льк */ + {{0xD0, 0xE2, 0xE3}, 19}, /* ату */ + {{0xE3, 0xD4, 0xD0}, 19}, /* уда */ + {{0xE8, 0xD8, 0xD9}, 19}, /* ший */ + {{0xD7, 0xD0, 0xE0}, 19}, /* зар */ + {{0xD5, 0xD4, 0xDD}, 19}, /* едн */ + {{0xD0, 0xD2, 0xE8}, 19}, /* авш */ + {{0xE0, 0xDE, 0xD8}, 19}, /* рои */ + {{0xD8, 0xD4, 0xD0}, 19}, /* ида */ + {{0xD0, 0xE0, 0xDE}, 19}, /* аро */ + {{0xE2, 0xDE, 0xD9}, 19}, /* той */ + {{0xD6, 0xD0, 0xE9}, 19}, /* жащ */ + {{0xD5, 0xE1, 0xDE}, 19}, /* есо */ + {{0xDF, 0xD0, 0xDB}, 19}, /* пал */ + {{0xE9, 0xD0, 0xD5}, 19}, /* щае */ + {{0xE0, 0xEB, 0xD5}, 19}, /* рые */ + {{0xD5, 0xDD, 0xEF}, 19}, /* еня */ + {{0xE9, 0xD8, 0xD9}, 19}, /* щий */ + {{0xDB, 0xE3, 0xD3}, 19}, /* луг */ + {{0xEE, 0xE7, 0xD8}, 18}, /* ючи */ + {{0xE3, 0xDB, 0xEC}, 18}, /* уль */ + {{0xDC, 0xEB, 0xE5}, 18}, /* мых */ + {{0xE0, 0xDE, 0xD3}, 18}, /* рог */ + {{0xE1, 0xDE, 0xE5}, 18}, /* сох */ + {{0xDA, 0xDE, 0xD5}, 18}, /* кое */ + {{0xDD, 0xE2, 0xE1}, 18}, /* нтс */ + {{0xD0, 0xD7, 0xDD}, 18}, /* азн */ + {{0xE2, 0xDD, 0xEB}, 18}, /* тны */ + {{0xDE, 0xD4, 0xEF}, 18}, /* одя */ + {{0xDE, 0xD1, 0xDD}, 18}, /* обн */ + {{0xD2, 0xEB, 0xD4}, 18}, /* выд */ + {{0xDE, 0xE1, 0xEF}, 18}, /* ося */ + {{0xEC, 0xE2, 0xD0}, 18}, /* ьта */ + {{0xDD, 0xEF, 0xEE}, 18}, /* няю */ + {{0xDD, 0xD0, 0xE0}, 18}, /* нар */ + {{0xD5, 0xD7, 0xE3}, 18}, /* езу */ + {{0xD0, 0xE1, 0xDD}, 18}, /* асн */ + {{0xD7, 0xE3, 0xDB}, 18}, /* зул */ + {{0xE6, 0xD8, 0xDF}, 18}, /* цип */ + {{0xDA, 0xE2, 0xD5}, 18}, /* кте */ + {{0xD4, 0xDE, 0xDF}, 18}, /* доп */ + {{0xDD, 0xE6, 0xD8}, 18}, /* нци */ + {{0xE1, 0xDF, 0xD5}, 18}, /* спе */ + {{0xD8, 0xDC, 0xEB}, 18}, /* имы */ + {{0xDC, 0xDE, 0xDC}, 18}, /* мом */ + {{0xDF, 0xD5, 0xE7}, 18}, /* печ */ + {{0xBE, 0xD1, 0xEF}, 18}, /* Обя */ + {{0xBF, 0xE0, 0xD0}, 18}, /* Пра */ + {{0xDE, 0xDB, 0xDE}, 18}, /* оло */ + {{0xE2, 0xE1, 0xDA}, 18}, /* тск */ + {{0xDB, 0xDD, 0xD8}, 18}, /* лни */ + {{0xD5, 0xE0, 0xE2}, 18}, /* ерт */ + {{0xD8, 0xE1, 0xEC}, 18}, /* ись */ + {{0xDB, 0xEC, 0xE2}, 18}, /* льт */ + {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ + {{0xD2, 0xDE, 0xD1}, 17}, /* воб */ + {{0xE0, 0xDD, 0xEB}, 17}, /* рны */ + {{0xD1, 0xDD, 0xEB}, 17}, /* бны */ + {{0xEB, 0xD4, 0xD0}, 17}, /* ыда */ + {{0xEC, 0xD7, 0xE3}, 17}, /* ьзу */ + {{0xD5, 0xD4, 0xDF}, 17}, /* едп */ + {{0xD0, 0xD4, 0xD5}, 17}, /* аде */ + {{0xD8, 0xDF, 0xD0}, 17}, /* ипа */ + {{0xE1, 0xD5, 0xD9}, 17}, /* сей */ + {{0xD5, 0xD5, 0xE1}, 17}, /* еес */ + {{0xDE, 0xD8, 0xD7}, 17}, /* оиз */ + {{0xDE, 0xE1, 0xD2}, 17}, /* осв */ + {{0xD4, 0xD8, 0xD2}, 17}, /* див */ + {{0xDD, 0xD0, 0xDD}, 17}, /* нан */ + {{0xD5, 0xE2, 0xD0}, 17}, /* ета */ + {{0xD4, 0xDD, 0xD5}, 17}, /* дне */ + {{0xD8, 0xDE, 0xD1}, 17}, /* иоб */ + {{0xE3, 0xD5, 0xE2}, 17}, /* ует */ + {{0xDD, 0xD0, 0xE5}, 17}, /* нах */ + {{0xE1, 0xDC, 0xD5}, 17}, /* сме */ + {{0xD0, 0xDB, 0xD8}, 17}, /* али */ + {{0xD1, 0xEA, 0xD5}, 17}, /* бъе */ + {{0xDF, 0xD0, 0xE1}, 17}, /* пас */ + {{0xD7, 0xD0, 0xDB}, 17}, /* зал */ + {{0xE0, 0xD6, 0xD0}, 16}, /* ржа */ + {{0xEF, 0xD2, 0xD8}, 16}, /* яви */ + {{0xD6, 0xD0, 0xE2}, 16}, /* жат */ + {{0xD1, 0xDE, 0xD6}, 16}, /* бож */ + {{0xE1, 0xD8, 0xDB}, 16}, /* сил */ + {{0xDD, 0xE3, 0xEE}, 16}, /* ную */ + {{0xDF, 0xD5, 0xDD}, 16}, /* пен */ + {{0xDC, 0xD0, 0xE2}, 16}, /* мат */ + {{0xDE, 0xDD, 0xDD}, 16}, /* онн */ + {{0xD2, 0xD8, 0xDD}, 16}, /* вин */ + {{0xE2, 0xDA, 0xD8}, 16}, /* тки */ + {{0xE2, 0xDE, 0xE7}, 16}, /* точ */ + {{0xE1, 0xE7, 0xD8}, 16}, /* счи */ + {{0xDD, 0xD8, 0xE6}, 16}, /* ниц */ + {{0xE9, 0xD5, 0xD5}, 16}, /* щее */ + {{0xD1, 0xD5, 0xE1}, 16}, /* бес */ + {{0xD0, 0xD4, 0xE6}, 16}, /* адц */ + {{0xBA, 0xDE, 0xDC}, 16}, /* Ком */ + {{0xEC, 0xD8, 0xDC}, 16}, /* ьим */ + {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ + {{0xD0, 0xE7, 0xD8}, 16}, /* ачи */ + {{0xDF, 0xDE, 0xDD}, 16}, /* пон */ + {{0xDA, 0xD0, 0xD5}, 16}, /* кае */ + {{0xD8, 0xD3, 0xE0}, 16}, /* игр */ + {{0xD0, 0xDA, 0xD8}, 16}, /* аки */ + {{0xD0, 0xE9, 0xD8}, 16}, /* ащи */ + {{0xDB, 0xEC, 0xE6}, 16}, /* льц */ + {{0xD2, 0xDD, 0xDE}, 16}, /* вно */ + {{0xEB, 0xE8, 0xD5}, 15}, /* ыше */ + {{0xBB, 0xD8, 0xE6}, 15}, /* Лиц */ + {{0xEC, 0xD5, 0xD9}, 15}, /* ьей */ + {{0xE8, 0xD5, 0xDC}, 15}, /* шем */ + {{0xE3, 0xD1, 0xDB}, 15}, /* убл */ + {{0xE0, 0xD0, 0xE6}, 15}, /* рац */ + {{0xDA, 0xE3, 0xDC}, 15}, /* кум */ + {{0xE0, 0xD5, 0xD3}, 15}, /* рег */ + {{0xDE, 0xDF, 0xD0}, 15}, /* опа */ + {{0xB2, 0xDE, 0xD7}, 15}, /* Воз */ + {{0xE2, 0xD0, 0xD5}, 15}, /* тае */ + {{0xDE, 0xD1, 0xEB}, 15}, /* обы */ + {{0xD1, 0xDB, 0xD8}, 15}, /* бли */ + {{0xE0, 0xDC, 0xD5}, 15}, /* рме */ + {{0xD2, 0xDE, 0xE1}, 15}, /* вос */ + {{0xD0, 0xE1, 0xD8}, 15}, /* аси */ + {{0xE2, 0xD0, 0xDC}, 15}, /* там */ + {{0xEC, 0xDC, 0xD5}, 15}, /* ьме */ + {{0xDE, 0xD3, 0xD0}, 15}, /* ога */ + {{0xD8, 0xDB, 0xDE}, 15}, /* ило */ + {{0xE1, 0xEC, 0xDC}, 15}, /* сьм */ + {{0xE0, 0xE2, 0xD8}, 15}, /* рти */ + {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ + {{0xE1, 0xD5, 0xDD}, 15}, /* сен */ + {{0xE2, 0xD0, 0xDB}, 15}, /* тал */ + {{0xD4, 0xD0, 0xE0}, 15}, /* дар */ + {{0xD0, 0xDC, 0xDE}, 15}, /* амо */ + {{0xD5, 0xD4, 0xDB}, 15}, /* едл */ + {{0xE1, 0xE3, 0xD1}, 15}, /* суб */ + {{0xD5, 0xD9, 0xE4}, 15}, /* ейф */ + {{0xC5, 0xE0, 0xD0}, 15}, /* Хра */ + {{0xDB, 0xD0, 0xDC}, 14}, /* лам */ + {{0xD0, 0xE0, 0xE3}, 14}, /* ару */ + {{0xD3, 0xD8, 0xE5}, 14}, /* гих */ + {{0xE6, 0xD8, 0xEF}, 14}, /* ция */ + {{0xD4, 0xD0, 0xD2}, 14}, /* дав */ + {{0xDB, 0xD8, 0xE8}, 14}, /* лиш */ + {{0xEE, 0xE7, 0xD0}, 14}, /* юча */ + {{0xD0, 0xDD, 0xE1}, 14}, /* анс */ + {{0xDE, 0xD3, 0xE0}, 14}, /* огр */ + {{0xD8, 0xE9, 0xD0}, 14}, /* ища */ + {{0xD5, 0xDD, 0xEC}, 14}, /* ень */ + {{0xDE, 0xE2, 0xD8}, 14}, /* оти */ + {{0xD0, 0xD4, 0xEB}, 13}, /* ады */ + {{0xD0, 0xE9, 0xD0}, 13}, /* аща */ + {{0xD2, 0xDE, 0xD8}, 13}, /* вои */ + {{0xD2, 0xEB, 0xDC}, 13}, /* вым */ + {{0xD2, 0xEC, 0xEF}, 13}, /* вья */ + {{0xDA, 0xD8, 0xD5}, 13}, /* кие */ + {{0xDB, 0xD8, 0xE1}, 13}, /* лис */ + {{0xDC, 0xD5, 0xD4}, 13}, /* мед */ + {{0xE2, 0xD8, 0xE5}, 13}, /* тих */ + {{0xD5, 0xE2, 0xDE}, 13}, /* ето */ + {{0xD7, 0xDB, 0xDE}, 13}, /* зло */ + {{0xDE, 0xDF, 0xD5}, 13}, /* опе */ + {{0xE1, 0xD8, 0xDC}, 13}, /* сим */ + {{0xEF, 0xD7, 0xD8}, 13}, /* язи */ + {{0xD8, 0xDD, 0xD4}, 13}, /* инд */ + {{0xE7, 0xE3, 0xD6}, 13}, /* чуж */ + {{0xDB, 0xDA, 0xD8}, 13}, /* лки */ + {{0xD4, 0xDF, 0xE0}, 13}, /* дпр */ + {{0xDD, 0xD4, 0xD8}, 13}, /* нди */ + {{0xDE, 0xE2, 0xD0}, 13}, /* ота */ + {{0xDE, 0xE2, 0xEB}, 13}, /* оты */ + {{0xDB, 0xD0, 0xE7}, 13}, /* лач */ + {{0xDA, 0xD8, 0xDC}, 13}, /* ким */ + {{0xD8, 0xE1, 0xD8}, 13}, /* иси */ + {{0xD2, 0xD0, 0xDB}, 13}, /* вал */ + {{0xD5, 0xDC, 0xDE}, 13}, /* емо */ + {{0xDF, 0xE3, 0xD1}, 13}, /* пуб */ + {{0xEF, 0xD5, 0xDC}, 13}, /* яем */ + {{0xD1, 0xDE, 0xDB}, 13}, /* бол */ + {{0xDD, 0xE2, 0xE3}, 13}, /* нту */ + {{0xDD, 0xD5, 0xD9}, 13}, /* ней */ + {{0xDD, 0xD0, 0xEF}, 13}, /* ная */ + {{0xD5, 0xE1, 0xD0}, 13}, /* еса */ + {{0xE0, 0xDD, 0xDE}, 13}, /* рно */ + {{0xE9, 0xD5, 0xDC}, 13}, /* щем */ + {{0xD0, 0xDD, 0xEB}, 13}, /* аны */ + {{0xB4, 0xDE, 0xD2}, 13}, /* Дов */ + {{0xE7, 0xD8, 0xD2}, 13}, /* чив */ + {{0xD2, 0xD8, 0xE1}, 13}, /* вис */ + {{0xDE, 0xDF, 0xDE}, 13}, /* опо */ + {{0xD2, 0xEC, 0xEE}, 13}, /* вью */ + {{0xD0, 0xDB, 0xD0}, 13}, /* ала */ + {{0xDB, 0xD5, 0xD9}, 12}, /* лей */ + {{0xD0, 0xE7, 0xD0}, 12}, /* ача */ + {{0xD5, 0xD7, 0xD2}, 12}, /* езв */ + {{0xD2, 0xD0, 0xEF}, 12}, /* вая */ + {{0xD5, 0xDE, 0xE1}, 12}, /* еос */ + {{0xEF, 0xE9, 0xD8}, 12}, /* ящи */ + {{0xD8, 0xD2, 0xD8}, 12}, /* иви */ + {{0xDD, 0xD5, 0xD5}, 12}, /* нее */ + {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ + {{0xE8, 0xD5, 0xD5}, 12}, /* шее */ + {{0xE1, 0xD0, 0xE5}, 12}, /* сах */ + {{0xD8, 0xDD, 0xE6}, 12}, /* инц */ + {{0xDE, 0xDC, 0xDF}, 12}, /* омп */ + {{0xE3, 0xD6, 0xDE}, 12}, /* ужо */ + {{0xE3, 0xD0, 0xDB}, 12}, /* уал */ + {{0xDD, 0xD0, 0xE2}, 12}, /* нат */ + {{0xD8, 0xD4, 0xE3}, 12}, /* иду */ + {{0xD2, 0xDB, 0xD0}, 12}, /* вла */ + {{0xD7, 0xD2, 0xD0}, 12}, /* зва */ + {{0xDB, 0xD5, 0xD5}, 12}, /* лее */ + {{0xE0, 0xD5, 0xE5}, 12}, /* рех */ + {{0xD6, 0xD4, 0xE3}, 12}, /* жду */ + {{0xDC, 0xD0, 0xDB}, 12}, /* мал */ + {{0xD5, 0xDD, 0xE1}, 12}, /* енс */ + {{0xD8, 0xD9, 0xE1}, 12}, /* ийс */ + {{0xDA, 0xDE, 0xDB}, 12}, /* кол */ + {{0xDD, 0xD0, 0xD7}, 12}, /* наз */ + {{0xD4, 0xE3, 0xD0}, 12}, /* дуа */ + {{0xDE, 0xDD, 0xD8}, 12}, /* они */ + {{0xE1, 0xD5, 0xDC}, 12}, /* сем */ + {{0xD3, 0xDE, 0xD4}, 12}, /* год */ + {{0xDC, 0xD5, 0xD6}, 12}, /* меж */ + {{0xDE, 0xD7, 0xDB}, 12}, /* озл */ + {{0xD2, 0xDC, 0xD5}, 12}, /* вме */ + {{0xE3, 0xD4, 0xD5}, 12}, /* уде */ + {{0xEC, 0xDA, 0xDE}, 12}, /* ько */ + {{0xD5, 0xD2, 0xEB}, 12}, /* евы */ + {{0xD7, 0xD0, 0xDC}, 12}, /* зам */ + {{0xE1, 0xDE, 0xD4}, 12}, /* сод */ + {{0xE0, 0xDE, 0xD5}, 11}, /* рое */ + {{0xDE, 0xE2, 0xD4}, 11}, /* отд */ + {{0xE1, 0xD8, 0xEF}, 11}, /* сия */ + {{0xD8, 0xDA, 0xE3}, 11}, /* ику */ + {{0xEB, 0xDB, 0xD8}, 11}, /* ыли */ + {{0xD3, 0xD8, 0xDC}, 11}, /* гим */ + {{0xDD, 0xEC, 0xE8}, 11}, /* ньш */ + {{0xE2, 0xD8, 0xE7}, 11}, /* тич */ + {{0xE0, 0xD0, 0xDB}, 11}, /* рал */ + {{0xE3, 0xE7, 0xD8}, 11}, /* учи */ + {{0xDC, 0xD5, 0xEE}, 11}, /* мею */ + {{0xE2, 0xD5, 0xDA}, 11}, /* тек */ + {{0xDE, 0xD1, 0xE3}, 11}, /* обу */ + {{0xDD, 0xDD, 0xE3}, 11}, /* нну */ + {{0xDD, 0xD5, 0xDF}, 11}, /* неп */ + {{0xD2, 0xD5, 0xDB}, 11}, /* вел */ + {{0xE2, 0xDC, 0xD5}, 11}, /* тме */ + {{0xD1, 0xDE, 0xD3}, 11}, /* бог */ + {{0xDE, 0xE0, 0xD8}, 11}, /* ори */ + {{0xD0, 0xD2, 0xDD}, 11}, /* авн */ + {{0xD4, 0xD5, 0xD5}, 11}, /* дее */ + {{0xD6, 0xDE, 0xDC}, 11}, /* жом */ + {{0xB2, 0xE0, 0xD5}, 11}, /* Вре */ + {{0xDC, 0xEB, 0xD5}, 11}, /* мые */ + {{0xEC, 0xE6, 0xD0}, 11}, /* ьца */ + {{0xDE, 0xE6, 0xD5}, 11}, /* оце */ + {{0xD8, 0xE2, 0xEB}, 10}, /* иты */ + {{0xD7, 0xE0, 0xD0}, 10}, /* зра */ + {{0xDE, 0xDD, 0xEB}, 10}, /* оны */ + {{0xE0, 0xD5, 0xE8}, 10}, /* реш */ + {{0xE3, 0xE8, 0xD5}, 10}, /* уше */ + {{0xE0, 0xD5, 0xD2}, 10}, /* рев */ + {{0xDE, 0xDF, 0xE3}, 10}, /* опу */ + {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ + {{0xE2, 0xD0, 0xE7}, 10}, /* тач */ + {{0xD5, 0xE0, 0xDE}, 10}, /* еро */ + {{0xD2, 0xDA, 0xDB}, 10}, /* вкл */ + {{0xD7, 0xEB, 0xD2}, 10}, /* зыв */ + {{0xD0, 0xDF, 0xE0}, 10}, /* апр */ + {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ + {{0xBE, 0xE2, 0xD2}, 10}, /* Отв */ + {{0xE0, 0xE1, 0xD0}, 10}, /* рса */ + {{0xD5, 0xDA, 0xE2}, 10}, /* ект */ + {{0xDB, 0xD5, 0xDA}, 10}, /* лек */ + {{0xD5, 0xD5, 0xE2}, 10}, /* еет */ + {{0xDE, 0xDF, 0xDB}, 10}, /* опл */ + {{0xE2, 0xE7, 0xD5}, 10}, /* тче */ + {{0xD3, 0xDE, 0xDC}, 10}, /* гом */ + {{0xE2, 0xDE, 0xD6}, 10}, /* тож */ + {{0xDB, 0xD5, 0xE7}, 10}, /* леч */ + {{0xD5, 0xE2, 0xEB}, 10}, /* еты */ + {{0xDE, 0xD6, 0xD8}, 10}, /* ожи */ + {{0xDC, 0xDD, 0xDE}, 10}, /* мно */ + {{0xDC, 0xDE, 0xD9}, 10}, /* мой */ + {{0xE6, 0xD5, 0xDB}, 10}, /* цел */ + {{0xE3, 0xDF, 0xD8}, 10}, /* упи */ + {{0xD0, 0xD5, 0xD2}, 10}, /* аев */ + {{0xDF, 0xDE, 0xDC}, 10}, /* пом */ + {{0xD4, 0xEF, 0xE9}, 10}, /* дящ */ + {{0xE2, 0xE0, 0xD8}, 10}, /* три */ + {{0xE8, 0xD8, 0xD5}, 10}, /* шие */ + {{0xD5, 0xDA, 0xD0}, 10}, /* ека */ + {{0xD5, 0xE8, 0xD5}, 10}, /* еше */ + {{0xD7, 0xD0, 0xD8}, 10}, /* заи */ + {{0xD8, 0xE2, 0xDE}, 10}, /* ито */ + {{0xD7, 0xDD, 0xEB}, 10}, /* зны */ + {{0xDE, 0xEF, 0xDD}, 10}, /* оян */ + {{0xD8, 0xD6, 0xD5}, 10}, /* иже */ + {{0xD2, 0xDD, 0xD5}, 10}, /* вне */ + {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ + {{0xD5, 0xDC, 0xEF}, 10}, /* емя */ + {{0xDD, 0xD0, 0xD8}, 10}, /* наи */ + {{0xE2, 0xDE, 0xDB}, 10}, /* тол */ + {{0xDB, 0xD8, 0xE2}, 10}, /* лит */ + {{0xDE, 0xE1, 0xE0}, 10}, /* оср */ + {{0xE2, 0xD4, 0xD5}, 10}, /* тде */ + {{0xD5, 0xDC, 0xD8}, 10}, /* еми */ + {{0xDC, 0xD5, 0xD5}, 10}, /* мее */ + {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ + {{0xDD, 0xD8, 0xD2}, 10}, /* нив */ + {{0xD5, 0xE0, 0xE3}, 10}, /* еру */ + {{0xE7, 0xD5, 0xDC}, 10}, /* чем */ + {{0xD4, 0xDE, 0xD1}, 10}, /* доб */ + {{0xD5, 0xDB, 0xDE}, 10}, /* ело */ + {{0xD8, 0xDB, 0xE3}, 10}, /* илу */ + {{0xD0, 0xD4, 0xDB}, 10}, /* адл */ + {{0xD8, 0xE7, 0xE2}, 10}, /* ичт */ + {{0xDC, 0xDB, 0xD5}, 10}, /* мле */ +}; + +static const myencoding_trigram_t myencoding_detect_trigrams_index_koi8_r[] = { + {{0xC5, 0xCE, 0xC9}, 991}, /* ени */ + {{0xCF, 0xC7, 0xCF}, 806}, /* ого */ + {{0xD3, 0xD4, 0xD7}, 659}, /* ств */ + {{0xCE, 0xC9, 0xD1}, 629}, /* ния */ + {{0xCF, 0xD7, 0xC1}, 566}, /* ова */ + {{0xD4, 0xC5, 0xCC}, 555}, /* тел */ + {{0xD2, 0xC5, 0xC4}, 507}, /* ред */ + {{0xC5, 0xCE, 0xCE}, 499}, /* енн */ + {{0xCF, 0xD7, 0xCF}, 443}, /* ово */ + {{0xC1, 0xCE, 0xC9}, 443}, /* ани */ + {{0xD4, 0xD2, 0xC1}, 429}, /* тра */ + {{0xCF, 0xD3, 0xD4}, 428}, /* ост */ + {{0xCE, 0xC9, 0xC5}, 419}, /* ние */ + {{0xCE, 0xCE, 0xCF}, 412}, /* нно */ + {{0xC1, 0xC8, 0xCF}, 396}, /* ахо */ + {{0xD3, 0xD4, 0xD2}, 392}, /* стр */ + {{0xD2, 0xC1, 0xC8}, 386}, /* рах */ + {{0xC8, 0xCF, 0xD7}, 379}, /* хов */ + {{0xC5, 0xCC, 0xD8}, 365}, /* ель */ + {{0xC7, 0xCF, 0xD7}, 360}, /* гов */ + {{0xD7, 0xCF, 0xD2}, 356}, /* вор */ + {{0xC5, 0xD3, 0xD4}, 349}, /* ест */ + {{0xC1, 0xD4, 0xD8}, 345}, /* ать */ + {{0xD2, 0xC1, 0xD7}, 337}, /* рав */ + {{0xD0, 0xD2, 0xC9}, 330}, /* при */ + {{0xD0, 0xD2, 0xC5}, 323}, /* пре */ + {{0xC4, 0xCF, 0xC7}, 318}, /* дог */ + {{0xCE, 0xC5, 0xCE}, 310}, /* нен */ + {{0xD0, 0xD2, 0xC1}, 309}, /* пра */ + {{0xD7, 0xC1, 0xCE}, 304}, /* ван */ + {{0xC9, 0xD4, 0xC5}, 295}, /* ите */ + {{0xD4, 0xD7, 0xC5}, 281}, /* тве */ + {{0xCC, 0xC5, 0xCE}, 266}, /* лен */ + {{0xD3, 0xD4, 0xCF}, 261}, /* сто */ + {{0xD4, 0xC1, 0xD4}, 260}, /* тат */ + {{0xCE, 0xCE, 0xD9}, 260}, /* нны */ + {{0xCC, 0xD8, 0xCE}, 256}, /* льн */ + {{0xD7, 0xCF, 0xDA}, 255}, /* воз */ + {{0xC9, 0xCC, 0xC9}, 254}, /* или */ + {{0xC1, 0xD4, 0xC5}, 252}, /* ате */ + {{0xC5, 0xC7, 0xCF}, 241}, /* его */ + {{0xC5, 0xD4, 0xD3}, 238}, /* етс */ + {{0xCE, 0xCF, 0xD3}, 236}, /* нос */ + {{0xDD, 0xC5, 0xD3}, 235}, /* щес */ + {{0xD0, 0xCF, 0xCC}, 232}, /* пол */ + {{0xD2, 0xC1, 0xCE}, 231}, /* ран */ + {{0xCE, 0xCF, 0xC7}, 230}, /* ног */ + {{0xD3, 0xD4, 0xC1}, 229}, /* ста */ + {{0xDE, 0xC5, 0xCE}, 226}, /* чен */ + {{0xD4, 0xD2, 0xC5}, 224}, /* тре */ + {{0xDA, 0xCD, 0xC5}, 214}, /* зме */ + {{0xD5, 0xDD, 0xC5}, 212}, /* уще */ + {{0xD3, 0xD4, 0xC9}, 210}, /* сти */ + {{0xCB, 0xCF, 0xCD}, 207}, /* ком */ + {{0xCF, 0xD2, 0xCF}, 206}, /* оро */ + {{0xD7, 0xCC, 0xC5}, 195}, /* вле */ + {{0xDA, 0xC1, 0xCE}, 194}, /* зан */ + {{0xC1, 0xD3, 0xD4}, 193}, /* аст */ + {{0xD4, 0xD3, 0xD1}, 191}, /* тся */ + {{0xC8, 0xD2, 0xC1}, 187}, /* хра */ + {{0xC1, 0xCE, 0xCE}, 182}, /* анн */ + {{0xC5, 0xD2, 0xC5}, 182}, /* ере */ + {{0xD7, 0xD2, 0xC5}, 178}, /* вре */ + {{0xCF, 0xD7, 0xC5}, 173}, /* ове */ + {{0xD8, 0xCE, 0xCF}, 173}, /* ьно */ + {{0xD7, 0xC5, 0xD2}, 172}, /* вер */ + {{0xCD, 0xC5, 0xCE}, 170}, /* мен */ + {{0xCC, 0xC9, 0xC3}, 168}, /* лиц */ + {{0xD4, 0xCF, 0xD2}, 167}, /* тор */ + {{0xD2, 0xC5, 0xCE}, 167}, /* рен */ + {{0xDD, 0xC5, 0xCE}, 165}, /* щен */ + {{0xCF, 0xDA, 0xCD}, 164}, /* озм */ + {{0xC5, 0xC4, 0xC1}, 163}, /* еда */ + {{0xD4, 0xD7, 0xC9}, 159}, /* тви */ + {{0xD1, 0xDA, 0xC1}, 159}, /* яза */ + {{0xC2, 0xD1, 0xDA}, 158}, /* бяз */ + {{0xCE, 0xC9, 0xC9}, 153}, /* нии */ + {{0xCE, 0xD9, 0xC8}, 153}, /* ных */ + {{0xD4, 0xD8, 0xD1}, 153}, /* тья */ + {{0xCD, 0xC5, 0xD2}, 153}, /* мер */ + {{0xD3, 0xCC, 0xC9}, 150}, /* сли */ + {{0xD4, 0xCF, 0xD7}, 148}, /* тов */ + {{0xD4, 0xD7, 0xC1}, 147}, /* тва */ + {{0xCF, 0xD2, 0xC1}, 146}, /* ора */ + {{0xCE, 0xCF, 0xCD}, 144}, /* ном */ + {{0xC4, 0xC5, 0xCE}, 144}, /* ден */ + {{0xC1, 0xCE, 0xC5}, 142}, /* ане */ + {{0xCB, 0xCF, 0xCE}, 141}, /* кон */ + {{0xCC, 0xD5, 0xDE}, 141}, /* луч */ + {{0xCD, 0xD5, 0xDD}, 140}, /* мущ */ + {{0xCF, 0xC2, 0xD1}, 140}, /* обя */ + {{0xD7, 0xC1, 0xD4}, 138}, /* ват */ + {{0xD7, 0xC1, 0xD2}, 137}, /* вар */ + {{0xC5, 0xDD, 0xC5}, 137}, /* еще */ + {{0xCF, 0xD4, 0xD2}, 137}, /* отр */ + {{0xC4, 0xC5, 0xCC}, 137}, /* дел */ + {{0xCE, 0xD9, 0xCD}, 136}, /* ным */ + {{0xC9, 0xCD, 0xD5}, 136}, /* иму */ + {{0xF3, 0xD4, 0xC1}, 134}, /* Ста */ + {{0xD5, 0xDE, 0xC1}, 133}, /* уча */ + {{0xD4, 0xD3, 0xD4}, 131}, /* тст */ + {{0xC5, 0xCC, 0xD1}, 130}, /* еля */ + {{0xD3, 0xCC, 0xD5}, 130}, /* слу */ + {{0xDA, 0xC1, 0xCB}, 130}, /* зак */ + {{0xD4, 0xCF, 0xD1}, 129}, /* тоя */ + {{0xCF, 0xCD, 0xC9}, 128}, /* оми */ + {{0xCD, 0xC5, 0xDD}, 128}, /* мещ */ + {{0xC5, 0xC4, 0xD5}, 127}, /* еду */ + {{0xD7, 0xC5, 0xCE}, 127}, /* вен */ + {{0xCE, 0xCF, 0xD7}, 127}, /* нов */ + {{0xCE, 0xCF, 0xC5}, 126}, /* ное */ + {{0xCF, 0xD4, 0xD7}, 125}, /* отв */ + {{0xCB, 0xC1, 0xDA}, 125}, /* каз */ + {{0xC1, 0xC5, 0xD4}, 125}, /* ает */ + {{0xD3, 0xCB, 0xCF}, 125}, /* ско */ + {{0xC5, 0xCE, 0xD4}, 124}, /* ент */ + {{0xCD, 0xCF, 0xD4}, 123}, /* мот */ + {{0xC1, 0xD7, 0xCC}, 122}, /* авл */ + {{0xD3, 0xCD, 0xCF}, 122}, /* смо */ + {{0xC9, 0xDE, 0xC9}, 121}, /* ичи */ + {{0xC2, 0xD9, 0xD4}, 120}, /* быт */ + {{0xD5, 0xD3, 0xCD}, 118}, /* усм */ + {{0xD3, 0xD3, 0xC9}, 117}, /* сси */ + {{0xC4, 0xD5, 0xD3}, 117}, /* дус */ + {{0xC8, 0xCF, 0xC4}, 117}, /* ход */ + {{0xD2, 0xC9, 0xDE}, 117}, /* рич */ + {{0xDE, 0xC5, 0xD3}, 115}, /* чес */ + {{0xC7, 0xD2, 0xC1}, 114}, /* гра */ + {{0xD0, 0xD2, 0xCF}, 114}, /* про */ + {{0xC4, 0xCF, 0xD7}, 113}, /* дов */ + {{0xD7, 0xC5, 0xD4}, 112}, /* вет */ + {{0xC5, 0xC4, 0xC5}, 112}, /* еде */ + {{0xDB, 0xC5, 0xCE}, 111}, /* шен */ + {{0xDE, 0xC9, 0xCE}, 110}, /* чин */ + {{0xCE, 0xC1, 0xD3}, 109}, /* нас */ + {{0xC9, 0xD4, 0xD8}, 105}, /* ить */ + {{0xD4, 0xD7, 0xCF}, 105}, /* тво */ + {{0xCB, 0xCC, 0xC0}, 104}, /* клю */ + {{0xD2, 0xC9, 0xD4}, 104}, /* рит */ + {{0xD3, 0xD4, 0xD8}, 104}, /* сть */ + {{0xCC, 0xC0, 0xDE}, 104}, /* люч */ + {{0xD4, 0xCF, 0xCD}, 104}, /* том */ + {{0xD3, 0xCC, 0xC5}, 103}, /* сле */ + {{0xD3, 0xD0, 0xCF}, 102}, /* спо */ + {{0xCF, 0xCC, 0xCE}, 102}, /* олн */ + {{0xC5, 0xD3, 0xCC}, 102}, /* есл */ + {{0xC5, 0xD2, 0xC9}, 101}, /* ери */ + {{0xCE, 0xCF, 0xCA}, 101}, /* ной */ + {{0xD2, 0xCF, 0xCD}, 101}, /* ром */ + {{0xCF, 0xD4, 0xCF}, 99}, /* ото */ + {{0xCE, 0xD9, 0xC5}, 99}, /* ные */ + {{0xDA, 0xCE, 0xC1}, 99}, /* зна */ + {{0xD7, 0xCC, 0xD1}, 99}, /* вля */ + {{0xD4, 0xC5, 0xD2}, 98}, /* тер */ + {{0xD5, 0xD0, 0xD2}, 97}, /* упр */ + {{0xC1, 0xCB, 0xCF}, 96}, /* ако */ + {{0xCB, 0xCF, 0xC7}, 96}, /* ког */ + {{0xCE, 0xD9, 0xCA}, 96}, /* ный */ + {{0xCF, 0xD2, 0xD5}, 96}, /* ору */ + {{0xC5, 0xCC, 0xC5}, 95}, /* еле */ + {{0xC5, 0xD3, 0xCB}, 95}, /* еск */ + {{0xC1, 0xDA, 0xC1}, 95}, /* аза */ + {{0xCA, 0xD3, 0xD4}, 93}, /* йст */ + {{0xD0, 0xCF, 0xD2}, 93}, /* пор */ + {{0xCF, 0xD6, 0xC5}, 92}, /* оже */ + {{0xC9, 0xCE, 0xC5}, 91}, /* ине */ + {{0xDD, 0xC5, 0xCA}, 90}, /* щей */ + {{0xD6, 0xC4, 0xC5}, 90}, /* жде */ + {{0xD0, 0xC5, 0xD2}, 89}, /* пер */ + {{0xCE, 0xC9, 0xD4}, 89}, /* нит */ + {{0xCF, 0xCC, 0xD8}, 89}, /* оль */ + {{0xC1, 0xD6, 0xC4}, 88}, /* ажд */ + {{0xD6, 0xC5, 0xCE}, 87}, /* жен */ + {{0xCC, 0xC1, 0xC4}, 87}, /* лад */ + {{0xC1, 0xCD, 0xC9}, 87}, /* ами */ + {{0xCB, 0xCF, 0xD4}, 86}, /* кот */ + {{0xDE, 0xC1, 0xC5}, 85}, /* чае */ + {{0xD7, 0xC5, 0xDD}, 85}, /* вещ */ + {{0xD7, 0xC9, 0xD1}, 85}, /* вия */ + {{0xD1, 0xDD, 0xC5}, 85}, /* яще */ + {{0xC9, 0xC5, 0xCD}, 85}, /* ием */ + {{0xCB, 0xCC, 0xC1}, 85}, /* кла */ + {{0xC5, 0xCA, 0xD3}, 84}, /* ейс */ + {{0xD9, 0xD4, 0xD8}, 84}, /* ыть */ + {{0xC1, 0xD7, 0xCF}, 84}, /* аво */ + {{0xD2, 0xC1, 0xD6}, 83}, /* раж */ + {{0xCC, 0xD8, 0xD3}, 83}, /* льс */ + {{0xCF, 0xD1, 0xDD}, 82}, /* оящ */ + {{0xC5, 0xCE, 0xCF}, 81}, /* ено */ + {{0xC4, 0xD3, 0xD4}, 81}, /* дст */ + {{0xC4, 0xC5, 0xCA}, 80}, /* дей */ + {{0xD2, 0xC5, 0xC2}, 80}, /* реб */ + {{0xD8, 0xD3, 0xD4}, 79}, /* ьст */ + {{0xC5, 0xC4, 0xD3}, 79}, /* едс */ + {{0xC1, 0xD2, 0xC9}, 79}, /* ари */ + {{0xC4, 0xC1, 0xCE}, 79}, /* дан */ + {{0xCD, 0xCF, 0xD6}, 78}, /* мож */ + {{0xC9, 0xCD, 0xC5}, 78}, /* име */ + {{0xC9, 0xCE, 0xCF}, 78}, /* ино */ + {{0xD2, 0xC9, 0xCE}, 77}, /* рин */ + {{0xC4, 0xCF, 0xD3}, 77}, /* дос */ + {{0xD0, 0xCF, 0xD3}, 77}, /* пос */ + {{0xD4, 0xC1, 0xCB}, 77}, /* так */ + {{0xDD, 0xC5, 0xC7}, 77}, /* щег */ + {{0xC4, 0xC1, 0xD4}, 77}, /* дат */ + {{0xD0, 0xCC, 0xC1}, 76}, /* пла */ + {{0xD5, 0xD3, 0xCC}, 76}, /* усл */ + {{0xC9, 0xC3, 0xC1}, 76}, /* ица */ + {{0xD2, 0xCF, 0xD7}, 75}, /* ров */ + {{0xDC, 0xD4, 0xCF}, 75}, /* это */ + {{0xD5, 0xDE, 0xC5}, 74}, /* уче */ + {{0xC4, 0xCF, 0xCC}, 73}, /* дол */ + {{0xD8, 0xCE, 0xD9}, 73}, /* ьны */ + {{0xD2, 0xC1, 0xDA}, 73}, /* раз */ + {{0xCD, 0xC9, 0xD3}, 73}, /* мис */ + {{0xC1, 0xCE, 0xCF}, 72}, /* ано */ + {{0xD3, 0xD2, 0xCF}, 72}, /* сро */ + {{0xC1, 0xD7, 0xC9}, 72}, /* ави */ + {{0xD4, 0xD8, 0xC9}, 71}, /* тьи */ + {{0xC0, 0xDE, 0xC5}, 70}, /* юче */ + {{0xD3, 0xCB, 0xCC}, 70}, /* скл */ + {{0xC9, 0xD3, 0xD3}, 70}, /* исс */ + {{0xD6, 0xC5, 0xD4}, 69}, /* жет */ + {{0xC5, 0xC4, 0xCF}, 69}, /* едо */ + {{0xCC, 0xC5, 0xC4}, 69}, /* лед */ + {{0xCC, 0xCF, 0xD7}, 69}, /* лов */ + {{0xC0, 0xDD, 0xC9}, 68}, /* ющи */ + {{0xC9, 0xC2, 0xCF}, 68}, /* ибо */ + {{0xCC, 0xC1, 0xD4}, 67}, /* лат */ + {{0xD2, 0xCF, 0xCB}, 67}, /* рок */ + {{0xC1, 0xCB, 0xCC}, 67}, /* акл */ + {{0xD2, 0xC9, 0xDD}, 67}, /* рищ */ + {{0xC2, 0xCF, 0xD7}, 67}, /* бов */ + {{0xC9, 0xD3, 0xCB}, 67}, /* иск */ + {{0xC5, 0xC2, 0xCF}, 67}, /* ебо */ + {{0xCC, 0xD8, 0xDA}, 67}, /* льз */ + {{0xD5, 0xCB, 0xC1}, 67}, /* ука */ + {{0xCC, 0xC9, 0xC2}, 66}, /* либ */ + {{0xCF, 0xCD, 0xD5}, 66}, /* ому */ + {{0xCF, 0xD7, 0xCC}, 66}, /* овл */ + {{0xD4, 0xCE, 0xCF}, 65}, /* тно */ + {{0xD7, 0xCF, 0xCA}, 64}, /* вой */ + {{0xD4, 0xCF, 0xC7}, 64}, /* тог */ + {{0xD3, 0xCC, 0xCF}, 64}, /* сло */ + {{0xCF, 0xDA, 0xCE}, 64}, /* озн */ + {{0xD3, 0xCF, 0xCF}, 64}, /* соо */ + {{0xDA, 0xC1, 0xD4}, 63}, /* зат */ + {{0xC9, 0xD3, 0xD0}, 63}, /* исп */ + {{0xC1, 0xDE, 0xC5}, 63}, /* аче */ + {{0xCE, 0xC9, 0xC0}, 63}, /* нию */ + {{0xCF, 0xCE, 0xC5}, 63}, /* оне */ + {{0xCF, 0xCC, 0xD6}, 62}, /* олж */ + {{0xCF, 0xD7, 0xDD}, 61}, /* овщ */ + {{0xD2, 0xC1, 0xD3}, 61}, /* рас */ + {{0xD7, 0xC9, 0xC4}, 61}, /* вид */ + {{0xD7, 0xDD, 0xC9}, 61}, /* вщи */ + {{0xD3, 0xCE, 0xCF}, 61}, /* сно */ + {{0xC9, 0xC3, 0xCF}, 61}, /* ицо */ + {{0xC9, 0xDE, 0xC5}, 61}, /* иче */ + {{0xC1, 0xD7, 0xC5}, 61}, /* аве */ + {{0xC7, 0xCC, 0xC1}, 61}, /* гла */ + {{0xDE, 0xC5, 0xD4}, 61}, /* чет */ + {{0xDD, 0xC9, 0xCB}, 61}, /* щик */ + {{0xD2, 0xD5, 0xC7}, 60}, /* руг */ + {{0xD4, 0xC1, 0xCE}, 60}, /* тан */ + {{0xC9, 0xCD, 0xCF}, 60}, /* имо */ + {{0xC1, 0xCC, 0xD8}, 60}, /* аль */ + {{0xCF, 0xD7, 0xC9}, 60}, /* ови */ + {{0xD6, 0xC4, 0xC1}, 60}, /* жда */ + {{0xD0, 0xCF, 0xD7}, 60}, /* пов */ + {{0xC5, 0xCD, 0xD5}, 60}, /* ему */ + {{0xD1, 0xD4, 0xC5}, 60}, /* яте */ + {{0xD3, 0xC9, 0xC9}, 59}, /* сии */ + {{0xC2, 0xCF, 0xD4}, 59}, /* бот */ + {{0xD7, 0xD9, 0xD0}, 59}, /* вып */ + {{0xC1, 0xC2, 0xCF}, 59}, /* або */ + {{0xCC, 0xD1, 0xC0}, 59}, /* ляю */ + {{0xD3, 0xD5, 0xDD}, 58}, /* сущ */ + {{0xCF, 0xC4, 0xC5}, 58}, /* оде */ + {{0xC9, 0xCE, 0xC9}, 58}, /* ини */ + {{0xD2, 0xC1, 0xD4}, 58}, /* рат */ + {{0xD1, 0xD7, 0xCC}, 58}, /* явл */ + {{0xCE, 0xC1, 0xC7}, 57}, /* наг */ + {{0xC4, 0xD2, 0xD5}, 57}, /* дру */ + {{0xD2, 0xC1, 0xC2}, 57}, /* раб */ + {{0xC1, 0xC7, 0xD2}, 57}, /* агр */ + {{0xC9, 0xCF, 0xCE}, 57}, /* ион */ + {{0xCD, 0xC5, 0xD3}, 57}, /* мес */ + {{0xC1, 0xC3, 0xC9}, 56}, /* аци */ + {{0xCF, 0xD3, 0xD5}, 56}, /* осу */ + {{0xCB, 0xCF, 0xCA}, 55}, /* кой */ + {{0xD3, 0xD7, 0xCF}, 55}, /* сво */ + {{0xDA, 0xCF, 0xD7}, 55}, /* зов */ + {{0xCF, 0xD0, 0xD2}, 54}, /* опр */ + {{0xD3, 0xCF, 0xC2}, 54}, /* соб */ + {{0xD7, 0xD0, 0xD2}, 54}, /* впр */ + {{0xCC, 0xCE, 0xC5}, 54}, /* лне */ + {{0xCF, 0xCD, 0xCD}, 54}, /* омм */ + {{0xC5, 0xD2, 0xC1}, 54}, /* ера */ + {{0xDE, 0xC9, 0xD4}, 54}, /* чит */ + {{0xC5, 0xD2, 0xDE}, 54}, /* ерч */ + {{0xD2, 0xDE, 0xC5}, 54}, /* рче */ + {{0xC1, 0xD4, 0xC9}, 54}, /* ати */ + {{0xCE, 0xC9, 0xCB}, 54}, /* ник */ + {{0xCD, 0xCD, 0xC5}, 54}, /* мме */ + {{0xD5, 0xD3, 0xD4}, 53}, /* уст */ + {{0xD4, 0xC5, 0xCE}, 53}, /* тен */ + {{0xD7, 0xC5, 0xC4}, 53}, /* вед */ + {{0xD3, 0xCF, 0xD7}, 52}, /* сов */ + {{0xC1, 0xD6, 0xC5}, 52}, /* аже */ + {{0xCF, 0xCB, 0xC1}, 52}, /* ока */ + {{0xD9, 0xCD, 0xC9}, 52}, /* ыми */ + {{0xC0, 0xD4, 0xD3}, 52}, /* ютс */ + {{0xCF, 0xCF, 0xD4}, 52}, /* оот */ + {{0xCD, 0xC9, 0xD4}, 52}, /* мит */ + {{0xD1, 0xC0, 0xDD}, 51}, /* яющ */ + {{0xD7, 0xDB, 0xC5}, 51}, /* вше */ + {{0xD3, 0xC9, 0xCF}, 51}, /* сио */ + {{0xCF, 0xCE, 0xCF}, 51}, /* оно */ + {{0xC1, 0xD7, 0xC1}, 51}, /* ава */ + {{0xC1, 0xDD, 0xC5}, 51}, /* аще */ + {{0xCC, 0xD1, 0xC5}, 50}, /* ляе */ + {{0xC5, 0xCE, 0xC5}, 50}, /* ене */ + {{0xCF, 0xC4, 0xC9}, 50}, /* оди */ + {{0xD0, 0xD5, 0xCE}, 49}, /* пун */ + {{0xCC, 0xC9, 0xDE}, 49}, /* лич */ + {{0xD7, 0xCF, 0xCD}, 49}, /* вом */ + {{0xCE, 0xCB, 0xD4}, 49}, /* нкт */ + {{0xCE, 0xC5, 0xD3}, 49}, /* нес */ + {{0xD7, 0xC9, 0xCC}, 49}, /* вил */ + {{0xC5, 0xD6, 0xC4}, 49}, /* ежд */ + {{0xD2, 0xC5, 0xD3}, 49}, /* рес */ + {{0xC0, 0xDD, 0xC5}, 49}, /* юще */ + {{0xD8, 0xDA, 0xCF}, 49}, /* ьзо */ + {{0xD0, 0xCF, 0xD4}, 49}, /* пот */ + {{0xD5, 0xCE, 0xCB}, 49}, /* унк */ + {{0xD3, 0xD4, 0xC5}, 49}, /* сте */ + {{0xCB, 0xCF, 0xD7}, 49}, /* ков */ + {{0xCF, 0xD3, 0xCC}, 48}, /* осл */ + {{0xD1, 0xC5, 0xD4}, 48}, /* яет */ + {{0xE5, 0xD3, 0xCC}, 48}, /* Есл */ + {{0xF0, 0xD2, 0xC9}, 48}, /* При */ + {{0xD4, 0xC1, 0xD7}, 48}, /* тав */ + {{0xCE, 0xC5, 0xD2}, 48}, /* нер */ + {{0xDE, 0xCE, 0xCF}, 47}, /* чно */ + {{0xD0, 0xCF, 0xC4}, 47}, /* под */ + {{0xCE, 0xD4, 0xC1}, 47}, /* нта */ + {{0xC9, 0xDD, 0xC5}, 47}, /* ище */ + {{0xCF, 0xC2, 0xDD}, 47}, /* общ */ + {{0xC1, 0xDA, 0xCD}, 47}, /* азм */ + {{0xD6, 0xCE, 0xCF}, 47}, /* жно */ + {{0xD7, 0xC9, 0xC9}, 46}, /* вии */ + {{0xD2, 0xC1, 0xDD}, 46}, /* ращ */ + {{0xCF, 0xD2, 0xC5}, 46}, /* оре */ + {{0xD7, 0xDB, 0xC9}, 46}, /* вши */ + {{0xC5, 0xCB, 0xD3}, 46}, /* екс */ + {{0xD7, 0xCF, 0xC7}, 46}, /* вог */ + {{0xDE, 0xD4, 0xCF}, 46}, /* что */ + {{0xC9, 0xDE, 0xCE}, 45}, /* ичн */ + {{0xCC, 0xC5, 0xCD}, 45}, /* лем */ + {{0xCD, 0xCF, 0xC7}, 45}, /* мог */ + {{0xD4, 0xD7, 0xCC}, 45}, /* твл */ + {{0xC4, 0xCC, 0xC5}, 45}, /* дле */ + {{0xC4, 0xCC, 0xD1}, 45}, /* для */ + {{0xD2, 0xC5, 0xD4}, 45}, /* рет */ + {{0xC1, 0xD2, 0xC1}, 45}, /* ара */ + {{0xCE, 0xD1, 0xD4}, 44}, /* нят */ + {{0xC5, 0xDE, 0xC5}, 44}, /* ече */ + {{0xCF, 0xD4, 0xC5}, 44}, /* оте */ + {{0xCF, 0xD2, 0xD9}, 44}, /* оры */ + {{0xCF, 0xD3, 0xCE}, 43}, /* осн */ + {{0xCF, 0xC2, 0xCF}, 43}, /* обо */ + {{0xCF, 0xC7, 0xCC}, 43}, /* огл */ + {{0xC9, 0xCE, 0xD9}, 43}, /* ины */ + {{0xC5, 0xD3, 0xD3}, 43}, /* есс */ + {{0xCF, 0xC2, 0xD2}, 43}, /* обр */ + {{0xCB, 0xD2, 0xC1}, 43}, /* кра */ + {{0xC9, 0xD1, 0xCD}, 43}, /* иям */ + {{0xC1, 0xCC, 0xCF}, 43}, /* ало */ + {{0xD2, 0xD5, 0xDE}, 43}, /* руч */ + {{0xCF, 0xD2, 0xC7}, 43}, /* орг */ + {{0xDE, 0xC1, 0xD1}, 42}, /* чая */ + {{0xCE, 0xC9, 0xCD}, 42}, /* ним */ + {{0xC9, 0xDA, 0xCE}, 42}, /* изн */ + {{0xD0, 0xCF, 0xCB}, 42}, /* пок */ + {{0xD3, 0xD4, 0xD5}, 42}, /* сту */ + {{0xC5, 0xCC, 0xC0}, 42}, /* елю */ + {{0xD4, 0xC9, 0xD4}, 42}, /* тит */ + {{0xC3, 0xC5, 0xCE}, 42}, /* цен */ + {{0xDE, 0xC1, 0xD3}, 42}, /* час */ + {{0xC7, 0xC1, 0xCE}, 42}, /* ган */ + {{0xD2, 0xC7, 0xC1}, 42}, /* рга */ + {{0xD3, 0xD4, 0xCE}, 42}, /* стн */ + {{0xD2, 0xC5, 0xD6}, 42}, /* реж */ + {{0xD5, 0xCD, 0xCD}, 42}, /* умм */ + {{0xD4, 0xD7, 0xD5}, 41}, /* тву */ + {{0xD4, 0xD5, 0xD0}, 41}, /* туп */ + {{0xD3, 0xCB, 0xC9}, 40}, /* ски */ + {{0xC4, 0xC5, 0xCB}, 40}, /* дек */ + {{0xCC, 0xC5, 0xD6}, 40}, /* леж */ + {{0xC5, 0xD3, 0xC5}, 40}, /* есе */ + {{0xD7, 0xC9, 0xC5}, 40}, /* вие */ + {{0xD4, 0xCB, 0xC1}, 40}, /* тка */ + {{0xC5, 0xCB, 0xD2}, 40}, /* екр */ + {{0xCF, 0xC4, 0xCF}, 40}, /* одо */ + {{0xCB, 0xD3, 0xC1}, 40}, /* кса */ + {{0xD2, 0xC5, 0xCB}, 40}, /* рек */ + {{0xCE, 0xD4, 0xC5}, 40}, /* нте */ + {{0xD5, 0xC7, 0xC9}, 40}, /* уги */ + {{0xC2, 0xD9, 0xCC}, 40}, /* был */ + {{0xC9, 0xCE, 0xD1}, 40}, /* иня */ + {{0xC5, 0xDD, 0xC9}, 39}, /* ещи */ + {{0xC7, 0xC5, 0xCE}, 39}, /* ген */ + {{0xEB, 0xCF, 0xC4}, 39}, /* Код */ + {{0xC4, 0xC9, 0xD4}, 39}, /* дит */ + {{0xD3, 0xC8, 0xCF}, 39}, /* схо */ + {{0xC9, 0xCE, 0xD4}, 39}, /* инт */ + {{0xD3, 0xD5, 0xCD}, 39}, /* сум */ + {{0xD2, 0xCF, 0xCE}, 39}, /* рон */ + {{0xCF, 0xD4, 0xCB}, 39}, /* отк */ + {{0xC4, 0xCF, 0xCB}, 39}, /* док */ + {{0xC9, 0xCC, 0xC1}, 38}, /* ила */ + {{0xC3, 0xC5, 0xD3}, 38}, /* цес */ + {{0xC9, 0xCB, 0xC1}, 38}, /* ика */ + {{0xDA, 0xCE, 0xC9}, 38}, /* зни */ + {{0xCF, 0xD7, 0xD9}, 38}, /* овы */ + {{0xCC, 0xD6, 0xCE}, 38}, /* лжн */ + {{0xD5, 0xD0, 0xCC}, 38}, /* упл */ + {{0xC7, 0xC4, 0xC1}, 37}, /* гда */ + {{0xCC, 0xC1, 0xD6}, 37}, /* лаж */ + {{0xD6, 0xC5, 0xC4}, 37}, /* жед */ + {{0xC2, 0xC5, 0xDA}, 37}, /* без */ + {{0xC4, 0xC5, 0xD4}, 37}, /* дет */ + {{0xCF, 0xD2, 0xD1}, 37}, /* оря */ + {{0xD2, 0xCF, 0xD3}, 37}, /* рос */ + {{0xCF, 0xC2, 0xCC}, 37}, /* обл */ + {{0xC3, 0xC9, 0xC9}, 37}, /* ции */ + {{0xC4, 0xCF, 0xCD}, 37}, /* дом */ + {{0xCE, 0xC3, 0xC5}, 37}, /* нце */ + {{0xDB, 0xC5, 0xC7}, 37}, /* шег */ + {{0xCC, 0xCF, 0xD6}, 37}, /* лож */ + {{0xCF, 0xCE, 0xC1}, 37}, /* она */ + {{0xCF, 0xCB, 0xCC}, 37}, /* окл */ + {{0xCF, 0xC7, 0xC4}, 37}, /* огд */ + {{0xD2, 0xCF, 0xC4}, 37}, /* род */ + {{0xC5, 0xCE, 0xC1}, 37}, /* ена */ + {{0xCF, 0xCE, 0xC3}, 37}, /* онц */ + {{0xCF, 0xD4, 0xCE}, 37}, /* отн */ + {{0xD3, 0xCF, 0xC7}, 37}, /* сог */ + {{0xC5, 0xD7, 0xDB}, 37}, /* евш */ + {{0xD7, 0xC9, 0xD4}, 36}, /* вит */ + {{0xC5, 0xD2, 0xD0}, 36}, /* ерп */ + {{0xCF, 0xC4, 0xC1}, 36}, /* ода */ + {{0xC5, 0xD4, 0xC5}, 36}, /* ете */ + {{0xCE, 0xC5, 0xCF}, 36}, /* нео */ + {{0xD2, 0xD0, 0xC5}, 36}, /* рпе */ + {{0xC5, 0xD2, 0xDB}, 36}, /* ерш */ + {{0xC9, 0xCD, 0xC9}, 36}, /* ими */ + {{0xC9, 0xD7, 0xDB}, 36}, /* ивш */ + {{0xD9, 0xD0, 0xCC}, 36}, /* ыпл */ + {{0xD0, 0xC5, 0xD7}, 36}, /* пев */ + {{0xC1, 0xC4, 0xC1}, 36}, /* ада */ + {{0xCD, 0xCF, 0xD3}, 35}, /* мос */ + {{0xCF, 0xC2, 0xD3}, 35}, /* обс */ + {{0xCE, 0xC5, 0xC4}, 34}, /* нед */ + {{0xC9, 0xCB, 0xCF}, 34}, /* ико */ + {{0xDD, 0xC9, 0xCD}, 34}, /* щим */ + {{0xC4, 0xC5, 0xD2}, 34}, /* дер */ + {{0xD3, 0xCB, 0xC1}, 34}, /* ска */ + {{0xCF, 0xD2, 0xCD}, 34}, /* орм */ + {{0xD5, 0xCD, 0xC5}, 34}, /* уме */ + {{0xCF, 0xCF, 0xC2}, 34}, /* ооб */ + {{0xD2, 0xC9, 0xD3}, 34}, /* рис */ + {{0xCF, 0xC2, 0xDF}, 33}, /* объ */ + {{0xCF, 0xCC, 0xD5}, 33}, /* олу */ + {{0xDF, 0xD1, 0xD7}, 33}, /* ъяв */ + {{0xD2, 0xC5, 0xCD}, 33}, /* рем */ + {{0xDD, 0xC9, 0xC8}, 33}, /* щих */ + {{0xD5, 0xC0, 0xDD}, 33}, /* ующ */ + {{0xCB, 0xD6, 0xC5}, 33}, /* кже */ + {{0xC9, 0xC4, 0xC5}, 33}, /* иде */ + {{0xC2, 0xD3, 0xD4}, 33}, /* бст */ + {{0xC1, 0xCB, 0xD6}, 33}, /* акж */ + {{0xD7, 0xD5, 0xC0}, 33}, /* вую */ + {{0xC1, 0xD3, 0xC8}, 33}, /* асх */ + {{0xC1, 0xCE, 0xC1}, 32}, /* ана */ + {{0xCE, 0xC1, 0xC4}, 32}, /* над */ + {{0xCF, 0xC2, 0xC5}, 32}, /* обе */ + {{0xD9, 0xD4, 0xCB}, 32}, /* ытк */ + {{0xDC, 0xD4, 0xC9}, 32}, /* эти */ + {{0xCF, 0xD6, 0xCE}, 32}, /* ожн */ + {{0xC1, 0xD4, 0xD9}, 31}, /* аты */ + {{0xD3, 0xC4, 0xC5}, 31}, /* сде */ + {{0xC1, 0xC0, 0xD4}, 31}, /* ают */ + {{0xD1, 0xD4, 0xD8}, 31}, /* ять */ + {{0xCF, 0xD1, 0xD4}, 31}, /* оят */ + {{0xC5, 0xD4, 0xD8}, 31}, /* еть */ + {{0xC1, 0xC7, 0xC5}, 31}, /* аге */ + {{0xDE, 0xD2, 0xC5}, 31}, /* чре */ + {{0xC5, 0xCE, 0xD9}, 31}, /* ены */ + {{0xD5, 0xC2, 0xD9}, 31}, /* убы */ + {{0xC9, 0xD3, 0xD4}, 30}, /* ист */ + {{0xD1, 0xC0, 0xD4}, 30}, /* яют */ + {{0xD2, 0xD1, 0xC4}, 30}, /* ряд */ + {{0xC7, 0xCF, 0xD3}, 30}, /* гос */ + {{0xC9, 0xCD, 0xC1}, 30}, /* има */ + {{0xDA, 0xC1, 0xD3}, 30}, /* зас */ + {{0xC1, 0xC0, 0xDD}, 30}, /* ающ */ + {{0xCF, 0xDA, 0xD7}, 30}, /* озв */ + {{0xC5, 0xC4, 0xC9}, 30}, /* еди */ + {{0xCF, 0xCD, 0xC5}, 30}, /* оме */ + {{0xCE, 0xC9, 0xCA}, 30}, /* ний */ + {{0xD3, 0xD5, 0xC4}, 30}, /* суд */ + {{0xDA, 0xC4, 0xCF}, 29}, /* здо */ + {{0xD3, 0xD7, 0xC9}, 29}, /* сви */ + {{0xCF, 0xCC, 0xC9}, 29}, /* оли */ + {{0xCF, 0xD7, 0xD8}, 29}, /* овь */ + {{0xD7, 0xC9, 0xCA}, 29}, /* вий */ + {{0xC4, 0xCF, 0xD2}, 29}, /* дор */ + {{0xC4, 0xC5, 0xD1}, 29}, /* дея */ + {{0xC5, 0xD1, 0xD4}, 29}, /* еят */ + {{0xC3, 0xCF, 0xCD}, 29}, /* цом */ + {{0xC9, 0xDA, 0xC1}, 28}, /* иза */ + {{0xD3, 0xDE, 0xC5}, 28}, /* сче */ + {{0xCB, 0xD4, 0xC1}, 28}, /* кта */ + {{0xCF, 0xC4, 0xCE}, 28}, /* одн */ + {{0xC2, 0xCC, 0xC1}, 28}, /* бла */ + {{0xCF, 0xC4, 0xCC}, 28}, /* одл */ + {{0xC9, 0xD4, 0xC1}, 28}, /* ита */ + {{0xE4, 0xCF, 0xC7}, 28}, /* Дог */ + {{0xCF, 0xD3, 0xCF}, 28}, /* осо */ + {{0xCE, 0xCF, 0xDB}, 28}, /* нош */ + {{0xCB, 0xD5, 0xD2}, 28}, /* кур */ + {{0xC9, 0xCE, 0xC1}, 28}, /* ина */ + {{0xCF, 0xDB, 0xC5}, 28}, /* оше */ + {{0xCE, 0xC1, 0xCC}, 28}, /* нал */ + {{0xCE, 0xC9, 0xDA}, 27}, /* низ */ + {{0xDA, 0xD7, 0xD2}, 27}, /* звр */ + {{0xD7, 0xD2, 0xC1}, 27}, /* вра */ + {{0xCC, 0xC5, 0xD4}, 27}, /* лет */ + {{0xC5, 0xDD, 0xD8}, 27}, /* ещь */ + {{0xD2, 0xC9, 0xC4}, 27}, /* рид */ + {{0xC4, 0xCE, 0xCF}, 27}, /* дно */ + {{0xD2, 0xC9, 0xCF}, 27}, /* рио */ + {{0xCF, 0xC9, 0xCD}, 27}, /* оим */ + {{0xC5, 0xD2, 0xD6}, 27}, /* ерж */ + {{0xD5, 0xD7, 0xC5}, 26}, /* уве */ + {{0xCF, 0xCE, 0xCB}, 26}, /* онк */ + {{0xC5, 0xCC, 0xCB}, 26}, /* елк */ + {{0xCC, 0xC1, 0xD7}, 26}, /* лав */ + {{0xC1, 0xD4, 0xCF}, 26}, /* ато */ + {{0xD1, 0xCD, 0xC9}, 26}, /* ями */ + {{0xCD, 0xCD, 0xD9}, 26}, /* ммы */ + {{0xC5, 0xD3, 0xD0}, 26}, /* есп */ + {{0xCE, 0xCB, 0xD5}, 26}, /* нку */ + {{0xC9, 0xC3, 0xD5}, 25}, /* ицу */ + {{0xC4, 0xD3, 0xCB}, 25}, /* дск */ + {{0xCE, 0xC9, 0xCE}, 25}, /* нин */ + {{0xD0, 0xCC, 0xC5}, 25}, /* пле */ + {{0xC6, 0xCF, 0xD2}, 25}, /* фор */ + {{0xCC, 0xC1, 0xD3}, 25}, /* лас */ + {{0xC4, 0xC9, 0xCD}, 25}, /* дим */ + {{0xC5, 0xD3, 0xD1}, 25}, /* еся */ + {{0xCE, 0xC9, 0xDE}, 25}, /* нич */ + {{0xCF, 0xD7, 0xD2}, 25}, /* овр */ + {{0xD7, 0xD3, 0xCC}, 25}, /* всл */ + {{0xD2, 0xDB, 0xC5}, 25}, /* рше */ + {{0xC5, 0xDD, 0xC1}, 25}, /* еща */ + {{0xD6, 0xCE, 0xD9}, 25}, /* жны */ + {{0xD2, 0xC9, 0xCD}, 25}, /* рим */ + {{0xDA, 0xC1, 0xC3}, 25}, /* зац */ + {{0xC2, 0xDD, 0xC5}, 25}, /* бще */ + {{0xC1, 0xCB, 0xD4}, 25}, /* акт */ + {{0xC1, 0xC4, 0xD3}, 25}, /* адс */ + {{0xD5, 0xDE, 0xD2}, 25}, /* учр */ + {{0xDD, 0xC9, 0xC5}, 25}, /* щие */ + {{0xD6, 0xC9, 0xD4}, 24}, /* жит */ + {{0xC2, 0xD2, 0xC5}, 24}, /* бре */ + {{0xD5, 0xC7, 0xCF}, 24}, /* уго */ + {{0xC9, 0xD1, 0xC8}, 24}, /* иях */ + {{0xD4, 0xD8, 0xC0}, 24}, /* тью */ + {{0xD8, 0xD3, 0xD1}, 24}, /* ься */ + {{0xD7, 0xCF, 0xD7}, 24}, /* вов */ + {{0xCF, 0xDE, 0xCE}, 24}, /* очн */ + {{0xD7, 0xCF, 0xCF}, 24}, /* воо */ + {{0xCF, 0xC4, 0xD9}, 24}, /* оды */ + {{0xCC, 0xCF, 0xC7}, 24}, /* лог */ + {{0xD7, 0xC1, 0xC5}, 24}, /* вае */ + {{0xC1, 0xD1, 0xC8}, 24}, /* аях */ + {{0xD4, 0xD8, 0xD3}, 24}, /* тьс */ + {{0xC4, 0xC9, 0xDE}, 24}, /* дич */ + {{0xCB, 0xC9, 0xC8}, 24}, /* ких */ + {{0xC3, 0xC1, 0xCD}, 24}, /* цам */ + {{0xC9, 0xDA, 0xD7}, 24}, /* изв */ + {{0xD4, 0xC9, 0xD7}, 24}, /* тив */ + {{0xC5, 0xCF, 0xC2}, 24}, /* еоб */ + {{0xD3, 0xCF, 0xD3}, 24}, /* сос */ + {{0xDB, 0xC9, 0xCD}, 24}, /* шим */ + {{0xD9, 0xD0, 0xCF}, 24}, /* ыпо */ + {{0xC5, 0xD6, 0xC1}, 24}, /* ежа */ + {{0xD4, 0xCF, 0xC9}, 24}, /* тои */ + {{0xCB, 0xD4, 0xCF}, 24}, /* кто */ + {{0xC5, 0xDE, 0xC1}, 24}, /* еча */ + {{0xC9, 0xC4, 0xC9}, 24}, /* иди */ + {{0xC2, 0xDD, 0xC9}, 23}, /* бщи */ + {{0xD4, 0xD8, 0xC5}, 23}, /* тье */ + {{0xC2, 0xDF, 0xD1}, 23}, /* бъя */ + {{0xCE, 0xC1, 0xDE}, 23}, /* нач */ + {{0xD4, 0xC5, 0xDE}, 23}, /* теч */ + {{0xD5, 0xD2, 0xD3}, 23}, /* урс */ + {{0xD7, 0xC5, 0xDE}, 23}, /* веч */ + {{0xC5, 0xCD, 0xC5}, 23}, /* еме */ + {{0xCF, 0xC2, 0xC8}, 23}, /* обх */ + {{0xC2, 0xC8, 0xCF}, 23}, /* бхо */ + {{0xC4, 0xC1, 0xC5}, 23}, /* дае */ + {{0xD2, 0xC5, 0xDA}, 23}, /* рез */ + {{0xCB, 0xC1, 0xD6}, 22}, /* каж */ + {{0xCF, 0xCB, 0xD5}, 22}, /* оку */ + {{0xC1, 0xCD, 0xC5}, 22}, /* аме */ + {{0xCE, 0xC5, 0xDA}, 22}, /* нез */ + {{0xD9, 0xD7, 0xC1}, 22}, /* ыва */ + {{0xD3, 0xD7, 0xD1}, 22}, /* свя */ + {{0xD2, 0xC1, 0xC4}, 22}, /* рад */ + {{0xC5, 0xDA, 0xC1}, 22}, /* еза */ + {{0xC9, 0xD7, 0xC1}, 22}, /* ива */ + {{0xCB, 0xC1, 0xCD}, 22}, /* кам */ + {{0xCE, 0xC5, 0xCD}, 22}, /* нем */ + {{0xD4, 0xCB, 0xCF}, 22}, /* тко */ + {{0xDA, 0xD7, 0xC5}, 22}, /* зве */ + {{0xD7, 0xD1, 0xDA}, 22}, /* вяз */ + {{0xD1, 0xD4, 0xC9}, 22}, /* яти */ + {{0xCF, 0xC8, 0xD2}, 22}, /* охр */ + {{0xD2, 0xCF, 0xD4}, 22}, /* рот */ + {{0xCF, 0xCC, 0xC5}, 22}, /* оле */ + {{0xC2, 0xD2, 0xC1}, 22}, /* бра */ + {{0xC1, 0xC5, 0xCD}, 22}, /* аем */ + {{0xCC, 0xC1, 0xDB}, 21}, /* лаш */ + {{0xC9, 0xDA, 0xCD}, 21}, /* изм */ + {{0xC7, 0xD5, 0xD4}, 21}, /* гут */ + {{0xCF, 0xD6, 0xC4}, 21}, /* ожд */ + {{0xCB, 0xC1, 0xCB}, 21}, /* как */ + {{0xCB, 0xC1, 0xDE}, 21}, /* кач */ + {{0xCE, 0xC1, 0xCD}, 21}, /* нам */ + {{0xC4, 0xCF, 0xC8}, 21}, /* дох */ + {{0xCF, 0xC8, 0xCF}, 21}, /* охо */ + {{0xC0, 0xD2, 0xC9}, 21}, /* юри */ + {{0xD7, 0xC1, 0xCD}, 21}, /* вам */ + {{0xDA, 0xCD, 0xCF}, 21}, /* змо */ + {{0xC4, 0xCB, 0xC5}, 21}, /* дке */ + {{0xC2, 0xC1, 0xCE}, 21}, /* бан */ + {{0xC5, 0xCC, 0xC9}, 21}, /* ели */ + {{0xD2, 0xC9, 0xDA}, 21}, /* риз */ + {{0xCC, 0xCE, 0xCF}, 21}, /* лно */ + {{0xD7, 0xD9, 0xDB}, 21}, /* выш */ + {{0xC4, 0xC3, 0xC1}, 21}, /* дца */ + {{0xD1, 0xC4, 0xCB}, 21}, /* ядк */ + {{0xCF, 0xD4, 0xD3}, 21}, /* отс */ + {{0xD4, 0xC5, 0xCA}, 21}, /* тей */ + {{0xC1, 0xCE, 0xCB}, 21}, /* анк */ + {{0xCE, 0xC5, 0xC7}, 21}, /* нег */ + {{0xC3, 0xC1, 0xD4}, 21}, /* цат */ + {{0xC5, 0xCD, 0xD9}, 21}, /* емы */ + {{0xD7, 0xCF, 0xC5}, 21}, /* вое */ + {{0xC4, 0xC1, 0xDE}, 21}, /* дач */ + {{0xCF, 0xC7, 0xD5}, 21}, /* огу */ + {{0xCC, 0xD6, 0xC5}, 21}, /* лже */ + {{0xD4, 0xCE, 0xC9}, 21}, /* тни */ + {{0xDA, 0xC1, 0xD7}, 21}, /* зав */ + {{0xD7, 0xC5, 0xD3}, 21}, /* вес */ + {{0xD3, 0xC1, 0xCD}, 20}, /* сам */ + {{0xC1, 0xD2, 0xCE}, 20}, /* арн */ + {{0xDE, 0xCE, 0xD9}, 20}, /* чны */ + {{0xD3, 0xD2, 0xC5}, 20}, /* сре */ + {{0xD4, 0xC9, 0xD1}, 20}, /* тия */ + {{0xC9, 0xD3, 0xCC}, 20}, /* исл */ + {{0xF3, 0xD4, 0xD2}, 20}, /* Стр */ + {{0xCE, 0xD4, 0xCF}, 20}, /* нто */ + {{0xD5, 0xD4, 0xD2}, 20}, /* утр */ + {{0xC1, 0xDB, 0xC5}, 20}, /* аше */ + {{0xC5, 0xCC, 0xC1}, 20}, /* ела */ + {{0xD5, 0xC4, 0xCF}, 20}, /* удо */ + {{0xD6, 0xC9, 0xDA}, 19}, /* жиз */ + {{0xD0, 0xC9, 0xD3}, 19}, /* пис */ + {{0xC1, 0xC9, 0xCD}, 19}, /* аим */ + {{0xDE, 0xC9, 0xD3}, 19}, /* чис */ + {{0xC5, 0xD6, 0xC9}, 19}, /* ежи */ + {{0xD7, 0xD3, 0xC5}, 19}, /* все */ + {{0xCC, 0xD8, 0xCB}, 19}, /* льк */ + {{0xC1, 0xD4, 0xD5}, 19}, /* ату */ + {{0xD5, 0xC4, 0xC1}, 19}, /* уда */ + {{0xDB, 0xC9, 0xCA}, 19}, /* ший */ + {{0xDA, 0xC1, 0xD2}, 19}, /* зар */ + {{0xC5, 0xC4, 0xCE}, 19}, /* едн */ + {{0xC1, 0xD7, 0xDB}, 19}, /* авш */ + {{0xD2, 0xCF, 0xC9}, 19}, /* рои */ + {{0xC9, 0xC4, 0xC1}, 19}, /* ида */ + {{0xC1, 0xD2, 0xCF}, 19}, /* аро */ + {{0xD4, 0xCF, 0xCA}, 19}, /* той */ + {{0xD6, 0xC1, 0xDD}, 19}, /* жащ */ + {{0xC5, 0xD3, 0xCF}, 19}, /* есо */ + {{0xD0, 0xC1, 0xCC}, 19}, /* пал */ + {{0xDD, 0xC1, 0xC5}, 19}, /* щае */ + {{0xD2, 0xD9, 0xC5}, 19}, /* рые */ + {{0xC5, 0xCE, 0xD1}, 19}, /* еня */ + {{0xDD, 0xC9, 0xCA}, 19}, /* щий */ + {{0xCC, 0xD5, 0xC7}, 19}, /* луг */ + {{0xC0, 0xDE, 0xC9}, 18}, /* ючи */ + {{0xD5, 0xCC, 0xD8}, 18}, /* уль */ + {{0xCD, 0xD9, 0xC8}, 18}, /* мых */ + {{0xD2, 0xCF, 0xC7}, 18}, /* рог */ + {{0xD3, 0xCF, 0xC8}, 18}, /* сох */ + {{0xCB, 0xCF, 0xC5}, 18}, /* кое */ + {{0xCE, 0xD4, 0xD3}, 18}, /* нтс */ + {{0xC1, 0xDA, 0xCE}, 18}, /* азн */ + {{0xD4, 0xCE, 0xD9}, 18}, /* тны */ + {{0xCF, 0xC4, 0xD1}, 18}, /* одя */ + {{0xCF, 0xC2, 0xCE}, 18}, /* обн */ + {{0xD7, 0xD9, 0xC4}, 18}, /* выд */ + {{0xCF, 0xD3, 0xD1}, 18}, /* ося */ + {{0xD8, 0xD4, 0xC1}, 18}, /* ьта */ + {{0xCE, 0xD1, 0xC0}, 18}, /* няю */ + {{0xCE, 0xC1, 0xD2}, 18}, /* нар */ + {{0xC5, 0xDA, 0xD5}, 18}, /* езу */ + {{0xC1, 0xD3, 0xCE}, 18}, /* асн */ + {{0xDA, 0xD5, 0xCC}, 18}, /* зул */ + {{0xC3, 0xC9, 0xD0}, 18}, /* цип */ + {{0xCB, 0xD4, 0xC5}, 18}, /* кте */ + {{0xC4, 0xCF, 0xD0}, 18}, /* доп */ + {{0xCE, 0xC3, 0xC9}, 18}, /* нци */ + {{0xD3, 0xD0, 0xC5}, 18}, /* спе */ + {{0xC9, 0xCD, 0xD9}, 18}, /* имы */ + {{0xCD, 0xCF, 0xCD}, 18}, /* мом */ + {{0xD0, 0xC5, 0xDE}, 18}, /* печ */ + {{0xEF, 0xC2, 0xD1}, 18}, /* Обя */ + {{0xF0, 0xD2, 0xC1}, 18}, /* Пра */ + {{0xCF, 0xCC, 0xCF}, 18}, /* оло */ + {{0xD4, 0xD3, 0xCB}, 18}, /* тск */ + {{0xCC, 0xCE, 0xC9}, 18}, /* лни */ + {{0xC5, 0xD2, 0xD4}, 18}, /* ерт */ + {{0xC9, 0xD3, 0xD8}, 18}, /* ись */ + {{0xCC, 0xD8, 0xD4}, 18}, /* льт */ + {{0xD3, 0xD5, 0xD4}, 18}, /* сут */ + {{0xD7, 0xCF, 0xC2}, 17}, /* воб */ + {{0xD2, 0xCE, 0xD9}, 17}, /* рны */ + {{0xC2, 0xCE, 0xD9}, 17}, /* бны */ + {{0xD9, 0xC4, 0xC1}, 17}, /* ыда */ + {{0xD8, 0xDA, 0xD5}, 17}, /* ьзу */ + {{0xC5, 0xC4, 0xD0}, 17}, /* едп */ + {{0xC1, 0xC4, 0xC5}, 17}, /* аде */ + {{0xC9, 0xD0, 0xC1}, 17}, /* ипа */ + {{0xD3, 0xC5, 0xCA}, 17}, /* сей */ + {{0xC5, 0xC5, 0xD3}, 17}, /* еес */ + {{0xCF, 0xC9, 0xDA}, 17}, /* оиз */ + {{0xCF, 0xD3, 0xD7}, 17}, /* осв */ + {{0xC4, 0xC9, 0xD7}, 17}, /* див */ + {{0xCE, 0xC1, 0xCE}, 17}, /* нан */ + {{0xC5, 0xD4, 0xC1}, 17}, /* ета */ + {{0xC4, 0xCE, 0xC5}, 17}, /* дне */ + {{0xC9, 0xCF, 0xC2}, 17}, /* иоб */ + {{0xD5, 0xC5, 0xD4}, 17}, /* ует */ + {{0xCE, 0xC1, 0xC8}, 17}, /* нах */ + {{0xD3, 0xCD, 0xC5}, 17}, /* сме */ + {{0xC1, 0xCC, 0xC9}, 17}, /* али */ + {{0xC2, 0xDF, 0xC5}, 17}, /* бъе */ + {{0xD0, 0xC1, 0xD3}, 17}, /* пас */ + {{0xDA, 0xC1, 0xCC}, 17}, /* зал */ + {{0xD2, 0xD6, 0xC1}, 16}, /* ржа */ + {{0xD1, 0xD7, 0xC9}, 16}, /* яви */ + {{0xD6, 0xC1, 0xD4}, 16}, /* жат */ + {{0xC2, 0xCF, 0xD6}, 16}, /* бож */ + {{0xD3, 0xC9, 0xCC}, 16}, /* сил */ + {{0xCE, 0xD5, 0xC0}, 16}, /* ную */ + {{0xD0, 0xC5, 0xCE}, 16}, /* пен */ + {{0xCD, 0xC1, 0xD4}, 16}, /* мат */ + {{0xCF, 0xCE, 0xCE}, 16}, /* онн */ + {{0xD7, 0xC9, 0xCE}, 16}, /* вин */ + {{0xD4, 0xCB, 0xC9}, 16}, /* тки */ + {{0xD4, 0xCF, 0xDE}, 16}, /* точ */ + {{0xD3, 0xDE, 0xC9}, 16}, /* счи */ + {{0xCE, 0xC9, 0xC3}, 16}, /* ниц */ + {{0xDD, 0xC5, 0xC5}, 16}, /* щее */ + {{0xC2, 0xC5, 0xD3}, 16}, /* бес */ + {{0xC1, 0xC4, 0xC3}, 16}, /* адц */ + {{0xEB, 0xCF, 0xCD}, 16}, /* Ком */ + {{0xD8, 0xC9, 0xCD}, 16}, /* ьим */ + {{0xD5, 0xD4, 0xD3}, 16}, /* утс */ + {{0xC1, 0xDE, 0xC9}, 16}, /* ачи */ + {{0xD0, 0xCF, 0xCE}, 16}, /* пон */ + {{0xCB, 0xC1, 0xC5}, 16}, /* кае */ + {{0xC9, 0xC7, 0xD2}, 16}, /* игр */ + {{0xC1, 0xCB, 0xC9}, 16}, /* аки */ + {{0xC1, 0xDD, 0xC9}, 16}, /* ащи */ + {{0xCC, 0xD8, 0xC3}, 16}, /* льц */ + {{0xD7, 0xCE, 0xCF}, 16}, /* вно */ + {{0xD9, 0xDB, 0xC5}, 15}, /* ыше */ + {{0xEC, 0xC9, 0xC3}, 15}, /* Лиц */ + {{0xD8, 0xC5, 0xCA}, 15}, /* ьей */ + {{0xDB, 0xC5, 0xCD}, 15}, /* шем */ + {{0xD5, 0xC2, 0xCC}, 15}, /* убл */ + {{0xD2, 0xC1, 0xC3}, 15}, /* рац */ + {{0xCB, 0xD5, 0xCD}, 15}, /* кум */ + {{0xD2, 0xC5, 0xC7}, 15}, /* рег */ + {{0xCF, 0xD0, 0xC1}, 15}, /* опа */ + {{0xF7, 0xCF, 0xDA}, 15}, /* Воз */ + {{0xD4, 0xC1, 0xC5}, 15}, /* тае */ + {{0xCF, 0xC2, 0xD9}, 15}, /* обы */ + {{0xC2, 0xCC, 0xC9}, 15}, /* бли */ + {{0xD2, 0xCD, 0xC5}, 15}, /* рме */ + {{0xD7, 0xCF, 0xD3}, 15}, /* вос */ + {{0xC1, 0xD3, 0xC9}, 15}, /* аси */ + {{0xD4, 0xC1, 0xCD}, 15}, /* там */ + {{0xD8, 0xCD, 0xC5}, 15}, /* ьме */ + {{0xCF, 0xC7, 0xC1}, 15}, /* ога */ + {{0xC9, 0xCC, 0xCF}, 15}, /* ило */ + {{0xD3, 0xD8, 0xCD}, 15}, /* сьм */ + {{0xD2, 0xD4, 0xC9}, 15}, /* рти */ + {{0xD4, 0xD3, 0xD5}, 15}, /* тсу */ + {{0xD3, 0xC5, 0xCE}, 15}, /* сен */ + {{0xD4, 0xC1, 0xCC}, 15}, /* тал */ + {{0xC4, 0xC1, 0xD2}, 15}, /* дар */ + {{0xC1, 0xCD, 0xCF}, 15}, /* амо */ + {{0xC5, 0xC4, 0xCC}, 15}, /* едл */ + {{0xD3, 0xD5, 0xC2}, 15}, /* суб */ + {{0xC5, 0xCA, 0xC6}, 15}, /* ейф */ + {{0xE8, 0xD2, 0xC1}, 15}, /* Хра */ + {{0xCC, 0xC1, 0xCD}, 14}, /* лам */ + {{0xC1, 0xD2, 0xD5}, 14}, /* ару */ + {{0xC7, 0xC9, 0xC8}, 14}, /* гих */ + {{0xC3, 0xC9, 0xD1}, 14}, /* ция */ + {{0xC4, 0xC1, 0xD7}, 14}, /* дав */ + {{0xCC, 0xC9, 0xDB}, 14}, /* лиш */ + {{0xC0, 0xDE, 0xC1}, 14}, /* юча */ + {{0xC1, 0xCE, 0xD3}, 14}, /* анс */ + {{0xCF, 0xC7, 0xD2}, 14}, /* огр */ + {{0xC9, 0xDD, 0xC1}, 14}, /* ища */ + {{0xC5, 0xCE, 0xD8}, 14}, /* ень */ + {{0xCF, 0xD4, 0xC9}, 14}, /* оти */ + {{0xC1, 0xC4, 0xD9}, 13}, /* ады */ + {{0xC1, 0xDD, 0xC1}, 13}, /* аща */ + {{0xD7, 0xCF, 0xC9}, 13}, /* вои */ + {{0xD7, 0xD9, 0xCD}, 13}, /* вым */ + {{0xD7, 0xD8, 0xD1}, 13}, /* вья */ + {{0xCB, 0xC9, 0xC5}, 13}, /* кие */ + {{0xCC, 0xC9, 0xD3}, 13}, /* лис */ + {{0xCD, 0xC5, 0xC4}, 13}, /* мед */ + {{0xD4, 0xC9, 0xC8}, 13}, /* тих */ + {{0xC5, 0xD4, 0xCF}, 13}, /* ето */ + {{0xDA, 0xCC, 0xCF}, 13}, /* зло */ + {{0xCF, 0xD0, 0xC5}, 13}, /* опе */ + {{0xD3, 0xC9, 0xCD}, 13}, /* сим */ + {{0xD1, 0xDA, 0xC9}, 13}, /* язи */ + {{0xC9, 0xCE, 0xC4}, 13}, /* инд */ + {{0xDE, 0xD5, 0xD6}, 13}, /* чуж */ + {{0xCC, 0xCB, 0xC9}, 13}, /* лки */ + {{0xC4, 0xD0, 0xD2}, 13}, /* дпр */ + {{0xCE, 0xC4, 0xC9}, 13}, /* нди */ + {{0xCF, 0xD4, 0xC1}, 13}, /* ота */ + {{0xCF, 0xD4, 0xD9}, 13}, /* оты */ + {{0xCC, 0xC1, 0xDE}, 13}, /* лач */ + {{0xCB, 0xC9, 0xCD}, 13}, /* ким */ + {{0xC9, 0xD3, 0xC9}, 13}, /* иси */ + {{0xD7, 0xC1, 0xCC}, 13}, /* вал */ + {{0xC5, 0xCD, 0xCF}, 13}, /* емо */ + {{0xD0, 0xD5, 0xC2}, 13}, /* пуб */ + {{0xD1, 0xC5, 0xCD}, 13}, /* яем */ + {{0xC2, 0xCF, 0xCC}, 13}, /* бол */ + {{0xCE, 0xD4, 0xD5}, 13}, /* нту */ + {{0xCE, 0xC5, 0xCA}, 13}, /* ней */ + {{0xCE, 0xC1, 0xD1}, 13}, /* ная */ + {{0xC5, 0xD3, 0xC1}, 13}, /* еса */ + {{0xD2, 0xCE, 0xCF}, 13}, /* рно */ + {{0xDD, 0xC5, 0xCD}, 13}, /* щем */ + {{0xC1, 0xCE, 0xD9}, 13}, /* аны */ + {{0xE4, 0xCF, 0xD7}, 13}, /* Дов */ + {{0xDE, 0xC9, 0xD7}, 13}, /* чив */ + {{0xD7, 0xC9, 0xD3}, 13}, /* вис */ + {{0xCF, 0xD0, 0xCF}, 13}, /* опо */ + {{0xD7, 0xD8, 0xC0}, 13}, /* вью */ + {{0xC1, 0xCC, 0xC1}, 13}, /* ала */ + {{0xCC, 0xC5, 0xCA}, 12}, /* лей */ + {{0xC1, 0xDE, 0xC1}, 12}, /* ача */ + {{0xC5, 0xDA, 0xD7}, 12}, /* езв */ + {{0xD7, 0xC1, 0xD1}, 12}, /* вая */ + {{0xC5, 0xCF, 0xD3}, 12}, /* еос */ + {{0xD1, 0xDD, 0xC9}, 12}, /* ящи */ + {{0xC9, 0xD7, 0xC9}, 12}, /* иви */ + {{0xCE, 0xC5, 0xC5}, 12}, /* нее */ + {{0xD4, 0xD2, 0xD5}, 12}, /* тру */ + {{0xDB, 0xC5, 0xC5}, 12}, /* шее */ + {{0xD3, 0xC1, 0xC8}, 12}, /* сах */ + {{0xC9, 0xCE, 0xC3}, 12}, /* инц */ + {{0xCF, 0xCD, 0xD0}, 12}, /* омп */ + {{0xD5, 0xD6, 0xCF}, 12}, /* ужо */ + {{0xD5, 0xC1, 0xCC}, 12}, /* уал */ + {{0xCE, 0xC1, 0xD4}, 12}, /* нат */ + {{0xC9, 0xC4, 0xD5}, 12}, /* иду */ + {{0xD7, 0xCC, 0xC1}, 12}, /* вла */ + {{0xDA, 0xD7, 0xC1}, 12}, /* зва */ + {{0xCC, 0xC5, 0xC5}, 12}, /* лее */ + {{0xD2, 0xC5, 0xC8}, 12}, /* рех */ + {{0xD6, 0xC4, 0xD5}, 12}, /* жду */ + {{0xCD, 0xC1, 0xCC}, 12}, /* мал */ + {{0xC5, 0xCE, 0xD3}, 12}, /* енс */ + {{0xC9, 0xCA, 0xD3}, 12}, /* ийс */ + {{0xCB, 0xCF, 0xCC}, 12}, /* кол */ + {{0xCE, 0xC1, 0xDA}, 12}, /* наз */ + {{0xC4, 0xD5, 0xC1}, 12}, /* дуа */ + {{0xCF, 0xCE, 0xC9}, 12}, /* они */ + {{0xD3, 0xC5, 0xCD}, 12}, /* сем */ + {{0xC7, 0xCF, 0xC4}, 12}, /* год */ + {{0xCD, 0xC5, 0xD6}, 12}, /* меж */ + {{0xCF, 0xDA, 0xCC}, 12}, /* озл */ + {{0xD7, 0xCD, 0xC5}, 12}, /* вме */ + {{0xD5, 0xC4, 0xC5}, 12}, /* уде */ + {{0xD8, 0xCB, 0xCF}, 12}, /* ько */ + {{0xC5, 0xD7, 0xD9}, 12}, /* евы */ + {{0xDA, 0xC1, 0xCD}, 12}, /* зам */ + {{0xD3, 0xCF, 0xC4}, 12}, /* сод */ + {{0xD2, 0xCF, 0xC5}, 11}, /* рое */ + {{0xCF, 0xD4, 0xC4}, 11}, /* отд */ + {{0xD3, 0xC9, 0xD1}, 11}, /* сия */ + {{0xC9, 0xCB, 0xD5}, 11}, /* ику */ + {{0xD9, 0xCC, 0xC9}, 11}, /* ыли */ + {{0xC7, 0xC9, 0xCD}, 11}, /* гим */ + {{0xCE, 0xD8, 0xDB}, 11}, /* ньш */ + {{0xD4, 0xC9, 0xDE}, 11}, /* тич */ + {{0xD2, 0xC1, 0xCC}, 11}, /* рал */ + {{0xD5, 0xDE, 0xC9}, 11}, /* учи */ + {{0xCD, 0xC5, 0xC0}, 11}, /* мею */ + {{0xD4, 0xC5, 0xCB}, 11}, /* тек */ + {{0xCF, 0xC2, 0xD5}, 11}, /* обу */ + {{0xCE, 0xCE, 0xD5}, 11}, /* нну */ + {{0xCE, 0xC5, 0xD0}, 11}, /* неп */ + {{0xD7, 0xC5, 0xCC}, 11}, /* вел */ + {{0xD4, 0xCD, 0xC5}, 11}, /* тме */ + {{0xC2, 0xCF, 0xC7}, 11}, /* бог */ + {{0xCF, 0xD2, 0xC9}, 11}, /* ори */ + {{0xC1, 0xD7, 0xCE}, 11}, /* авн */ + {{0xC4, 0xC5, 0xC5}, 11}, /* дее */ + {{0xD6, 0xCF, 0xCD}, 11}, /* жом */ + {{0xF7, 0xD2, 0xC5}, 11}, /* Вре */ + {{0xCD, 0xD9, 0xC5}, 11}, /* мые */ + {{0xD8, 0xC3, 0xC1}, 11}, /* ьца */ + {{0xCF, 0xC3, 0xC5}, 11}, /* оце */ + {{0xC9, 0xD4, 0xD9}, 10}, /* иты */ + {{0xDA, 0xD2, 0xC1}, 10}, /* зра */ + {{0xCF, 0xCE, 0xD9}, 10}, /* оны */ + {{0xD2, 0xC5, 0xDB}, 10}, /* реш */ + {{0xD5, 0xDB, 0xC5}, 10}, /* уше */ + {{0xD2, 0xC5, 0xD7}, 10}, /* рев */ + {{0xCF, 0xD0, 0xD5}, 10}, /* опу */ + {{0xD1, 0xD4, 0xD9}, 10}, /* яты */ + {{0xD4, 0xC1, 0xDE}, 10}, /* тач */ + {{0xC5, 0xD2, 0xCF}, 10}, /* еро */ + {{0xD7, 0xCB, 0xCC}, 10}, /* вкл */ + {{0xDA, 0xD9, 0xD7}, 10}, /* зыв */ + {{0xC1, 0xD0, 0xD2}, 10}, /* апр */ + {{0xD2, 0xD5, 0xDB}, 10}, /* руш */ + {{0xEF, 0xD4, 0xD7}, 10}, /* Отв */ + {{0xD2, 0xD3, 0xC1}, 10}, /* рса */ + {{0xC5, 0xCB, 0xD4}, 10}, /* ект */ + {{0xCC, 0xC5, 0xCB}, 10}, /* лек */ + {{0xC5, 0xC5, 0xD4}, 10}, /* еет */ + {{0xCF, 0xD0, 0xCC}, 10}, /* опл */ + {{0xD4, 0xDE, 0xC5}, 10}, /* тче */ + {{0xC7, 0xCF, 0xCD}, 10}, /* гом */ + {{0xD4, 0xCF, 0xD6}, 10}, /* тож */ + {{0xCC, 0xC5, 0xDE}, 10}, /* леч */ + {{0xC5, 0xD4, 0xD9}, 10}, /* еты */ + {{0xCF, 0xD6, 0xC9}, 10}, /* ожи */ + {{0xCD, 0xCE, 0xCF}, 10}, /* мно */ + {{0xCD, 0xCF, 0xCA}, 10}, /* мой */ + {{0xC3, 0xC5, 0xCC}, 10}, /* цел */ + {{0xD5, 0xD0, 0xC9}, 10}, /* упи */ + {{0xC1, 0xC5, 0xD7}, 10}, /* аев */ + {{0xD0, 0xCF, 0xCD}, 10}, /* пом */ + {{0xC4, 0xD1, 0xDD}, 10}, /* дящ */ + {{0xD4, 0xD2, 0xC9}, 10}, /* три */ + {{0xDB, 0xC9, 0xC5}, 10}, /* шие */ + {{0xC5, 0xCB, 0xC1}, 10}, /* ека */ + {{0xC5, 0xDB, 0xC5}, 10}, /* еше */ + {{0xDA, 0xC1, 0xC9}, 10}, /* заи */ + {{0xC9, 0xD4, 0xCF}, 10}, /* ито */ + {{0xDA, 0xCE, 0xD9}, 10}, /* зны */ + {{0xCF, 0xD1, 0xCE}, 10}, /* оян */ + {{0xC9, 0xD6, 0xC5}, 10}, /* иже */ + {{0xD7, 0xCE, 0xC5}, 10}, /* вне */ + {{0xD2, 0xD3, 0xD4}, 10}, /* рст */ + {{0xC5, 0xCD, 0xD1}, 10}, /* емя */ + {{0xCE, 0xC1, 0xC9}, 10}, /* наи */ + {{0xD4, 0xCF, 0xCC}, 10}, /* тол */ + {{0xCC, 0xC9, 0xD4}, 10}, /* лит */ + {{0xCF, 0xD3, 0xD2}, 10}, /* оср */ + {{0xD4, 0xC4, 0xC5}, 10}, /* тде */ + {{0xC5, 0xCD, 0xC9}, 10}, /* еми */ + {{0xCD, 0xC5, 0xC5}, 10}, /* мее */ + {{0xD2, 0xD9, 0xC8}, 10}, /* рых */ + {{0xCE, 0xC9, 0xD7}, 10}, /* нив */ + {{0xC5, 0xD2, 0xD5}, 10}, /* еру */ + {{0xDE, 0xC5, 0xCD}, 10}, /* чем */ + {{0xC4, 0xCF, 0xC2}, 10}, /* доб */ + {{0xC5, 0xCC, 0xCF}, 10}, /* ело */ + {{0xC9, 0xCC, 0xD5}, 10}, /* илу */ + {{0xC1, 0xC4, 0xCC}, 10}, /* адл */ + {{0xC9, 0xDE, 0xD4}, 10}, /* ичт */ + {{0xCD, 0xCC, 0xC5}, 10}, /* мле */ +}; + +static const myencoding_trigram_t myencoding_detect_trigrams_index_windows_1251[] = { + {{0xE5, 0xED, 0xE8}, 991}, /* ени */ + {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ + {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ + {{0xED, 0xE8, 0xFF}, 629}, /* ния */ + {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ + {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ + {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ + {{0xE5, 0xED, 0xED}, 499}, /* енн */ + {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ + {{0xE0, 0xED, 0xE8}, 443}, /* ани */ + {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ + {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ + {{0xED, 0xE8, 0xE5}, 419}, /* ние */ + {{0xED, 0xED, 0xEE}, 412}, /* нно */ + {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ + {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ + {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ + {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ + {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ + {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ + {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ + {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ + {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ + {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ + {{0xEF, 0xF0, 0xE8}, 330}, /* при */ + {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ + {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ + {{0xED, 0xE5, 0xED}, 310}, /* нен */ + {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ + {{0xE2, 0xE0, 0xED}, 304}, /* ван */ + {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ + {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ + {{0xEB, 0xE5, 0xED}, 266}, /* лен */ + {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ + {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ + {{0xED, 0xED, 0xFB}, 260}, /* нны */ + {{0xEB, 0xFC, 0xED}, 256}, /* льн */ + {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ + {{0xE8, 0xEB, 0xE8}, 254}, /* или */ + {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ + {{0xE5, 0xE3, 0xEE}, 241}, /* его */ + {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ + {{0xED, 0xEE, 0xF1}, 236}, /* нос */ + {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ + {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ + {{0xF0, 0xE0, 0xED}, 231}, /* ран */ + {{0xED, 0xEE, 0xE3}, 230}, /* ног */ + {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ + {{0xF7, 0xE5, 0xED}, 226}, /* чен */ + {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ + {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ + {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ + {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ + {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ + {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ + {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ + {{0xE7, 0xE0, 0xED}, 194}, /* зан */ + {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ + {{0xF2, 0xF1, 0xFF}, 191}, /* тся */ + {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ + {{0xE0, 0xED, 0xED}, 182}, /* анн */ + {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ + {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ + {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ + {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ + {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ + {{0xEC, 0xE5, 0xED}, 170}, /* мен */ + {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ + {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ + {{0xF0, 0xE5, 0xED}, 167}, /* рен */ + {{0xF9, 0xE5, 0xED}, 165}, /* щен */ + {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ + {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ + {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ + {{0xFF, 0xE7, 0xE0}, 159}, /* яза */ + {{0xE1, 0xFF, 0xE7}, 158}, /* бяз */ + {{0xED, 0xE8, 0xE8}, 153}, /* нии */ + {{0xED, 0xFB, 0xF5}, 153}, /* ных */ + {{0xF2, 0xFC, 0xFF}, 153}, /* тья */ + {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ + {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ + {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ + {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ + {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ + {{0xED, 0xEE, 0xEC}, 144}, /* ном */ + {{0xE4, 0xE5, 0xED}, 144}, /* ден */ + {{0xE0, 0xED, 0xE5}, 142}, /* ане */ + {{0xEA, 0xEE, 0xED}, 141}, /* кон */ + {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ + {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ + {{0xEE, 0xE1, 0xFF}, 140}, /* обя */ + {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ + {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ + {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ + {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ + {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ + {{0xED, 0xFB, 0xEC}, 136}, /* ным */ + {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ + {{0xD1, 0xF2, 0xE0}, 134}, /* Ста */ + {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ + {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ + {{0xE5, 0xEB, 0xFF}, 130}, /* еля */ + {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ + {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ + {{0xF2, 0xEE, 0xFF}, 129}, /* тоя */ + {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ + {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ + {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ + {{0xE2, 0xE5, 0xED}, 127}, /* вен */ + {{0xED, 0xEE, 0xE2}, 127}, /* нов */ + {{0xED, 0xEE, 0xE5}, 126}, /* ное */ + {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ + {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ + {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ + {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ + {{0xE5, 0xED, 0xF2}, 124}, /* ент */ + {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ + {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ + {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ + {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ + {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ + {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ + {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ + {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ + {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ + {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ + {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ + {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ + {{0xEF, 0xF0, 0xEE}, 114}, /* про */ + {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ + {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ + {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ + {{0xF8, 0xE5, 0xED}, 111}, /* шен */ + {{0xF7, 0xE8, 0xED}, 110}, /* чин */ + {{0xED, 0xE0, 0xF1}, 109}, /* нас */ + {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ + {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ + {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ + {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ + {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ + {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ + {{0xF2, 0xEE, 0xEC}, 104}, /* том */ + {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ + {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ + {{0xEE, 0xEB, 0xED}, 102}, /* олн */ + {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ + {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ + {{0xED, 0xEE, 0xE9}, 101}, /* ной */ + {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ + {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ + {{0xED, 0xFB, 0xE5}, 99}, /* ные */ + {{0xE7, 0xED, 0xE0}, 99}, /* зна */ + {{0xE2, 0xEB, 0xFF}, 99}, /* вля */ + {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ + {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ + {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ + {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ + {{0xED, 0xFB, 0xE9}, 96}, /* ный */ + {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ + {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ + {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ + {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ + {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ + {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ + {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ + {{0xE8, 0xED, 0xE5}, 91}, /* ине */ + {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ + {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ + {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ + {{0xED, 0xE8, 0xF2}, 89}, /* нит */ + {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ + {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ + {{0xE6, 0xE5, 0xED}, 87}, /* жен */ + {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ + {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ + {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ + {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ + {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ + {{0xE2, 0xE8, 0xFF}, 85}, /* вия */ + {{0xFF, 0xF9, 0xE5}, 85}, /* яще */ + {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ + {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ + {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ + {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ + {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ + {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ + {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ + {{0xEE, 0xFF, 0xF9}, 82}, /* оящ */ + {{0xE5, 0xED, 0xEE}, 81}, /* ено */ + {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ + {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ + {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ + {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ + {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ + {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ + {{0xE4, 0xE0, 0xED}, 79}, /* дан */ + {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ + {{0xE8, 0xEC, 0xE5}, 78}, /* име */ + {{0xE8, 0xED, 0xEE}, 78}, /* ино */ + {{0xF0, 0xE8, 0xED}, 77}, /* рин */ + {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ + {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ + {{0xF2, 0xE0, 0xEA}, 77}, /* так */ + {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ + {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ + {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ + {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ + {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ + {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ + {{0xFD, 0xF2, 0xEE}, 75}, /* это */ + {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ + {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ + {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ + {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ + {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ + {{0xE0, 0xED, 0xEE}, 72}, /* ано */ + {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ + {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ + {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ + {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ + {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ + {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ + {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ + {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ + {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ + {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ + {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ + {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ + {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ + {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ + {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ + {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ + {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ + {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ + {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ + {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ + {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ + {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ + {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ + {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ + {{0xF2, 0xED, 0xEE}, 65}, /* тно */ + {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ + {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ + {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ + {{0xEE, 0xE7, 0xED}, 64}, /* озн */ + {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ + {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ + {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ + {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ + {{0xED, 0xE8, 0xFE}, 63}, /* нию */ + {{0xEE, 0xED, 0xE5}, 63}, /* оне */ + {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ + {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ + {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ + {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ + {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ + {{0xF1, 0xED, 0xEE}, 61}, /* сно */ + {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ + {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ + {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ + {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ + {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ + {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ + {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ + {{0xF2, 0xE0, 0xED}, 60}, /* тан */ + {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ + {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ + {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ + {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ + {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ + {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ + {{0xFF, 0xF2, 0xE5}, 60}, /* яте */ + {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ + {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ + {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ + {{0xE0, 0xE1, 0xEE}, 59}, /* або */ + {{0xEB, 0xFF, 0xFE}, 59}, /* ляю */ + {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ + {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ + {{0xE8, 0xED, 0xE8}, 58}, /* ини */ + {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ + {{0xFF, 0xE2, 0xEB}, 58}, /* явл */ + {{0xED, 0xE0, 0xE3}, 57}, /* наг */ + {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ + {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ + {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ + {{0xE8, 0xEE, 0xED}, 57}, /* ион */ + {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ + {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ + {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ + {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ + {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ + {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ + {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ + {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ + {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ + {{0xEB, 0xED, 0xE5}, 54}, /* лне */ + {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ + {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ + {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ + {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ + {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ + {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ + {{0xED, 0xE8, 0xEA}, 54}, /* ник */ + {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ + {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ + {{0xF2, 0xE5, 0xED}, 53}, /* тен */ + {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ + {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ + {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ + {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ + {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ + {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ + {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ + {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ + {{0xFF, 0xFE, 0xF9}, 51}, /* яющ */ + {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ + {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ + {{0xEE, 0xED, 0xEE}, 51}, /* оно */ + {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ + {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ + {{0xEB, 0xFF, 0xE5}, 50}, /* ляе */ + {{0xE5, 0xED, 0xE5}, 50}, /* ене */ + {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ + {{0xEF, 0xF3, 0xED}, 49}, /* пун */ + {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ + {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ + {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ + {{0xED, 0xE5, 0xF1}, 49}, /* нес */ + {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ + {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ + {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ + {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ + {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ + {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ + {{0xF3, 0xED, 0xEA}, 49}, /* унк */ + {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ + {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ + {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ + {{0xFF, 0xE5, 0xF2}, 48}, /* яет */ + {{0xC5, 0xF1, 0xEB}, 48}, /* Есл */ + {{0xCF, 0xF0, 0xE8}, 48}, /* При */ + {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ + {{0xED, 0xE5, 0xF0}, 48}, /* нер */ + {{0xF7, 0xED, 0xEE}, 47}, /* чно */ + {{0xEF, 0xEE, 0xE4}, 47}, /* под */ + {{0xED, 0xF2, 0xE0}, 47}, /* нта */ + {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ + {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ + {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ + {{0xE6, 0xED, 0xEE}, 47}, /* жно */ + {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ + {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ + {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ + {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ + {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ + {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ + {{0xF7, 0xF2, 0xEE}, 46}, /* что */ + {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ + {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ + {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ + {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ + {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ + {{0xE4, 0xEB, 0xFF}, 45}, /* для */ + {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ + {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ + {{0xED, 0xFF, 0xF2}, 44}, /* нят */ + {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ + {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ + {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ + {{0xEE, 0xF1, 0xED}, 43}, /* осн */ + {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ + {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ + {{0xE8, 0xED, 0xFB}, 43}, /* ины */ + {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ + {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ + {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ + {{0xE8, 0xFF, 0xEC}, 43}, /* иям */ + {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ + {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ + {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ + {{0xF7, 0xE0, 0xFF}, 42}, /* чая */ + {{0xED, 0xE8, 0xEC}, 42}, /* ним */ + {{0xE8, 0xE7, 0xED}, 42}, /* изн */ + {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ + {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ + {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ + {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ + {{0xF6, 0xE5, 0xED}, 42}, /* цен */ + {{0xF7, 0xE0, 0xF1}, 42}, /* час */ + {{0xE3, 0xE0, 0xED}, 42}, /* ган */ + {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ + {{0xF1, 0xF2, 0xED}, 42}, /* стн */ + {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ + {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ + {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ + {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ + {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ + {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ + {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ + {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ + {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ + {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ + {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ + {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ + {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ + {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ + {{0xED, 0xF2, 0xE5}, 40}, /* нте */ + {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ + {{0xE1, 0xFB, 0xEB}, 40}, /* был */ + {{0xE8, 0xED, 0xFF}, 40}, /* иня */ + {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ + {{0xE3, 0xE5, 0xED}, 39}, /* ген */ + {{0xCA, 0xEE, 0xE4}, 39}, /* Код */ + {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ + {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ + {{0xE8, 0xED, 0xF2}, 39}, /* инт */ + {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ + {{0xF0, 0xEE, 0xED}, 39}, /* рон */ + {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ + {{0xE4, 0xEE, 0xEA}, 39}, /* док */ + {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ + {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ + {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ + {{0xE7, 0xED, 0xE8}, 38}, /* зни */ + {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ + {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ + {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ + {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ + {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ + {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ + {{0xE1, 0xE5, 0xE7}, 37}, /* без */ + {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ + {{0xEE, 0xF0, 0xFF}, 37}, /* оря */ + {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ + {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ + {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ + {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ + {{0xED, 0xF6, 0xE5}, 37}, /* нце */ + {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ + {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ + {{0xEE, 0xED, 0xE0}, 37}, /* она */ + {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ + {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ + {{0xF0, 0xEE, 0xE4}, 37}, /* род */ + {{0xE5, 0xED, 0xE0}, 37}, /* ена */ + {{0xEE, 0xED, 0xF6}, 37}, /* онц */ + {{0xEE, 0xF2, 0xED}, 37}, /* отн */ + {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ + {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ + {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ + {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ + {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ + {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ + {{0xED, 0xE5, 0xEE}, 36}, /* нео */ + {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ + {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ + {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ + {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ + {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ + {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ + {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ + {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ + {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ + {{0xED, 0xE5, 0xE4}, 34}, /* нед */ + {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ + {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ + {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ + {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ + {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ + {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ + {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ + {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ + {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ + {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ + {{0xFA, 0xFF, 0xE2}, 33}, /* ъяв */ + {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ + {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ + {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ + {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ + {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ + {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ + {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ + {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ + {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ + {{0xE0, 0xED, 0xE0}, 32}, /* ана */ + {{0xED, 0xE0, 0xE4}, 32}, /* над */ + {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ + {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ + {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ + {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ + {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ + {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ + {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ + {{0xFF, 0xF2, 0xFC}, 31}, /* ять */ + {{0xEE, 0xFF, 0xF2}, 31}, /* оят */ + {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ + {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ + {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ + {{0xE5, 0xED, 0xFB}, 31}, /* ены */ + {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ + {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ + {{0xFF, 0xFE, 0xF2}, 30}, /* яют */ + {{0xF0, 0xFF, 0xE4}, 30}, /* ряд */ + {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ + {{0xE8, 0xEC, 0xE0}, 30}, /* има */ + {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ + {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ + {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ + {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ + {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ + {{0xED, 0xE8, 0xE9}, 30}, /* ний */ + {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ + {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ + {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ + {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ + {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ + {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ + {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ + {{0xE4, 0xE5, 0xFF}, 29}, /* дея */ + {{0xE5, 0xFF, 0xF2}, 29}, /* еят */ + {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ + {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ + {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ + {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ + {{0xEE, 0xE4, 0xED}, 28}, /* одн */ + {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ + {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ + {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ + {{0xC4, 0xEE, 0xE3}, 28}, /* Дог */ + {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ + {{0xED, 0xEE, 0xF8}, 28}, /* нош */ + {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ + {{0xE8, 0xED, 0xE0}, 28}, /* ина */ + {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ + {{0xED, 0xE0, 0xEB}, 28}, /* нал */ + {{0xED, 0xE8, 0xE7}, 27}, /* низ */ + {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ + {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ + {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ + {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ + {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ + {{0xE4, 0xED, 0xEE}, 27}, /* дно */ + {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ + {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ + {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ + {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ + {{0xEE, 0xED, 0xEA}, 26}, /* онк */ + {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ + {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ + {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ + {{0xFF, 0xEC, 0xE8}, 26}, /* ями */ + {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ + {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ + {{0xED, 0xEA, 0xF3}, 26}, /* нку */ + {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ + {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ + {{0xED, 0xE8, 0xED}, 25}, /* нин */ + {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ + {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ + {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ + {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ + {{0xE5, 0xF1, 0xFF}, 25}, /* еся */ + {{0xED, 0xE8, 0xF7}, 25}, /* нич */ + {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ + {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ + {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ + {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ + {{0xE6, 0xED, 0xFB}, 25}, /* жны */ + {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ + {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ + {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ + {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ + {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ + {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ + {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ + {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ + {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ + {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ + {{0xE8, 0xFF, 0xF5}, 24}, /* иях */ + {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ + {{0xFC, 0xF1, 0xFF}, 24}, /* ься */ + {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ + {{0xEE, 0xF7, 0xED}, 24}, /* очн */ + {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ + {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ + {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ + {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ + {{0xE0, 0xFF, 0xF5}, 24}, /* аях */ + {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ + {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ + {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ + {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ + {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ + {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ + {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ + {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ + {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ + {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ + {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ + {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ + {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ + {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ + {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ + {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ + {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ + {{0xE1, 0xFA, 0xFF}, 23}, /* бъя */ + {{0xED, 0xE0, 0xF7}, 23}, /* нач */ + {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ + {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ + {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ + {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ + {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ + {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ + {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ + {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ + {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ + {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ + {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ + {{0xED, 0xE5, 0xE7}, 22}, /* нез */ + {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ + {{0xF1, 0xE2, 0xFF}, 22}, /* свя */ + {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ + {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ + {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ + {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ + {{0xED, 0xE5, 0xEC}, 22}, /* нем */ + {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ + {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ + {{0xE2, 0xFF, 0xE7}, 22}, /* вяз */ + {{0xFF, 0xF2, 0xE8}, 22}, /* яти */ + {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ + {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ + {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ + {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ + {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ + {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ + {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ + {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ + {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ + {{0xEA, 0xE0, 0xEA}, 21}, /* как */ + {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ + {{0xED, 0xE0, 0xEC}, 21}, /* нам */ + {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ + {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ + {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ + {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ + {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ + {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ + {{0xE1, 0xE0, 0xED}, 21}, /* бан */ + {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ + {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ + {{0xEB, 0xED, 0xEE}, 21}, /* лно */ + {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ + {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ + {{0xFF, 0xE4, 0xEA}, 21}, /* ядк */ + {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ + {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ + {{0xE0, 0xED, 0xEA}, 21}, /* анк */ + {{0xED, 0xE5, 0xE3}, 21}, /* нег */ + {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ + {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ + {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ + {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ + {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ + {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ + {{0xF2, 0xED, 0xE8}, 21}, /* тни */ + {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ + {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ + {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ + {{0xE0, 0xF0, 0xED}, 20}, /* арн */ + {{0xF7, 0xED, 0xFB}, 20}, /* чны */ + {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ + {{0xF2, 0xE8, 0xFF}, 20}, /* тия */ + {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ + {{0xD1, 0xF2, 0xF0}, 20}, /* Стр */ + {{0xED, 0xF2, 0xEE}, 20}, /* нто */ + {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ + {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ + {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ + {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ + {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ + {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ + {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ + {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ + {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ + {{0xE2, 0xF1, 0xE5}, 19}, /* все */ + {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ + {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ + {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ + {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ + {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ + {{0xE5, 0xE4, 0xED}, 19}, /* едн */ + {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ + {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ + {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ + {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ + {{0xF2, 0xEE, 0xE9}, 19}, /* той */ + {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ + {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ + {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ + {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ + {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ + {{0xE5, 0xED, 0xFF}, 19}, /* еня */ + {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ + {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ + {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ + {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ + {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ + {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ + {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ + {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ + {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ + {{0xE0, 0xE7, 0xED}, 18}, /* азн */ + {{0xF2, 0xED, 0xFB}, 18}, /* тны */ + {{0xEE, 0xE4, 0xFF}, 18}, /* одя */ + {{0xEE, 0xE1, 0xED}, 18}, /* обн */ + {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ + {{0xEE, 0xF1, 0xFF}, 18}, /* ося */ + {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ + {{0xED, 0xFF, 0xFE}, 18}, /* няю */ + {{0xED, 0xE0, 0xF0}, 18}, /* нар */ + {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ + {{0xE0, 0xF1, 0xED}, 18}, /* асн */ + {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ + {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ + {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ + {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ + {{0xED, 0xF6, 0xE8}, 18}, /* нци */ + {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ + {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ + {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ + {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ + {{0xCE, 0xE1, 0xFF}, 18}, /* Обя */ + {{0xCF, 0xF0, 0xE0}, 18}, /* Пра */ + {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ + {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ + {{0xEB, 0xED, 0xE8}, 18}, /* лни */ + {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ + {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ + {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ + {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ + {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ + {{0xF0, 0xED, 0xFB}, 17}, /* рны */ + {{0xE1, 0xED, 0xFB}, 17}, /* бны */ + {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ + {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ + {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ + {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ + {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ + {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ + {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ + {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ + {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ + {{0xE4, 0xE8, 0xE2}, 17}, /* див */ + {{0xED, 0xE0, 0xED}, 17}, /* нан */ + {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ + {{0xE4, 0xED, 0xE5}, 17}, /* дне */ + {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ + {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ + {{0xED, 0xE0, 0xF5}, 17}, /* нах */ + {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ + {{0xE0, 0xEB, 0xE8}, 17}, /* али */ + {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ + {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ + {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ + {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ + {{0xFF, 0xE2, 0xE8}, 16}, /* яви */ + {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ + {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ + {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ + {{0xED, 0xF3, 0xFE}, 16}, /* ную */ + {{0xEF, 0xE5, 0xED}, 16}, /* пен */ + {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ + {{0xEE, 0xED, 0xED}, 16}, /* онн */ + {{0xE2, 0xE8, 0xED}, 16}, /* вин */ + {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ + {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ + {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ + {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ + {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ + {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ + {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ + {{0xCA, 0xEE, 0xEC}, 16}, /* Ком */ + {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ + {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ + {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ + {{0xEF, 0xEE, 0xED}, 16}, /* пон */ + {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ + {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ + {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ + {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ + {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ + {{0xE2, 0xED, 0xEE}, 16}, /* вно */ + {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ + {{0xCB, 0xE8, 0xF6}, 15}, /* Лиц */ + {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ + {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ + {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ + {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ + {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ + {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ + {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ + {{0xC2, 0xEE, 0xE7}, 15}, /* Воз */ + {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ + {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ + {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ + {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ + {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ + {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ + {{0xF2, 0xE0, 0xEC}, 15}, /* там */ + {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ + {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ + {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ + {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ + {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ + {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ + {{0xF1, 0xE5, 0xED}, 15}, /* сен */ + {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ + {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ + {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ + {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ + {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ + {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ + {{0xD5, 0xF0, 0xE0}, 15}, /* Хра */ + {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ + {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ + {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ + {{0xF6, 0xE8, 0xFF}, 14}, /* ция */ + {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ + {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ + {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ + {{0xE0, 0xED, 0xF1}, 14}, /* анс */ + {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ + {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ + {{0xE5, 0xED, 0xFC}, 14}, /* ень */ + {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ + {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ + {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ + {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ + {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ + {{0xE2, 0xFC, 0xFF}, 13}, /* вья */ + {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ + {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ + {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ + {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ + {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ + {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ + {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ + {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ + {{0xFF, 0xE7, 0xE8}, 13}, /* язи */ + {{0xE8, 0xED, 0xE4}, 13}, /* инд */ + {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ + {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ + {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ + {{0xED, 0xE4, 0xE8}, 13}, /* нди */ + {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ + {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ + {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ + {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ + {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ + {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ + {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ + {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ + {{0xFF, 0xE5, 0xEC}, 13}, /* яем */ + {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ + {{0xED, 0xF2, 0xF3}, 13}, /* нту */ + {{0xED, 0xE5, 0xE9}, 13}, /* ней */ + {{0xED, 0xE0, 0xFF}, 13}, /* ная */ + {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ + {{0xF0, 0xED, 0xEE}, 13}, /* рно */ + {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ + {{0xE0, 0xED, 0xFB}, 13}, /* аны */ + {{0xC4, 0xEE, 0xE2}, 13}, /* Дов */ + {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ + {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ + {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ + {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ + {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ + {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ + {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ + {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ + {{0xE2, 0xE0, 0xFF}, 12}, /* вая */ + {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ + {{0xFF, 0xF9, 0xE8}, 12}, /* ящи */ + {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ + {{0xED, 0xE5, 0xE5}, 12}, /* нее */ + {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ + {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ + {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ + {{0xE8, 0xED, 0xF6}, 12}, /* инц */ + {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ + {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ + {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ + {{0xED, 0xE0, 0xF2}, 12}, /* нат */ + {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ + {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ + {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ + {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ + {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ + {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ + {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ + {{0xE5, 0xED, 0xF1}, 12}, /* енс */ + {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ + {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ + {{0xED, 0xE0, 0xE7}, 12}, /* наз */ + {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ + {{0xEE, 0xED, 0xE8}, 12}, /* они */ + {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ + {{0xE3, 0xEE, 0xE4}, 12}, /* год */ + {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ + {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ + {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ + {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ + {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ + {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ + {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ + {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ + {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ + {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ + {{0xF1, 0xE8, 0xFF}, 11}, /* сия */ + {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ + {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ + {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ + {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ + {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ + {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ + {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ + {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ + {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ + {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ + {{0xED, 0xED, 0xF3}, 11}, /* нну */ + {{0xED, 0xE5, 0xEF}, 11}, /* неп */ + {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ + {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ + {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ + {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ + {{0xE0, 0xE2, 0xED}, 11}, /* авн */ + {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ + {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ + {{0xC2, 0xF0, 0xE5}, 11}, /* Вре */ + {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ + {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ + {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ + {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ + {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ + {{0xEE, 0xED, 0xFB}, 10}, /* оны */ + {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ + {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ + {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ + {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ + {{0xFF, 0xF2, 0xFB}, 10}, /* яты */ + {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ + {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ + {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ + {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ + {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ + {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ + {{0xCE, 0xF2, 0xE2}, 10}, /* Отв */ + {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ + {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ + {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ + {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ + {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ + {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ + {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ + {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ + {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ + {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ + {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ + {{0xEC, 0xED, 0xEE}, 10}, /* мно */ + {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ + {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ + {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ + {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ + {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ + {{0xE4, 0xFF, 0xF9}, 10}, /* дящ */ + {{0xF2, 0xF0, 0xE8}, 10}, /* три */ + {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ + {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ + {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ + {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ + {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ + {{0xE7, 0xED, 0xFB}, 10}, /* зны */ + {{0xEE, 0xFF, 0xED}, 10}, /* оян */ + {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ + {{0xE2, 0xED, 0xE5}, 10}, /* вне */ + {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ + {{0xE5, 0xEC, 0xFF}, 10}, /* емя */ + {{0xED, 0xE0, 0xE8}, 10}, /* наи */ + {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ + {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ + {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ + {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ + {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ + {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ + {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ + {{0xED, 0xE8, 0xE2}, 10}, /* нив */ + {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ + {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ + {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ + {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ + {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ + {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ + {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ + {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ +}; + +static const myencoding_trigram_t myencoding_detect_trigrams_index_x_mac_cyrillic[] = { + {{0xE5, 0xED, 0xE8}, 991}, /* ени */ + {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ + {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ + {{0xED, 0xE8, 0xDF}, 629}, /* ния */ + {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ + {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ + {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ + {{0xE5, 0xED, 0xED}, 499}, /* енн */ + {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ + {{0xE0, 0xED, 0xE8}, 443}, /* ани */ + {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ + {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ + {{0xED, 0xE8, 0xE5}, 419}, /* ние */ + {{0xED, 0xED, 0xEE}, 412}, /* нно */ + {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ + {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ + {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ + {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ + {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ + {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ + {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ + {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ + {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ + {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ + {{0xEF, 0xF0, 0xE8}, 330}, /* при */ + {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ + {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ + {{0xED, 0xE5, 0xED}, 310}, /* нен */ + {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ + {{0xE2, 0xE0, 0xED}, 304}, /* ван */ + {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ + {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ + {{0xEB, 0xE5, 0xED}, 266}, /* лен */ + {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ + {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ + {{0xED, 0xED, 0xFB}, 260}, /* нны */ + {{0xEB, 0xFC, 0xED}, 256}, /* льн */ + {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ + {{0xE8, 0xEB, 0xE8}, 254}, /* или */ + {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ + {{0xE5, 0xE3, 0xEE}, 241}, /* его */ + {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ + {{0xED, 0xEE, 0xF1}, 236}, /* нос */ + {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ + {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ + {{0xF0, 0xE0, 0xED}, 231}, /* ран */ + {{0xED, 0xEE, 0xE3}, 230}, /* ног */ + {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ + {{0xF7, 0xE5, 0xED}, 226}, /* чен */ + {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ + {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ + {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ + {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ + {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ + {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ + {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ + {{0xE7, 0xE0, 0xED}, 194}, /* зан */ + {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ + {{0xF2, 0xF1, 0xDF}, 191}, /* тся */ + {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ + {{0xE0, 0xED, 0xED}, 182}, /* анн */ + {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ + {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ + {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ + {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ + {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ + {{0xEC, 0xE5, 0xED}, 170}, /* мен */ + {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ + {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ + {{0xF0, 0xE5, 0xED}, 167}, /* рен */ + {{0xF9, 0xE5, 0xED}, 165}, /* щен */ + {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ + {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ + {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ + {{0xDF, 0xE7, 0xE0}, 159}, /* яза */ + {{0xE1, 0xDF, 0xE7}, 158}, /* бяз */ + {{0xED, 0xE8, 0xE8}, 153}, /* нии */ + {{0xED, 0xFB, 0xF5}, 153}, /* ных */ + {{0xF2, 0xFC, 0xDF}, 153}, /* тья */ + {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ + {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ + {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ + {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ + {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ + {{0xED, 0xEE, 0xEC}, 144}, /* ном */ + {{0xE4, 0xE5, 0xED}, 144}, /* ден */ + {{0xE0, 0xED, 0xE5}, 142}, /* ане */ + {{0xEA, 0xEE, 0xED}, 141}, /* кон */ + {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ + {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ + {{0xEE, 0xE1, 0xDF}, 140}, /* обя */ + {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ + {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ + {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ + {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ + {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ + {{0xED, 0xFB, 0xEC}, 136}, /* ным */ + {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ + {{0x91, 0xF2, 0xE0}, 134}, /* Ста */ + {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ + {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ + {{0xE5, 0xEB, 0xDF}, 130}, /* еля */ + {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ + {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ + {{0xF2, 0xEE, 0xDF}, 129}, /* тоя */ + {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ + {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ + {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ + {{0xE2, 0xE5, 0xED}, 127}, /* вен */ + {{0xED, 0xEE, 0xE2}, 127}, /* нов */ + {{0xED, 0xEE, 0xE5}, 126}, /* ное */ + {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ + {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ + {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ + {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ + {{0xE5, 0xED, 0xF2}, 124}, /* ент */ + {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ + {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ + {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ + {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ + {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ + {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ + {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ + {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ + {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ + {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ + {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ + {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ + {{0xEF, 0xF0, 0xEE}, 114}, /* про */ + {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ + {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ + {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ + {{0xF8, 0xE5, 0xED}, 111}, /* шен */ + {{0xF7, 0xE8, 0xED}, 110}, /* чин */ + {{0xED, 0xE0, 0xF1}, 109}, /* нас */ + {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ + {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ + {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ + {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ + {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ + {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ + {{0xF2, 0xEE, 0xEC}, 104}, /* том */ + {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ + {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ + {{0xEE, 0xEB, 0xED}, 102}, /* олн */ + {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ + {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ + {{0xED, 0xEE, 0xE9}, 101}, /* ной */ + {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ + {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ + {{0xED, 0xFB, 0xE5}, 99}, /* ные */ + {{0xE7, 0xED, 0xE0}, 99}, /* зна */ + {{0xE2, 0xEB, 0xDF}, 99}, /* вля */ + {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ + {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ + {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ + {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ + {{0xED, 0xFB, 0xE9}, 96}, /* ный */ + {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ + {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ + {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ + {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ + {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ + {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ + {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ + {{0xE8, 0xED, 0xE5}, 91}, /* ине */ + {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ + {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ + {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ + {{0xED, 0xE8, 0xF2}, 89}, /* нит */ + {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ + {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ + {{0xE6, 0xE5, 0xED}, 87}, /* жен */ + {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ + {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ + {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ + {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ + {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ + {{0xE2, 0xE8, 0xDF}, 85}, /* вия */ + {{0xDF, 0xF9, 0xE5}, 85}, /* яще */ + {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ + {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ + {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ + {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ + {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ + {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ + {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ + {{0xEE, 0xDF, 0xF9}, 82}, /* оящ */ + {{0xE5, 0xED, 0xEE}, 81}, /* ено */ + {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ + {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ + {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ + {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ + {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ + {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ + {{0xE4, 0xE0, 0xED}, 79}, /* дан */ + {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ + {{0xE8, 0xEC, 0xE5}, 78}, /* име */ + {{0xE8, 0xED, 0xEE}, 78}, /* ино */ + {{0xF0, 0xE8, 0xED}, 77}, /* рин */ + {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ + {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ + {{0xF2, 0xE0, 0xEA}, 77}, /* так */ + {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ + {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ + {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ + {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ + {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ + {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ + {{0xFD, 0xF2, 0xEE}, 75}, /* это */ + {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ + {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ + {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ + {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ + {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ + {{0xE0, 0xED, 0xEE}, 72}, /* ано */ + {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ + {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ + {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ + {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ + {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ + {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ + {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ + {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ + {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ + {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ + {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ + {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ + {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ + {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ + {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ + {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ + {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ + {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ + {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ + {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ + {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ + {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ + {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ + {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ + {{0xF2, 0xED, 0xEE}, 65}, /* тно */ + {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ + {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ + {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ + {{0xEE, 0xE7, 0xED}, 64}, /* озн */ + {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ + {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ + {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ + {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ + {{0xED, 0xE8, 0xFE}, 63}, /* нию */ + {{0xEE, 0xED, 0xE5}, 63}, /* оне */ + {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ + {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ + {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ + {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ + {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ + {{0xF1, 0xED, 0xEE}, 61}, /* сно */ + {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ + {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ + {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ + {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ + {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ + {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ + {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ + {{0xF2, 0xE0, 0xED}, 60}, /* тан */ + {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ + {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ + {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ + {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ + {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ + {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ + {{0xDF, 0xF2, 0xE5}, 60}, /* яте */ + {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ + {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ + {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ + {{0xE0, 0xE1, 0xEE}, 59}, /* або */ + {{0xEB, 0xDF, 0xFE}, 59}, /* ляю */ + {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ + {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ + {{0xE8, 0xED, 0xE8}, 58}, /* ини */ + {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ + {{0xDF, 0xE2, 0xEB}, 58}, /* явл */ + {{0xED, 0xE0, 0xE3}, 57}, /* наг */ + {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ + {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ + {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ + {{0xE8, 0xEE, 0xED}, 57}, /* ион */ + {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ + {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ + {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ + {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ + {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ + {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ + {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ + {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ + {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ + {{0xEB, 0xED, 0xE5}, 54}, /* лне */ + {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ + {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ + {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ + {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ + {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ + {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ + {{0xED, 0xE8, 0xEA}, 54}, /* ник */ + {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ + {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ + {{0xF2, 0xE5, 0xED}, 53}, /* тен */ + {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ + {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ + {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ + {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ + {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ + {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ + {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ + {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ + {{0xDF, 0xFE, 0xF9}, 51}, /* яющ */ + {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ + {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ + {{0xEE, 0xED, 0xEE}, 51}, /* оно */ + {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ + {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ + {{0xEB, 0xDF, 0xE5}, 50}, /* ляе */ + {{0xE5, 0xED, 0xE5}, 50}, /* ене */ + {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ + {{0xEF, 0xF3, 0xED}, 49}, /* пун */ + {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ + {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ + {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ + {{0xED, 0xE5, 0xF1}, 49}, /* нес */ + {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ + {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ + {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ + {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ + {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ + {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ + {{0xF3, 0xED, 0xEA}, 49}, /* унк */ + {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ + {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ + {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ + {{0xDF, 0xE5, 0xF2}, 48}, /* яет */ + {{0x85, 0xF1, 0xEB}, 48}, /* Есл */ + {{0x8F, 0xF0, 0xE8}, 48}, /* При */ + {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ + {{0xED, 0xE5, 0xF0}, 48}, /* нер */ + {{0xF7, 0xED, 0xEE}, 47}, /* чно */ + {{0xEF, 0xEE, 0xE4}, 47}, /* под */ + {{0xED, 0xF2, 0xE0}, 47}, /* нта */ + {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ + {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ + {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ + {{0xE6, 0xED, 0xEE}, 47}, /* жно */ + {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ + {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ + {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ + {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ + {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ + {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ + {{0xF7, 0xF2, 0xEE}, 46}, /* что */ + {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ + {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ + {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ + {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ + {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ + {{0xE4, 0xEB, 0xDF}, 45}, /* для */ + {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ + {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ + {{0xED, 0xDF, 0xF2}, 44}, /* нят */ + {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ + {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ + {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ + {{0xEE, 0xF1, 0xED}, 43}, /* осн */ + {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ + {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ + {{0xE8, 0xED, 0xFB}, 43}, /* ины */ + {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ + {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ + {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ + {{0xE8, 0xDF, 0xEC}, 43}, /* иям */ + {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ + {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ + {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ + {{0xF7, 0xE0, 0xDF}, 42}, /* чая */ + {{0xED, 0xE8, 0xEC}, 42}, /* ним */ + {{0xE8, 0xE7, 0xED}, 42}, /* изн */ + {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ + {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ + {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ + {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ + {{0xF6, 0xE5, 0xED}, 42}, /* цен */ + {{0xF7, 0xE0, 0xF1}, 42}, /* час */ + {{0xE3, 0xE0, 0xED}, 42}, /* ган */ + {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ + {{0xF1, 0xF2, 0xED}, 42}, /* стн */ + {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ + {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ + {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ + {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ + {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ + {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ + {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ + {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ + {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ + {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ + {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ + {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ + {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ + {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ + {{0xED, 0xF2, 0xE5}, 40}, /* нте */ + {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ + {{0xE1, 0xFB, 0xEB}, 40}, /* был */ + {{0xE8, 0xED, 0xDF}, 40}, /* иня */ + {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ + {{0xE3, 0xE5, 0xED}, 39}, /* ген */ + {{0x8A, 0xEE, 0xE4}, 39}, /* Код */ + {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ + {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ + {{0xE8, 0xED, 0xF2}, 39}, /* инт */ + {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ + {{0xF0, 0xEE, 0xED}, 39}, /* рон */ + {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ + {{0xE4, 0xEE, 0xEA}, 39}, /* док */ + {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ + {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ + {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ + {{0xE7, 0xED, 0xE8}, 38}, /* зни */ + {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ + {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ + {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ + {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ + {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ + {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ + {{0xE1, 0xE5, 0xE7}, 37}, /* без */ + {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ + {{0xEE, 0xF0, 0xDF}, 37}, /* оря */ + {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ + {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ + {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ + {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ + {{0xED, 0xF6, 0xE5}, 37}, /* нце */ + {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ + {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ + {{0xEE, 0xED, 0xE0}, 37}, /* она */ + {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ + {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ + {{0xF0, 0xEE, 0xE4}, 37}, /* род */ + {{0xE5, 0xED, 0xE0}, 37}, /* ена */ + {{0xEE, 0xED, 0xF6}, 37}, /* онц */ + {{0xEE, 0xF2, 0xED}, 37}, /* отн */ + {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ + {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ + {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ + {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ + {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ + {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ + {{0xED, 0xE5, 0xEE}, 36}, /* нео */ + {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ + {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ + {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ + {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ + {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ + {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ + {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ + {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ + {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ + {{0xED, 0xE5, 0xE4}, 34}, /* нед */ + {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ + {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ + {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ + {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ + {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ + {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ + {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ + {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ + {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ + {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ + {{0xFA, 0xDF, 0xE2}, 33}, /* ъяв */ + {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ + {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ + {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ + {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ + {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ + {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ + {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ + {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ + {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ + {{0xE0, 0xED, 0xE0}, 32}, /* ана */ + {{0xED, 0xE0, 0xE4}, 32}, /* над */ + {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ + {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ + {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ + {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ + {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ + {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ + {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ + {{0xDF, 0xF2, 0xFC}, 31}, /* ять */ + {{0xEE, 0xDF, 0xF2}, 31}, /* оят */ + {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ + {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ + {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ + {{0xE5, 0xED, 0xFB}, 31}, /* ены */ + {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ + {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ + {{0xDF, 0xFE, 0xF2}, 30}, /* яют */ + {{0xF0, 0xDF, 0xE4}, 30}, /* ряд */ + {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ + {{0xE8, 0xEC, 0xE0}, 30}, /* има */ + {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ + {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ + {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ + {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ + {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ + {{0xED, 0xE8, 0xE9}, 30}, /* ний */ + {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ + {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ + {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ + {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ + {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ + {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ + {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ + {{0xE4, 0xE5, 0xDF}, 29}, /* дея */ + {{0xE5, 0xDF, 0xF2}, 29}, /* еят */ + {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ + {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ + {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ + {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ + {{0xEE, 0xE4, 0xED}, 28}, /* одн */ + {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ + {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ + {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ + {{0x84, 0xEE, 0xE3}, 28}, /* Дог */ + {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ + {{0xED, 0xEE, 0xF8}, 28}, /* нош */ + {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ + {{0xE8, 0xED, 0xE0}, 28}, /* ина */ + {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ + {{0xED, 0xE0, 0xEB}, 28}, /* нал */ + {{0xED, 0xE8, 0xE7}, 27}, /* низ */ + {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ + {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ + {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ + {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ + {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ + {{0xE4, 0xED, 0xEE}, 27}, /* дно */ + {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ + {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ + {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ + {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ + {{0xEE, 0xED, 0xEA}, 26}, /* онк */ + {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ + {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ + {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ + {{0xDF, 0xEC, 0xE8}, 26}, /* ями */ + {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ + {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ + {{0xED, 0xEA, 0xF3}, 26}, /* нку */ + {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ + {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ + {{0xED, 0xE8, 0xED}, 25}, /* нин */ + {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ + {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ + {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ + {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ + {{0xE5, 0xF1, 0xDF}, 25}, /* еся */ + {{0xED, 0xE8, 0xF7}, 25}, /* нич */ + {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ + {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ + {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ + {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ + {{0xE6, 0xED, 0xFB}, 25}, /* жны */ + {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ + {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ + {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ + {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ + {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ + {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ + {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ + {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ + {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ + {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ + {{0xE8, 0xDF, 0xF5}, 24}, /* иях */ + {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ + {{0xFC, 0xF1, 0xDF}, 24}, /* ься */ + {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ + {{0xEE, 0xF7, 0xED}, 24}, /* очн */ + {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ + {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ + {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ + {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ + {{0xE0, 0xDF, 0xF5}, 24}, /* аях */ + {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ + {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ + {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ + {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ + {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ + {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ + {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ + {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ + {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ + {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ + {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ + {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ + {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ + {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ + {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ + {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ + {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ + {{0xE1, 0xFA, 0xDF}, 23}, /* бъя */ + {{0xED, 0xE0, 0xF7}, 23}, /* нач */ + {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ + {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ + {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ + {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ + {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ + {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ + {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ + {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ + {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ + {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ + {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ + {{0xED, 0xE5, 0xE7}, 22}, /* нез */ + {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ + {{0xF1, 0xE2, 0xDF}, 22}, /* свя */ + {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ + {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ + {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ + {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ + {{0xED, 0xE5, 0xEC}, 22}, /* нем */ + {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ + {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ + {{0xE2, 0xDF, 0xE7}, 22}, /* вяз */ + {{0xDF, 0xF2, 0xE8}, 22}, /* яти */ + {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ + {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ + {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ + {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ + {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ + {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ + {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ + {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ + {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ + {{0xEA, 0xE0, 0xEA}, 21}, /* как */ + {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ + {{0xED, 0xE0, 0xEC}, 21}, /* нам */ + {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ + {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ + {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ + {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ + {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ + {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ + {{0xE1, 0xE0, 0xED}, 21}, /* бан */ + {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ + {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ + {{0xEB, 0xED, 0xEE}, 21}, /* лно */ + {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ + {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ + {{0xDF, 0xE4, 0xEA}, 21}, /* ядк */ + {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ + {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ + {{0xE0, 0xED, 0xEA}, 21}, /* анк */ + {{0xED, 0xE5, 0xE3}, 21}, /* нег */ + {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ + {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ + {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ + {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ + {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ + {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ + {{0xF2, 0xED, 0xE8}, 21}, /* тни */ + {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ + {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ + {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ + {{0xE0, 0xF0, 0xED}, 20}, /* арн */ + {{0xF7, 0xED, 0xFB}, 20}, /* чны */ + {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ + {{0xF2, 0xE8, 0xDF}, 20}, /* тия */ + {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ + {{0x91, 0xF2, 0xF0}, 20}, /* Стр */ + {{0xED, 0xF2, 0xEE}, 20}, /* нто */ + {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ + {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ + {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ + {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ + {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ + {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ + {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ + {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ + {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ + {{0xE2, 0xF1, 0xE5}, 19}, /* все */ + {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ + {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ + {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ + {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ + {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ + {{0xE5, 0xE4, 0xED}, 19}, /* едн */ + {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ + {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ + {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ + {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ + {{0xF2, 0xEE, 0xE9}, 19}, /* той */ + {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ + {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ + {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ + {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ + {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ + {{0xE5, 0xED, 0xDF}, 19}, /* еня */ + {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ + {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ + {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ + {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ + {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ + {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ + {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ + {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ + {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ + {{0xE0, 0xE7, 0xED}, 18}, /* азн */ + {{0xF2, 0xED, 0xFB}, 18}, /* тны */ + {{0xEE, 0xE4, 0xDF}, 18}, /* одя */ + {{0xEE, 0xE1, 0xED}, 18}, /* обн */ + {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ + {{0xEE, 0xF1, 0xDF}, 18}, /* ося */ + {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ + {{0xED, 0xDF, 0xFE}, 18}, /* няю */ + {{0xED, 0xE0, 0xF0}, 18}, /* нар */ + {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ + {{0xE0, 0xF1, 0xED}, 18}, /* асн */ + {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ + {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ + {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ + {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ + {{0xED, 0xF6, 0xE8}, 18}, /* нци */ + {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ + {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ + {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ + {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ + {{0x8E, 0xE1, 0xDF}, 18}, /* Обя */ + {{0x8F, 0xF0, 0xE0}, 18}, /* Пра */ + {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ + {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ + {{0xEB, 0xED, 0xE8}, 18}, /* лни */ + {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ + {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ + {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ + {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ + {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ + {{0xF0, 0xED, 0xFB}, 17}, /* рны */ + {{0xE1, 0xED, 0xFB}, 17}, /* бны */ + {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ + {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ + {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ + {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ + {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ + {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ + {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ + {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ + {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ + {{0xE4, 0xE8, 0xE2}, 17}, /* див */ + {{0xED, 0xE0, 0xED}, 17}, /* нан */ + {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ + {{0xE4, 0xED, 0xE5}, 17}, /* дне */ + {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ + {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ + {{0xED, 0xE0, 0xF5}, 17}, /* нах */ + {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ + {{0xE0, 0xEB, 0xE8}, 17}, /* али */ + {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ + {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ + {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ + {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ + {{0xDF, 0xE2, 0xE8}, 16}, /* яви */ + {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ + {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ + {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ + {{0xED, 0xF3, 0xFE}, 16}, /* ную */ + {{0xEF, 0xE5, 0xED}, 16}, /* пен */ + {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ + {{0xEE, 0xED, 0xED}, 16}, /* онн */ + {{0xE2, 0xE8, 0xED}, 16}, /* вин */ + {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ + {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ + {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ + {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ + {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ + {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ + {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ + {{0x8A, 0xEE, 0xEC}, 16}, /* Ком */ + {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ + {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ + {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ + {{0xEF, 0xEE, 0xED}, 16}, /* пон */ + {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ + {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ + {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ + {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ + {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ + {{0xE2, 0xED, 0xEE}, 16}, /* вно */ + {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ + {{0x8B, 0xE8, 0xF6}, 15}, /* Лиц */ + {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ + {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ + {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ + {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ + {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ + {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ + {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ + {{0x82, 0xEE, 0xE7}, 15}, /* Воз */ + {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ + {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ + {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ + {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ + {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ + {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ + {{0xF2, 0xE0, 0xEC}, 15}, /* там */ + {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ + {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ + {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ + {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ + {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ + {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ + {{0xF1, 0xE5, 0xED}, 15}, /* сен */ + {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ + {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ + {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ + {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ + {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ + {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ + {{0x95, 0xF0, 0xE0}, 15}, /* Хра */ + {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ + {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ + {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ + {{0xF6, 0xE8, 0xDF}, 14}, /* ция */ + {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ + {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ + {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ + {{0xE0, 0xED, 0xF1}, 14}, /* анс */ + {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ + {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ + {{0xE5, 0xED, 0xFC}, 14}, /* ень */ + {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ + {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ + {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ + {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ + {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ + {{0xE2, 0xFC, 0xDF}, 13}, /* вья */ + {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ + {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ + {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ + {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ + {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ + {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ + {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ + {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ + {{0xDF, 0xE7, 0xE8}, 13}, /* язи */ + {{0xE8, 0xED, 0xE4}, 13}, /* инд */ + {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ + {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ + {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ + {{0xED, 0xE4, 0xE8}, 13}, /* нди */ + {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ + {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ + {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ + {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ + {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ + {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ + {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ + {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ + {{0xDF, 0xE5, 0xEC}, 13}, /* яем */ + {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ + {{0xED, 0xF2, 0xF3}, 13}, /* нту */ + {{0xED, 0xE5, 0xE9}, 13}, /* ней */ + {{0xED, 0xE0, 0xDF}, 13}, /* ная */ + {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ + {{0xF0, 0xED, 0xEE}, 13}, /* рно */ + {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ + {{0xE0, 0xED, 0xFB}, 13}, /* аны */ + {{0x84, 0xEE, 0xE2}, 13}, /* Дов */ + {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ + {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ + {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ + {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ + {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ + {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ + {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ + {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ + {{0xE2, 0xE0, 0xDF}, 12}, /* вая */ + {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ + {{0xDF, 0xF9, 0xE8}, 12}, /* ящи */ + {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ + {{0xED, 0xE5, 0xE5}, 12}, /* нее */ + {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ + {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ + {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ + {{0xE8, 0xED, 0xF6}, 12}, /* инц */ + {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ + {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ + {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ + {{0xED, 0xE0, 0xF2}, 12}, /* нат */ + {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ + {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ + {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ + {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ + {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ + {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ + {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ + {{0xE5, 0xED, 0xF1}, 12}, /* енс */ + {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ + {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ + {{0xED, 0xE0, 0xE7}, 12}, /* наз */ + {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ + {{0xEE, 0xED, 0xE8}, 12}, /* они */ + {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ + {{0xE3, 0xEE, 0xE4}, 12}, /* год */ + {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ + {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ + {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ + {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ + {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ + {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ + {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ + {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ + {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ + {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ + {{0xF1, 0xE8, 0xDF}, 11}, /* сия */ + {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ + {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ + {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ + {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ + {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ + {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ + {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ + {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ + {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ + {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ + {{0xED, 0xED, 0xF3}, 11}, /* нну */ + {{0xED, 0xE5, 0xEF}, 11}, /* неп */ + {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ + {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ + {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ + {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ + {{0xE0, 0xE2, 0xED}, 11}, /* авн */ + {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ + {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ + {{0x82, 0xF0, 0xE5}, 11}, /* Вре */ + {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ + {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ + {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ + {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ + {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ + {{0xEE, 0xED, 0xFB}, 10}, /* оны */ + {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ + {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ + {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ + {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ + {{0xDF, 0xF2, 0xFB}, 10}, /* яты */ + {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ + {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ + {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ + {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ + {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ + {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ + {{0x8E, 0xF2, 0xE2}, 10}, /* Отв */ + {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ + {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ + {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ + {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ + {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ + {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ + {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ + {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ + {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ + {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ + {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ + {{0xEC, 0xED, 0xEE}, 10}, /* мно */ + {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ + {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ + {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ + {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ + {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ + {{0xE4, 0xDF, 0xF9}, 10}, /* дящ */ + {{0xF2, 0xF0, 0xE8}, 10}, /* три */ + {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ + {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ + {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ + {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ + {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ + {{0xE7, 0xED, 0xFB}, 10}, /* зны */ + {{0xEE, 0xDF, 0xED}, 10}, /* оян */ + {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ + {{0xE2, 0xED, 0xE5}, 10}, /* вне */ + {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ + {{0xE5, 0xEC, 0xDF}, 10}, /* емя */ + {{0xED, 0xE0, 0xE8}, 10}, /* наи */ + {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ + {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ + {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ + {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ + {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ + {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ + {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ + {{0xED, 0xE8, 0xE2}, 10}, /* нив */ + {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ + {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ + {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ + {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ + {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ + {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ + {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ + {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_DETECT_RESOURCE_H */ diff --git a/include/myencoding/encoding.h b/include/myencoding/encoding.h new file mode 100644 index 0000000..e14911c --- /dev/null +++ b/include/myencoding/encoding.h @@ -0,0 +1,160 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_ENCODING_H +#define MyENCODING_ENCODING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include +#include + +struct myencoding_result { + unsigned long first; + unsigned long second; + unsigned long third; + unsigned long result; + unsigned long result_aux; + unsigned long flag; +}; + +struct myencoding_trigram { + const unsigned char trigram[3]; + size_t value; +}; + +struct myencoding_trigram_result { + size_t count; + size_t value; +}; + +struct myencoding_unicode_result { + size_t count_ascii; + size_t count_good; + size_t count_bad; +}; + +struct myencoding_detect_name_entry { + const char* name; + size_t name_length; + const char* label; + size_t label_length; + + myencoding_t encoding; + + size_t next; + size_t curr; +}; + +struct myencoding_detect_attr { + size_t key_begin; + size_t key_length; + size_t value_begin; + size_t value_length; + + myencoding_detect_attr_t *next; +}; + +struct myencoding_entry_name_index { + const char *name; + size_t length; +}; + +typedef myencoding_status_t (*myencoding_custom_f)(unsigned const char data, myencoding_result_t *res); + +myencoding_custom_f myencoding_get_function_by_id(myencoding_t idx); + +myencoding_status_t myencoding_decode_utf_8(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_ibm866(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_2(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_3(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_4(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_5(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_6(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_7(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_8(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_8_i(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_10(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_13(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_14(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_15(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_16(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_koi8_r(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_koi8_u(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_macintosh(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_874(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1250(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1251(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1252(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1253(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1254(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1255(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1256(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1257(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1258(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_x_mac_cyrillic(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_gbk(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_gb18030(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_big5(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_euc_jp(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_2022_jp(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_shift_jis(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_euc_kr(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_shared_utf_16(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_utf_16be(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_utf_16le(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_x_user_defined(unsigned const char data, myencoding_result_t *res); + +size_t myencoding_codepoint_ascii_length(size_t codepoint); +size_t myencoding_ascii_utf_8_length(const unsigned char data); + +size_t myencoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); +size_t myencoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data); +size_t myencoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); +size_t myencoding_ascii_utf_8_to_codepoint(const unsigned char* data, size_t* codepoint); + +void myencoding_result_clean(myencoding_result_t *res); + +bool myencoding_detect(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_russian(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_unicode(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_bom(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_and_cut_bom(const char *text, size_t length, myencoding_t *encoding, const char **new_text, size_t *new_size); + +size_t myencoding_convert_to_ascii_utf_8(mycore_string_raw_t* raw_str, const char* buff, size_t length, myencoding_t encoding); + +const myencoding_detect_name_entry_t * myencoding_name_entry_by_name(const char* name, size_t length); +bool myencoding_by_name(const char *name, size_t length, myencoding_t *encoding); +const char * myencoding_name_by_id(myencoding_t encoding, size_t *length); + +bool myencoding_extracting_character_encoding_from_charset(const char *data, size_t data_size, myencoding_t *encoding); +myencoding_t myencoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_ENCODING_H */ diff --git a/include/myencoding/myosi.h b/include/myencoding/myosi.h new file mode 100644 index 0000000..5c2296e --- /dev/null +++ b/include/myencoding/myosi.h @@ -0,0 +1,114 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_MYOSI_H +#define MyENCODING_MYOSI_H +#pragma once + +#include + +#define MyENCODING_VERSION_MAJOR 0 +#define MyENCODING_VERSION_MINOR 1 +#define MyENCODING_VERSION_PATCH 0 + +#define MyENCODING_VERSION_STRING MyCORE_STR(MyENCODING_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyENCODING_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyENCODING_VERSION_PATCH) + +#ifdef __cplusplus +extern "C" { +#endif + +// encoding +// https://encoding.spec.whatwg.org/#the-encoding +// https://encoding.spec.whatwg.org/#legacy-single-byte-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(simplified)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(traditional)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-japanese-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-korean-encodings +// https://encoding.spec.whatwg.org/#legacy-miscellaneous-encodings + +enum myencoding_list { + MyENCODING_DEFAULT = 0x00, + //MyENCODING_AUTO = 0x01, // future + MyENCODING_NOT_DETERMINED = 0x02, + MyENCODING_UTF_8 = 0x00, // default encoding + MyENCODING_UTF_16LE = 0x04, + MyENCODING_UTF_16BE = 0x05, + MyENCODING_X_USER_DEFINED = 0x06, + MyENCODING_BIG5 = 0x07, + MyENCODING_EUC_JP = 0x08, + MyENCODING_EUC_KR = 0x09, + MyENCODING_GB18030 = 0x0a, + MyENCODING_GBK = 0x0b, + MyENCODING_IBM866 = 0x0c, + MyENCODING_ISO_2022_JP = 0x0d, + MyENCODING_ISO_8859_10 = 0x0e, + MyENCODING_ISO_8859_13 = 0x0f, + MyENCODING_ISO_8859_14 = 0x10, + MyENCODING_ISO_8859_15 = 0x11, + MyENCODING_ISO_8859_16 = 0x12, + MyENCODING_ISO_8859_2 = 0x13, + MyENCODING_ISO_8859_3 = 0x14, + MyENCODING_ISO_8859_4 = 0x15, + MyENCODING_ISO_8859_5 = 0x16, + MyENCODING_ISO_8859_6 = 0x17, + MyENCODING_ISO_8859_7 = 0x18, + MyENCODING_ISO_8859_8 = 0x19, + MyENCODING_ISO_8859_8_I = 0x1a, + MyENCODING_KOI8_R = 0x1b, + MyENCODING_KOI8_U = 0x1c, + MyENCODING_MACINTOSH = 0x1d, + MyENCODING_SHIFT_JIS = 0x1e, + MyENCODING_WINDOWS_1250 = 0x1f, + MyENCODING_WINDOWS_1251 = 0x20, + MyENCODING_WINDOWS_1252 = 0x21, + MyENCODING_WINDOWS_1253 = 0x22, + MyENCODING_WINDOWS_1254 = 0x23, + MyENCODING_WINDOWS_1255 = 0x24, + MyENCODING_WINDOWS_1256 = 0x25, + MyENCODING_WINDOWS_1257 = 0x26, + MyENCODING_WINDOWS_1258 = 0x27, + MyENCODING_WINDOWS_874 = 0x28, + MyENCODING_X_MAC_CYRILLIC = 0x29, + MyENCODING_LAST_ENTRY = 0x2a +} +typedef myencoding_t; + +enum myencoding_status { + MyENCODING_STATUS_OK = 0x0000, + MyENCODING_STATUS_ERROR = 0x0001, + MyENCODING_STATUS_CONTINUE = 0x0002, + MyENCODING_STATUS_DONE = 0x0004 +} +typedef myencoding_status_t; + +typedef struct myencoding_result myencoding_result_t; +typedef struct myencoding_trigram myencoding_trigram_t; +typedef struct myencoding_trigram_result myencoding_trigram_result_t; +typedef struct myencoding_unicode_result myencoding_unicode_result_t; +typedef struct myencoding_detect_name_entry myencoding_detect_name_entry_t; +typedef struct myencoding_detect_attr myencoding_detect_attr_t; +typedef struct myencoding_entry_name_index myencoding_entry_name_index_t; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_MYOSI_H */ + diff --git a/include/myencoding/mystring.h b/include/myencoding/mystring.h new file mode 100644 index 0000000..771b0ef --- /dev/null +++ b/include/myencoding/mystring.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_MYSTRING_H +#define MyENCODING_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include + +void myencoding_string_append(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding); + +/* append with convert encoding */ +void myencoding_string_append_chunk(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding); +void myencoding_string_append_one(mycore_string_t* str, myencoding_result_t* res, const char data, myencoding_t encoding); + +/* append with convert encoding lowercase */ +void myencoding_string_append_lowercase_ascii(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding); +void myencoding_string_append_chunk_lowercase_ascii(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_MYSTRING_H */ diff --git a/include/myencoding/resource.h b/include/myencoding/resource.h new file mode 100644 index 0000000..9c8e845 --- /dev/null +++ b/include/myencoding/resource.h @@ -0,0 +1,9377 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include + +#ifndef MyENCODING_RESOURCE_H +#define MyENCODING_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +static const unsigned long myencoding_map_big5[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 17392, 19506, 17923, 17830, 17784, 160359, 19831, 17843, + 162993, 19682, 163013, 15253, 18230, 18244, 19527, 19520, 148159, 144919, + 160594, 159371, 159954, 19543, 172881, 18255, 17882, 19589, 162924, 19719, + 19108, 18081, 158499, 29221, 154196, 137827, 146950, 147297, 26189, 22267, + 0x0000, 32149, 22813, 166841, 15860, 38708, 162799, 23515, 138590, 23204, + 13861, 171696, 23249, 23479, 23804, 26478, 34195, 170309, 29793, 29853, + 14453, 138579, 145054, 155681, 16108, 153822, 15093, 31484, 40855, 147809, + 166157, 143850, 133770, 143966, 17162, 33924, 40854, 37935, 18736, 34323, + 22678, 38730, 37400, 31184, 31282, 26208, 27177, 34973, 29772, 31685, + 26498, 31276, 21071, 36934, 13542, 29636, 155065, 29894, 40903, 22451, + 18735, 21580, 16689, 145038, 22552, 31346, 162661, 35727, 18094, 159368, + 16769, 155033, 31662, 140476, 40904, 140481, 140489, 140492, 40905, 34052, + 144827, 16564, 40906, 17633, 175615, 25281, 28782, 40907, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12736, + 12737, 12738, 12739, 12740, 131340, 12741, 131281, 131277, 12742, 12743, + 131275, 139240, 12744, 131274, 12745, 12746, 12747, 12748, 131342, 12749, + 12750, 256, 193, 461, 192, 274, 201, 282, 200, 332, + 211, 465, 210, 0x0000, 7870, 0x0000, 7872, 202, 257, 225, + 462, 224, 593, 275, 233, 283, 232, 299, 237, 464, + 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, + 472, 474, 476, 252, 0x0000, 7871, 0x0000, 7873, 234, 609, + 9178, 9179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 172969, 135493, 0x0000, 25866, + 0x0000, 0x0000, 20029, 28381, 40270, 37343, 0x0000, 0x0000, 161589, 25745, + 20250, 20264, 20392, 20822, 20852, 20892, 20964, 21153, 21160, 21307, + 21326, 21457, 21464, 22242, 22768, 22788, 22791, 22834, 22836, 23398, + 23454, 23455, 23706, 24198, 24635, 25993, 26622, 26628, 26725, 27982, + 28860, 30005, 32420, 32428, 32442, 32455, 32463, 32479, 32518, 32567, + 33402, 33487, 33647, 35270, 35774, 35810, 36710, 36711, 36718, 29713, + 31996, 32205, 26950, 31433, 21031, 0x0000, 0x0000, 0x0000, 0x0000, 37260, + 30904, 37214, 32956, 0x0000, 36107, 33014, 133607, 0x0000, 0x0000, 32927, + 40647, 19661, 40393, 40460, 19518, 171510, 159758, 40458, 172339, 13761, + 0x0000, 28314, 33342, 29977, 0x0000, 18705, 39532, 39567, 40857, 31111, + 164972, 138698, 132560, 142054, 20004, 20097, 20096, 20103, 20159, 20203, + 20279, 13388, 20413, 15944, 20483, 20616, 13437, 13459, 13477, 20870, + 22789, 20955, 20988, 20997, 20105, 21113, 21136, 21287, 13767, 21417, + 13649, 21424, 13651, 21442, 21539, 13677, 13682, 13953, 21651, 21667, + 21684, 21689, 21712, 21743, 21784, 21795, 21800, 13720, 21823, 13733, + 13759, 21975, 13765, 163204, 21797, 0x0000, 134210, 134421, 151851, 21904, + 142534, 14828, 131905, 36422, 150968, 169189, 16467, 164030, 30586, 142392, + 14900, 18389, 164189, 158194, 151018, 25821, 134524, 135092, 134357, 135412, + 25741, 36478, 134806, 134155, 135012, 142505, 164438, 148691, 0x0000, 134470, + 170573, 164073, 18420, 151207, 142530, 39602, 14951, 169460, 16365, 13574, + 152263, 169940, 161992, 142660, 40302, 38933, 0x0000, 17369, 155813, 25780, + 21731, 142668, 142282, 135287, 14843, 135279, 157402, 157462, 162208, 25834, + 151634, 134211, 36456, 139681, 166732, 132913, 0x0000, 18443, 131497, 16378, + 22643, 142733, 0x0000, 148936, 132348, 155799, 134988, 134550, 21881, 16571, + 17338, 0x0000, 19124, 141926, 135325, 33194, 39157, 134556, 25465, 14846, + 141173, 36288, 22177, 25724, 15939, 0x0000, 173569, 134665, 142031, 142537, + 0x0000, 135368, 145858, 14738, 14854, 164507, 13688, 155209, 139463, 22098, + 134961, 142514, 169760, 13500, 27709, 151099, 0x0000, 0x0000, 161140, 142987, + 139784, 173659, 167117, 134778, 134196, 157724, 32659, 135375, 141315, 141625, + 13819, 152035, 134796, 135053, 134826, 16275, 134960, 134471, 135503, 134732, + 0x0000, 134827, 134057, 134472, 135360, 135485, 16377, 140950, 25650, 135085, + 144372, 161337, 142286, 134526, 134527, 142417, 142421, 14872, 134808, 135367, + 134958, 173618, 158544, 167122, 167321, 167114, 38314, 21708, 33476, 21945, + 0x0000, 171715, 39974, 39606, 161630, 142830, 28992, 33133, 33004, 23580, + 157042, 33076, 14231, 21343, 164029, 37302, 134906, 134671, 134775, 134907, + 13789, 151019, 13833, 134358, 22191, 141237, 135369, 134672, 134776, 135288, + 135496, 164359, 136277, 134777, 151120, 142756, 23124, 135197, 135198, 135413, + 135414, 22428, 134673, 161428, 164557, 135093, 134779, 151934, 14083, 135094, + 135552, 152280, 172733, 149978, 137274, 147831, 164476, 22681, 21096, 13850, + 153405, 31666, 23400, 18432, 19244, 40743, 18919, 39967, 39821, 154484, + 143677, 22011, 13810, 22153, 20008, 22786, 138177, 194680, 38737, 131206, + 20059, 20155, 13630, 23587, 24401, 24516, 14586, 25164, 25909, 27514, + 27701, 27706, 28780, 29227, 20012, 29357, 149737, 32594, 31035, 31993, + 32595, 156266, 13505, 0x0000, 156491, 32770, 32896, 157202, 158033, 21341, + 34916, 35265, 161970, 35744, 36125, 38021, 38264, 38271, 38376, 167439, + 38886, 39029, 39118, 39134, 39267, 170000, 40060, 40479, 40644, 27503, + 63751, 20023, 131207, 38429, 25143, 38050, 0x0000, 20539, 28158, 171123, + 40870, 15817, 34959, 147790, 28791, 23797, 19232, 152013, 13657, 154928, + 24866, 166450, 36775, 37366, 29073, 26393, 29626, 144001, 172295, 15499, + 137600, 19216, 30948, 29698, 20910, 165647, 16393, 27235, 172730, 16931, + 34319, 133743, 31274, 170311, 166634, 38741, 28749, 21284, 139390, 37876, + 30425, 166371, 40871, 30685, 20131, 20464, 20668, 20015, 20247, 40872, + 21556, 32139, 22674, 22736, 138678, 24210, 24217, 24514, 141074, 25995, + 144377, 26905, 27203, 146531, 27903, 0x0000, 29184, 148741, 29580, 16091, + 150035, 23317, 29881, 35715, 154788, 153237, 31379, 31724, 31939, 32364, + 33528, 34199, 40873, 34960, 40874, 36537, 40875, 36815, 34143, 39392, + 37409, 40876, 167353, 136255, 16497, 17058, 23066, 0x0000, 0x0000, 0x0000, + 39016, 26475, 17014, 22333, 0x0000, 34262, 149883, 33471, 160013, 19585, + 159092, 23931, 158485, 159678, 40877, 40878, 23446, 40879, 26343, 32347, + 28247, 31178, 15752, 17603, 143958, 141206, 17306, 17718, 0x0000, 23765, + 146202, 35577, 23672, 15634, 144721, 23928, 40882, 29015, 17752, 147692, + 138787, 19575, 14712, 13386, 131492, 158785, 35532, 20404, 131641, 22975, + 33132, 38998, 170234, 24379, 134047, 0x0000, 139713, 166253, 16642, 18107, + 168057, 16135, 40883, 172469, 16632, 14294, 18167, 158790, 16764, 165554, + 160767, 17773, 14548, 152730, 17761, 17691, 19849, 19579, 19830, 17898, + 16328, 150287, 13921, 17630, 17597, 16877, 23870, 23880, 23894, 15868, + 14351, 23972, 23993, 14368, 14392, 24130, 24253, 24357, 24451, 14600, + 14612, 14655, 14669, 24791, 24893, 23781, 14729, 25015, 25017, 25039, + 14776, 25132, 25232, 25317, 25368, 14840, 22193, 14851, 25570, 25595, + 25607, 25690, 14923, 25792, 23829, 22049, 40863, 14999, 25990, 15037, + 26111, 26195, 15090, 26258, 15138, 26390, 15170, 26532, 26624, 15192, + 26698, 26756, 15218, 15217, 15227, 26889, 26947, 29276, 26980, 27039, + 27013, 15292, 27094, 15325, 27237, 27252, 27249, 27266, 15340, 27289, + 15346, 27307, 27317, 27348, 27382, 27521, 27585, 27626, 27765, 27818, + 15563, 27906, 27910, 27942, 28033, 15599, 28068, 28081, 28181, 28184, + 28201, 28294, 166336, 28347, 28386, 28378, 40831, 28392, 28393, 28452, + 28468, 15686, 147265, 28545, 28606, 15722, 15733, 29111, 23705, 15754, + 28716, 15761, 28752, 28756, 28783, 28799, 28809, 131877, 17345, 13809, + 134872, 147159, 22462, 159443, 28990, 153568, 13902, 27042, 166889, 23412, + 31305, 153825, 169177, 31333, 31357, 154028, 31419, 31408, 31426, 31427, + 29137, 156813, 16842, 31450, 31453, 31466, 16879, 21682, 154625, 31499, + 31573, 31529, 152334, 154878, 31650, 31599, 33692, 154548, 158847, 31696, + 33825, 31634, 31672, 154912, 15789, 154725, 33938, 31738, 31750, 31797, + 154817, 31812, 31875, 149634, 31910, 26237, 148856, 31945, 31943, 31974, + 31860, 31987, 31989, 31950, 32359, 17693, 159300, 32093, 159446, 29837, + 32137, 32171, 28981, 32179, 32210, 147543, 155689, 32228, 15635, 32245, + 137209, 32229, 164717, 32285, 155937, 155994, 32366, 32402, 17195, 37996, + 32295, 32576, 32577, 32583, 31030, 156368, 39393, 32663, 156497, 32675, + 136801, 131176, 17756, 145254, 17667, 164666, 32762, 156809, 32773, 32776, + 32797, 32808, 32815, 172167, 158915, 32827, 32828, 32865, 141076, 18825, + 157222, 146915, 157416, 26405, 32935, 166472, 33031, 33050, 22704, 141046, + 27775, 156824, 151480, 25831, 136330, 33304, 137310, 27219, 150117, 150165, + 17530, 33321, 133901, 158290, 146814, 20473, 136445, 34018, 33634, 158474, + 149927, 144688, 137075, 146936, 33450, 26907, 194964, 16859, 34123, 33488, + 33562, 134678, 137140, 14017, 143741, 144730, 33403, 33506, 33560, 147083, + 159139, 158469, 158615, 144846, 15807, 33565, 21996, 33669, 17675, 159141, + 33708, 33729, 33747, 13438, 159444, 27223, 34138, 13462, 159298, 143087, + 33880, 154596, 33905, 15827, 17636, 27303, 33866, 146613, 31064, 33960, + 158614, 159351, 159299, 34014, 33807, 33681, 17568, 33939, 34020, 154769, + 16960, 154816, 17731, 34100, 23282, 159385, 17703, 34163, 17686, 26559, + 34326, 165413, 165435, 34241, 159880, 34306, 136578, 159949, 194994, 17770, + 34344, 13896, 137378, 21495, 160666, 34430, 34673, 172280, 34798, 142375, + 34737, 34778, 34831, 22113, 34412, 26710, 17935, 34885, 34886, 161248, + 146873, 161252, 34910, 34972, 18011, 34996, 34997, 25537, 35013, 30583, + 161551, 35207, 35210, 35238, 35241, 35239, 35260, 166437, 35303, 162084, + 162493, 35484, 30611, 37374, 35472, 162393, 31465, 162618, 147343, 18195, + 162616, 29052, 35596, 35615, 152624, 152933, 35647, 35660, 35661, 35497, + 150138, 35728, 35739, 35503, 136927, 17941, 34895, 35995, 163156, 163215, + 195028, 14117, 163155, 36054, 163224, 163261, 36114, 36099, 137488, 36059, + 28764, 36113, 150729, 16080, 36215, 36265, 163842, 135188, 149898, 15228, + 164284, 160012, 31463, 36525, 36534, 36547, 37588, 36633, 36653, 164709, + 164882, 36773, 37635, 172703, 133712, 36787, 18730, 166366, 165181, 146875, + 24312, 143970, 36857, 172052, 165564, 165121, 140069, 14720, 159447, 36919, + 165180, 162494, 36961, 165228, 165387, 37032, 165651, 37060, 165606, 37038, + 37117, 37223, 15088, 37289, 37316, 31916, 166195, 138889, 37390, 27807, + 37441, 37474, 153017, 37561, 166598, 146587, 166668, 153051, 134449, 37676, + 37739, 166625, 166891, 28815, 23235, 166626, 166629, 18789, 37444, 166892, + 166969, 166911, 37747, 37979, 36540, 38277, 38310, 37926, 38304, 28662, + 17081, 140922, 165592, 135804, 146990, 18911, 27676, 38523, 38550, 16748, + 38563, 159445, 25050, 38582, 30965, 166624, 38589, 21452, 18849, 158904, + 131700, 156688, 168111, 168165, 150225, 137493, 144138, 38705, 34370, 38710, + 18959, 17725, 17797, 150249, 28789, 23361, 38683, 38748, 168405, 38743, + 23370, 168427, 38751, 37925, 20688, 143543, 143548, 38793, 38815, 38833, + 38846, 38848, 38866, 38880, 152684, 38894, 29724, 169011, 38911, 38901, + 168989, 162170, 19153, 38964, 38963, 38987, 39014, 15118, 160117, 15697, + 132656, 147804, 153350, 39114, 39095, 39112, 39111, 19199, 159015, 136915, + 21936, 39137, 39142, 39148, 37752, 39225, 150057, 19314, 170071, 170245, + 39413, 39436, 39483, 39440, 39512, 153381, 14020, 168113, 170965, 39648, + 39650, 170757, 39668, 19470, 39700, 39725, 165376, 20532, 39732, 158120, + 14531, 143485, 39760, 39744, 171326, 23109, 137315, 39822, 148043, 39938, + 39935, 39948, 171624, 40404, 171959, 172434, 172459, 172257, 172323, 172511, + 40318, 40323, 172340, 40462, 26760, 40388, 139611, 172435, 172576, 137531, + 172595, 40249, 172217, 172724, 40592, 40597, 40606, 40610, 19764, 40618, + 40623, 148324, 40641, 15200, 14821, 15645, 20274, 14270, 166955, 40706, + 40712, 19350, 37924, 159138, 40727, 40726, 40761, 22175, 22154, 40773, + 39352, 168075, 38898, 33919, 40802, 40809, 31452, 40846, 29206, 19390, + 149877, 149947, 29047, 150008, 148296, 150097, 29598, 166874, 137466, 31135, + 166270, 167478, 37737, 37875, 166468, 37612, 37761, 37835, 166252, 148665, + 29207, 16107, 30578, 31299, 28880, 148595, 148472, 29054, 137199, 28835, + 137406, 144793, 16071, 137349, 152623, 137208, 14114, 136955, 137273, 14049, + 137076, 137425, 155467, 14115, 136896, 22363, 150053, 136190, 135848, 136134, + 136374, 34051, 145062, 34051, 33877, 149908, 160101, 146993, 152924, 147195, + 159826, 17652, 145134, 170397, 159526, 26617, 14131, 15381, 15847, 22636, + 137506, 26640, 16471, 145215, 147681, 147595, 147727, 158753, 21707, 22174, + 157361, 22162, 135135, 134056, 134669, 37830, 166675, 37788, 20216, 20779, + 14361, 148534, 20156, 132197, 131967, 20299, 20362, 153169, 23144, 131499, + 132043, 14745, 131850, 132116, 13365, 20265, 131776, 167603, 131701, 35546, + 131596, 20120, 20685, 20749, 20386, 20227, 150030, 147082, 20290, 20526, + 20588, 20609, 20428, 20453, 20568, 20732, 20825, 20827, 20829, 20830, + 28278, 144789, 147001, 147135, 28018, 137348, 147081, 20904, 20931, 132576, + 17629, 132259, 132242, 132241, 36218, 166556, 132878, 21081, 21156, 133235, + 21217, 37742, 18042, 29068, 148364, 134176, 149932, 135396, 27089, 134685, + 29817, 16094, 29849, 29716, 29782, 29592, 19342, 150204, 147597, 21456, + 13700, 29199, 147657, 21940, 131909, 21709, 134086, 22301, 37469, 38644, + 37734, 22493, 22413, 22399, 13886, 22731, 23193, 166470, 136954, 137071, + 136976, 23084, 22968, 37519, 23166, 23247, 23058, 153926, 137715, 137313, + 148117, 14069, 27909, 29763, 23073, 155267, 23169, 166871, 132115, 37856, + 29836, 135939, 28933, 18802, 37896, 166395, 37821, 14240, 23582, 23710, + 24158, 24136, 137622, 137596, 146158, 24269, 23375, 137475, 137476, 14081, + 137376, 14045, 136958, 14035, 33066, 166471, 138682, 144498, 166312, 24332, + 24334, 137511, 137131, 23147, 137019, 23364, 34324, 161277, 34912, 24702, + 141408, 140843, 24539, 16056, 140719, 140734, 168072, 159603, 25024, 131134, + 131142, 140827, 24985, 24984, 24693, 142491, 142599, 149204, 168269, 25713, + 149093, 142186, 14889, 142114, 144464, 170218, 142968, 25399, 173147, 25782, + 25393, 25553, 149987, 142695, 25252, 142497, 25659, 25963, 26994, 15348, + 143502, 144045, 149897, 144043, 21773, 144096, 137433, 169023, 26318, 144009, + 143795, 15072, 16784, 152964, 166690, 152975, 136956, 152923, 152613, 30958, + 143619, 137258, 143924, 13412, 143887, 143746, 148169, 26254, 159012, 26219, + 19347, 26160, 161904, 138731, 26211, 144082, 144097, 26142, 153714, 14545, + 145466, 145340, 15257, 145314, 144382, 29904, 15254, 26511, 149034, 26806, + 26654, 15300, 27326, 14435, 145365, 148615, 27187, 27218, 27337, 27397, + 137490, 25873, 26776, 27212, 15319, 27258, 27479, 147392, 146586, 37792, + 37618, 166890, 166603, 37513, 163870, 166364, 37991, 28069, 28427, 149996, + 28007, 147327, 15759, 28164, 147516, 23101, 28170, 22599, 27940, 30786, + 28987, 148250, 148086, 28913, 29264, 29319, 29332, 149391, 149285, 20857, + 150180, 132587, 29818, 147192, 144991, 150090, 149783, 155617, 16134, 16049, + 150239, 166947, 147253, 24743, 16115, 29900, 29756, 37767, 29751, 17567, + 159210, 17745, 30083, 16227, 150745, 150790, 16216, 30037, 30323, 173510, + 15129, 29800, 166604, 149931, 149902, 15099, 15821, 150094, 16127, 149957, + 149747, 37370, 22322, 37698, 166627, 137316, 20703, 152097, 152039, 30584, + 143922, 30478, 30479, 30587, 149143, 145281, 14942, 149744, 29752, 29851, + 16063, 150202, 150215, 16584, 150166, 156078, 37639, 152961, 30750, 30861, + 30856, 30930, 29648, 31065, 161601, 153315, 16654, 31131, 33942, 31141, + 27181, 147194, 31290, 31220, 16750, 136934, 16690, 37429, 31217, 134476, + 149900, 131737, 146874, 137070, 13719, 21867, 13680, 13994, 131540, 134157, + 31458, 23129, 141045, 154287, 154268, 23053, 131675, 30960, 23082, 154566, + 31486, 16889, 31837, 31853, 16913, 154547, 155324, 155302, 31949, 150009, + 137136, 31886, 31868, 31918, 27314, 32220, 32263, 32211, 32590, 156257, + 155996, 162632, 32151, 155266, 17002, 158581, 133398, 26582, 131150, 144847, + 22468, 156690, 156664, 149858, 32733, 31527, 133164, 154345, 154947, 31500, + 155150, 39398, 34373, 39523, 27164, 144447, 14818, 150007, 157101, 39455, + 157088, 33920, 160039, 158929, 17642, 33079, 17410, 32966, 33033, 33090, + 157620, 39107, 158274, 33378, 33381, 158289, 33875, 159143, 34320, 160283, + 23174, 16767, 137280, 23339, 137377, 23268, 137432, 34464, 195004, 146831, + 34861, 160802, 23042, 34926, 20293, 34951, 35007, 35046, 35173, 35149, + 153219, 35156, 161669, 161668, 166901, 166873, 166812, 166393, 16045, 33955, + 18165, 18127, 14322, 35389, 35356, 169032, 24397, 37419, 148100, 26068, + 28969, 28868, 137285, 40301, 35999, 36073, 163292, 22938, 30659, 23024, + 17262, 14036, 36394, 36519, 150537, 36656, 36682, 17140, 27736, 28603, + 140065, 18587, 28537, 28299, 137178, 39913, 14005, 149807, 37051, 37015, + 21873, 18694, 37307, 37892, 166475, 16482, 166652, 37927, 166941, 166971, + 34021, 35371, 38297, 38311, 38295, 38294, 167220, 29765, 16066, 149759, + 150082, 148458, 16103, 143909, 38543, 167655, 167526, 167525, 16076, 149997, + 150136, 147438, 29714, 29803, 16124, 38721, 168112, 26695, 18973, 168083, + 153567, 38749, 37736, 166281, 166950, 166703, 156606, 37562, 23313, 35689, + 18748, 29689, 147995, 38811, 38769, 39224, 134950, 24001, 166853, 150194, + 38943, 169178, 37622, 169431, 37349, 17600, 166736, 150119, 166756, 39132, + 166469, 16128, 37418, 18725, 33812, 39227, 39245, 162566, 15869, 39323, + 19311, 39338, 39516, 166757, 153800, 27279, 39457, 23294, 39471, 170225, + 19344, 170312, 39356, 19389, 19351, 37757, 22642, 135938, 22562, 149944, + 136424, 30788, 141087, 146872, 26821, 15741, 37976, 14631, 24912, 141185, + 141675, 24839, 40015, 40019, 40059, 39989, 39952, 39807, 39887, 171565, + 39839, 172533, 172286, 40225, 19630, 147716, 40472, 19632, 40204, 172468, + 172269, 172275, 170287, 40357, 33981, 159250, 159711, 158594, 34300, 17715, + 159140, 159364, 159216, 33824, 34286, 159232, 145367, 155748, 31202, 144796, + 144960, 18733, 149982, 15714, 37851, 37566, 37704, 131775, 30905, 37495, + 37965, 20452, 13376, 36964, 152925, 30781, 30804, 30902, 30795, 137047, + 143817, 149825, 13978, 20338, 28634, 28633, 28702, 28702, 21524, 147893, + 22459, 22771, 22410, 40214, 22487, 28980, 13487, 147884, 29163, 158784, + 151447, 23336, 137141, 166473, 24844, 23246, 23051, 17084, 148616, 14124, + 19323, 166396, 37819, 37816, 137430, 134941, 33906, 158912, 136211, 148218, + 142374, 148417, 22932, 146871, 157505, 32168, 155995, 155812, 149945, 149899, + 166394, 37605, 29666, 16105, 29876, 166755, 137375, 16097, 150195, 27352, + 29683, 29691, 16086, 150078, 150164, 137177, 150118, 132007, 136228, 149989, + 29768, 149782, 28837, 149878, 37508, 29670, 37727, 132350, 37681, 166606, + 166422, 37766, 166887, 153045, 18741, 166530, 29035, 149827, 134399, 22180, + 132634, 134123, 134328, 21762, 31172, 137210, 32254, 136898, 150096, 137298, + 17710, 37889, 14090, 166592, 149933, 22960, 137407, 137347, 160900, 23201, + 14050, 146779, 14000, 37471, 23161, 166529, 137314, 37748, 15565, 133812, + 19094, 14730, 20724, 15721, 15692, 136092, 29045, 17147, 164376, 28175, + 168164, 17643, 27991, 163407, 28775, 27823, 15574, 147437, 146989, 28162, + 28428, 15727, 132085, 30033, 14012, 13512, 18048, 16090, 18545, 22980, + 37486, 18750, 36673, 166940, 158656, 22546, 22472, 14038, 136274, 28926, + 148322, 150129, 143331, 135856, 140221, 26809, 26983, 136088, 144613, 162804, + 145119, 166531, 145366, 144378, 150687, 27162, 145069, 158903, 33854, 17631, + 17614, 159014, 159057, 158850, 159710, 28439, 160009, 33597, 137018, 33773, + 158848, 159827, 137179, 22921, 23170, 137139, 23137, 23153, 137477, 147964, + 14125, 23023, 137020, 14023, 29070, 37776, 26266, 148133, 23150, 23083, + 148115, 27179, 147193, 161590, 148571, 148170, 28957, 148057, 166369, 20400, + 159016, 23746, 148686, 163405, 148413, 27148, 148054, 135940, 28838, 28979, + 148457, 15781, 27871, 194597, 150095, 32357, 23019, 23855, 15859, 24412, + 150109, 137183, 32164, 33830, 21637, 146170, 144128, 131604, 22398, 133333, + 132633, 16357, 139166, 172726, 28675, 168283, 23920, 29583, 31955, 166489, + 168992, 20424, 32743, 29389, 29456, 162548, 29496, 29497, 153334, 29505, + 29512, 16041, 162584, 36972, 29173, 149746, 29665, 33270, 16074, 30476, + 16081, 27810, 22269, 29721, 29726, 29727, 16098, 16112, 16116, 16122, + 29907, 16142, 16211, 30018, 30061, 30066, 30093, 16252, 30152, 30172, + 16320, 30285, 16343, 30324, 16348, 30330, 151388, 29064, 22051, 35200, + 22633, 16413, 30531, 16441, 26465, 16453, 13787, 30616, 16490, 16495, + 23646, 30654, 30667, 22770, 30744, 28857, 30748, 16552, 30777, 30791, + 30801, 30822, 33864, 152885, 31027, 26627, 31026, 16643, 16649, 31121, + 31129, 36795, 31238, 36796, 16743, 31377, 16818, 31420, 33401, 16836, + 31439, 31451, 16847, 20001, 31586, 31596, 31611, 31762, 31771, 16992, + 17018, 31867, 31900, 17036, 31928, 17044, 31981, 36755, 28864, 134351, + 32207, 32212, 32208, 32253, 32686, 32692, 29343, 17303, 32800, 32805, + 31545, 32814, 32817, 32852, 15820, 22452, 28832, 32951, 33001, 17389, + 33036, 29482, 33038, 33042, 30048, 33044, 17409, 15161, 33110, 33113, + 33114, 17427, 22586, 33148, 33156, 17445, 33171, 17453, 33189, 22511, + 33217, 33252, 33364, 17551, 33446, 33398, 33482, 33496, 33535, 17584, + 33623, 38505, 27018, 33797, 28917, 33892, 24803, 33928, 17668, 33982, + 34017, 34040, 34064, 34104, 34130, 17723, 34159, 34160, 34272, 17783, + 34418, 34450, 34482, 34543, 38469, 34699, 17926, 17943, 34990, 35071, + 35108, 35143, 35217, 162151, 35369, 35384, 35476, 35508, 35921, 36052, + 36082, 36124, 18328, 22623, 36291, 18413, 20206, 36410, 21976, 22356, + 36465, 22005, 36528, 18487, 36558, 36578, 36580, 36589, 36594, 36791, + 36801, 36810, 36812, 36915, 39364, 18605, 39136, 37395, 18718, 37416, + 37464, 37483, 37553, 37550, 37567, 37603, 37611, 37619, 37620, 37629, + 37699, 37764, 37805, 18757, 18769, 40639, 37911, 21249, 37917, 37933, + 37950, 18794, 37972, 38009, 38189, 38306, 18855, 38388, 38451, 18917, + 26528, 18980, 38720, 18997, 38834, 38850, 22100, 19172, 24808, 39097, + 19225, 39153, 22596, 39182, 39193, 20916, 39196, 39223, 39234, 39261, + 39266, 19312, 39365, 19357, 39484, 39695, 31363, 39785, 39809, 39901, + 39921, 39924, 19565, 39968, 14191, 138178, 40265, 39994, 40702, 22096, + 40339, 40381, 40384, 40444, 38134, 36790, 40571, 40620, 40625, 40637, + 40646, 38108, 40674, 40689, 40696, 31432, 40772, 131220, 131767, 132000, + 26906, 38083, 22956, 132311, 22592, 38081, 14265, 132565, 132629, 132726, + 136890, 22359, 29043, 133826, 133837, 134079, 21610, 194619, 134091, 21662, + 134139, 134203, 134227, 134245, 134268, 24807, 134285, 22138, 134325, 134365, + 134381, 134511, 134578, 134600, 26965, 39983, 34725, 134660, 134670, 134871, + 135056, 134957, 134771, 23584, 135100, 24075, 135260, 135247, 135286, 26398, + 135291, 135304, 135318, 13895, 135359, 135379, 135471, 135483, 21348, 33965, + 135907, 136053, 135990, 35713, 136567, 136729, 137155, 137159, 20088, 28859, + 137261, 137578, 137773, 137797, 138282, 138352, 138412, 138952, 25283, 138965, + 139029, 29080, 26709, 139333, 27113, 14024, 139900, 140247, 140282, 141098, + 141425, 141647, 33533, 141671, 141715, 142037, 35237, 142056, 36768, 142094, + 38840, 142143, 38983, 39613, 142412, 0x0000, 142472, 142519, 154600, 142600, + 142610, 142775, 142741, 142914, 143220, 143308, 143411, 143462, 144159, 144350, + 24497, 26184, 26303, 162425, 144743, 144883, 29185, 149946, 30679, 144922, + 145174, 32391, 131910, 22709, 26382, 26904, 146087, 161367, 155618, 146961, + 147129, 161278, 139418, 18640, 19128, 147737, 166554, 148206, 148237, 147515, + 148276, 148374, 150085, 132554, 20946, 132625, 22943, 138920, 15294, 146687, + 148484, 148694, 22408, 149108, 14747, 149295, 165352, 170441, 14178, 139715, + 35678, 166734, 39382, 149522, 149755, 150037, 29193, 150208, 134264, 22885, + 151205, 151430, 132985, 36570, 151596, 21135, 22335, 29041, 152217, 152601, + 147274, 150183, 21948, 152646, 152686, 158546, 37332, 13427, 152895, 161330, + 152926, 18200, 152930, 152934, 153543, 149823, 153693, 20582, 13563, 144332, + 24798, 153859, 18300, 166216, 154286, 154505, 154630, 138640, 22433, 29009, + 28598, 155906, 162834, 36950, 156082, 151450, 35682, 156674, 156746, 23899, + 158711, 36662, 156804, 137500, 35562, 150006, 156808, 147439, 156946, 19392, + 157119, 157365, 141083, 37989, 153569, 24981, 23079, 194765, 20411, 22201, + 148769, 157436, 20074, 149812, 38486, 28047, 158909, 13848, 35191, 157593, + 157806, 156689, 157790, 29151, 157895, 31554, 168128, 133649, 157990, 37124, + 158009, 31301, 40432, 158202, 39462, 158253, 13919, 156777, 131105, 31107, + 158260, 158555, 23852, 144665, 33743, 158621, 18128, 158884, 30011, 34917, + 159150, 22710, 14108, 140685, 159819, 160205, 15444, 160384, 160389, 37505, + 139642, 160395, 37680, 160486, 149968, 27705, 38047, 160848, 134904, 34855, + 35061, 141606, 164979, 137137, 28344, 150058, 137248, 14756, 14009, 23568, + 31203, 17727, 26294, 171181, 170148, 35139, 161740, 161880, 22230, 16607, + 136714, 14753, 145199, 164072, 136133, 29101, 33638, 162269, 168360, 23143, + 19639, 159919, 166315, 162301, 162314, 162571, 163174, 147834, 31555, 31102, + 163849, 28597, 172767, 27139, 164632, 21410, 159239, 37823, 26678, 38749, + 164207, 163875, 158133, 136173, 143919, 163912, 23941, 166960, 163971, 22293, + 38947, 166217, 23979, 149896, 26046, 27093, 21458, 150181, 147329, 15377, + 26422, 163984, 164084, 164142, 139169, 164175, 164233, 164271, 164378, 164614, + 164655, 164746, 13770, 164968, 165546, 18682, 25574, 166230, 30728, 37461, + 166328, 17394, 166375, 17375, 166376, 166726, 166868, 23032, 166921, 36619, + 167877, 168172, 31569, 168208, 168252, 15863, 168286, 150218, 36816, 29327, + 22155, 169191, 169449, 169392, 169400, 169778, 170193, 170313, 170346, 170435, + 170536, 170766, 171354, 171419, 32415, 171768, 171811, 19620, 38215, 172691, + 29090, 172799, 19857, 36882, 173515, 19868, 134300, 36798, 21953, 36794, + 140464, 36793, 150163, 17673, 32383, 28502, 27313, 20202, 13540, 166700, + 161949, 14138, 36480, 137205, 163876, 166764, 166809, 162366, 157359, 15851, + 161365, 146615, 153141, 153942, 20122, 155265, 156248, 22207, 134765, 36366, + 23405, 147080, 150686, 25566, 25296, 137206, 137339, 25904, 22061, 154698, + 21530, 152337, 15814, 171416, 19581, 22050, 22046, 32585, 155352, 22901, + 146752, 34672, 19996, 135146, 134473, 145082, 33047, 40286, 36120, 30267, + 40005, 30286, 30649, 37701, 21554, 33096, 33527, 22053, 33074, 33816, + 32957, 21994, 31074, 22083, 21526, 134813, 13774, 22021, 22001, 26353, + 164578, 13869, 30004, 22000, 21946, 21655, 21874, 134209, 134294, 24272, + 151880, 134774, 142434, 134818, 40619, 32090, 21982, 135285, 25245, 38765, + 21652, 36045, 29174, 37238, 25596, 25529, 25598, 21865, 142147, 40050, + 143027, 20890, 13535, 134567, 20903, 21581, 21790, 21779, 30310, 36397, + 157834, 30129, 32950, 34820, 34694, 35015, 33206, 33820, 135361, 17644, + 29444, 149254, 23440, 33547, 157843, 22139, 141044, 163119, 147875, 163187, + 159440, 160438, 37232, 135641, 37384, 146684, 173737, 134828, 134905, 29286, + 138402, 18254, 151490, 163833, 135147, 16634, 40029, 25887, 142752, 18675, + 149472, 171388, 135148, 134666, 24674, 161187, 135149, 0x0000, 155720, 135559, + 29091, 32398, 40272, 19994, 19972, 13687, 23309, 27826, 21351, 13996, + 14812, 21373, 13989, 149016, 22682, 150382, 33325, 21579, 22442, 154261, + 133497, 0x0000, 14930, 140389, 29556, 171692, 19721, 39917, 146686, 171824, + 19547, 151465, 169374, 171998, 33884, 146870, 160434, 157619, 145184, 25390, + 32037, 147191, 146988, 14890, 36872, 21196, 15988, 13946, 17897, 132238, + 30272, 23280, 134838, 30842, 163630, 22695, 16575, 22140, 39819, 23924, + 30292, 173108, 40581, 19681, 30201, 14331, 24857, 143578, 148466, 0x0000, + 22109, 135849, 22439, 149859, 171526, 21044, 159918, 13741, 27722, 40316, + 31830, 39737, 22494, 137068, 23635, 25811, 169168, 156469, 160100, 34477, + 134440, 159010, 150242, 134513, 0x0000, 20990, 139023, 23950, 38659, 138705, + 40577, 36940, 31519, 39682, 23761, 31651, 25192, 25397, 39679, 31695, + 39722, 31870, 39726, 31810, 31878, 39957, 31740, 39689, 40727, 39963, + 149822, 40794, 21875, 23491, 20477, 40600, 20466, 21088, 15878, 21201, + 22375, 20566, 22967, 24082, 38856, 40363, 36700, 21609, 38836, 39232, + 38842, 21292, 24880, 26924, 21466, 39946, 40194, 19515, 38465, 27008, + 20646, 30022, 137069, 39386, 21107, 0x0000, 37209, 38529, 37212, 0x0000, + 37201, 167575, 25471, 159011, 27338, 22033, 37262, 30074, 25221, 132092, + 29519, 31856, 154657, 146685, 0x0000, 149785, 30422, 39837, 20010, 134356, + 33726, 34882, 0x0000, 23626, 27072, 20717, 22394, 21023, 24053, 20174, + 27697, 131570, 20281, 21660, 21722, 21146, 36226, 13822, 24332, 13811, + 0x0000, 27474, 37244, 40869, 39831, 38958, 39092, 39610, 40616, 40580, + 29050, 31508, 0x0000, 27642, 34840, 32632, 0x0000, 22048, 173642, 36471, + 40787, 0x0000, 36308, 36431, 40476, 36353, 25218, 164733, 36392, 36469, + 31443, 150135, 31294, 30936, 27882, 35431, 30215, 166490, 40742, 27854, + 34774, 30147, 172722, 30803, 194624, 36108, 29410, 29553, 35629, 29442, + 29937, 36075, 150203, 34351, 24506, 34976, 17591, 0x0000, 137275, 159237, + 0x0000, 35454, 140571, 0x0000, 24829, 30311, 39639, 40260, 37742, 39823, + 34805, 0x0000, 34831, 36087, 29484, 38689, 39856, 13782, 29362, 19463, + 31825, 39242, 155993, 24921, 19460, 40598, 24957, 0x0000, 22367, 24943, + 25254, 25145, 25294, 14940, 25058, 21418, 144373, 25444, 26626, 13778, + 23895, 166850, 36826, 167481, 0x0000, 20697, 138566, 30982, 21298, 38456, + 134971, 16485, 0x0000, 30718, 0x0000, 31938, 155418, 31962, 31277, 32870, + 32867, 32077, 29957, 29938, 35220, 33306, 26380, 32866, 160902, 32859, + 29936, 33027, 30500, 35209, 157644, 30035, 159441, 34729, 34766, 33224, + 34700, 35401, 36013, 35651, 30507, 29944, 34010, 13877, 27058, 36262, + 0x0000, 35241, 29800, 28089, 34753, 147473, 29927, 15835, 29046, 24740, + 24988, 15569, 29026, 24695, 0x0000, 32625, 166701, 29264, 24809, 19326, + 21024, 15384, 146631, 155351, 161366, 152881, 137540, 135934, 170243, 159196, + 159917, 23745, 156077, 166415, 145015, 131310, 157766, 151310, 17762, 23327, + 156492, 40784, 40614, 156267, 12288, 65292, 12289, 12290, 65294, 8231, + 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65105, 65106, + 183, 65108, 65109, 65110, 65111, 65372, 8211, 65073, 8212, 65075, + 9588, 65076, 65103, 65288, 65289, 65077, 65078, 65371, 65373, 65079, + 65080, 12308, 12309, 65081, 65082, 12304, 12305, 65083, 65084, 12298, + 12299, 65085, 65086, 12296, 12297, 65087, 65088, 12300, 12301, 65089, + 65090, 12302, 12303, 65091, 65092, 65113, 65114, 65115, 65116, 65117, + 65118, 8216, 8217, 8220, 8221, 12317, 12318, 8245, 8242, 65283, + 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, + 9734, 9733, 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, + 175, 65507, 65343, 717, 65097, 65098, 65101, 65102, 65099, 65100, + 65119, 65120, 65121, 65291, 65293, 215, 247, 177, 8730, 65308, + 65310, 65309, 8806, 8807, 8800, 8734, 8786, 8801, 65122, 65123, + 65124, 65125, 65126, 65374, 8745, 8746, 8869, 8736, 8735, 8895, + 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 8853, 8857, + 8593, 8595, 8592, 8594, 8598, 8599, 8601, 8600, 8741, 8739, + 65295, 65340, 8725, 65128, 65284, 65509, 12306, 65504, 65505, 65285, + 65312, 8451, 8457, 65129, 65130, 65131, 13269, 13212, 13213, 13214, + 13262, 13217, 13198, 13199, 13252, 176, 20825, 20827, 20830, 20829, + 20833, 20835, 21991, 29929, 31950, 9601, 9602, 9603, 9604, 9605, + 9606, 9607, 9608, 9615, 9614, 9613, 9612, 9611, 9610, 9609, + 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, + 9488, 9492, 9496, 9581, 9582, 9584, 9583, 9552, 9566, 9578, + 9569, 9698, 9699, 9701, 9700, 9585, 9586, 9587, 65296, 65297, + 65298, 65299, 65300, 65301, 65302, 65303, 65304, 65305, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 12321, 12322, + 12323, 12324, 12325, 12326, 12327, 12328, 12329, 21313, 21316, 21317, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 65345, 65346, 65347, 65348, + 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, + 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, + 65369, 65370, 913, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, + 932, 933, 934, 935, 936, 937, 945, 946, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, + 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, + 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, + 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, + 12579, 12580, 12581, 12582, 12583, 12584, 12585, 729, 713, 714, + 711, 715, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, + 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, + 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, + 9244, 9245, 9246, 9247, 9249, 8364, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 19968, 20057, 19969, 19971, 20035, + 20061, 20102, 20108, 20154, 20799, 20837, 20843, 20960, 20992, 20993, + 21147, 21269, 21313, 21340, 21448, 19977, 19979, 19976, 19978, 20011, + 20024, 20961, 20037, 20040, 20063, 20062, 20110, 20129, 20800, 20995, + 21242, 21315, 21449, 21475, 22303, 22763, 22805, 22823, 22899, 23376, + 23377, 23379, 23544, 23567, 23586, 23608, 23665, 24029, 24037, 24049, + 24050, 24051, 24062, 24178, 24318, 24331, 24339, 25165, 19985, 19984, + 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, 20117, 20114, + 20116, 20130, 20161, 20160, 20163, 20166, 20167, 20173, 20170, 20171, + 20164, 20803, 20801, 20839, 20845, 20846, 20844, 20887, 20982, 20998, + 20999, 21000, 21243, 21246, 21247, 21270, 21305, 21320, 21319, 21317, + 21342, 21380, 21451, 21450, 21453, 22764, 22825, 22827, 22826, 22829, + 23380, 23569, 23588, 23610, 23663, 24052, 24187, 24319, 24340, 24341, + 24515, 25096, 25142, 25163, 25166, 25903, 25991, 26007, 26020, 26041, + 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27595, 27604, 27611, + 27663, 27700, 28779, 29226, 29238, 29243, 29255, 29273, 29275, 29356, + 29579, 19993, 19990, 19989, 19988, 19992, 20027, 20045, 20047, 20046, + 20197, 20184, 20180, 20181, 20182, 20183, 20195, 20196, 20185, 20190, + 20805, 20804, 20873, 20874, 20908, 20985, 20986, 20984, 21002, 21152, + 21151, 21253, 21254, 21271, 21277, 20191, 21322, 21321, 21345, 21344, + 21359, 21358, 21435, 21487, 21476, 21491, 21484, 21486, 21481, 21480, + 21500, 21496, 21493, 21483, 21478, 21482, 21490, 21489, 21488, 21477, + 21485, 21499, 22235, 22234, 22806, 22830, 22833, 22900, 22902, 23381, + 23427, 23612, 24040, 24039, 24038, 24066, 24067, 24179, 24188, 24321, + 24344, 24343, 24517, 25098, 25171, 25172, 25170, 25169, 26021, 26086, + 26414, 26412, 26410, 26411, 26413, 27491, 27597, 27665, 27664, 27704, + 27713, 27712, 27710, 29359, 29572, 29577, 29916, 29926, 29976, 29983, + 29992, 29993, 30000, 30001, 30002, 30003, 30091, 30333, 30382, 30399, + 30446, 30683, 30690, 30707, 31034, 31166, 31348, 31435, 19998, 19999, + 20050, 20051, 20073, 20121, 20132, 20134, 20133, 20223, 20233, 20249, + 20234, 20245, 20237, 20240, 20241, 20239, 20210, 20214, 20219, 20208, + 20211, 20221, 20225, 20235, 20809, 20807, 20806, 20808, 20840, 20849, + 20877, 20912, 21015, 21009, 21010, 21006, 21014, 21155, 21256, 21281, + 21280, 21360, 21361, 21513, 21519, 21516, 21514, 21520, 21505, 21515, + 21508, 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, + 22237, 22323, 22320, 22312, 22317, 22316, 22319, 22313, 22809, 22810, + 22839, 22840, 22916, 22904, 22915, 22909, 22905, 22914, 22913, 23383, + 23384, 23431, 23432, 23429, 23433, 23546, 23574, 23673, 24030, 24070, + 24182, 24180, 24335, 24347, 24537, 24534, 25102, 25100, 25101, 25104, + 25187, 25179, 25176, 25910, 26089, 26088, 26092, 26093, 26354, 26355, + 26377, 26429, 26420, 26417, 26421, 27425, 27492, 27515, 27670, 27741, + 27735, 27737, 27743, 27744, 27728, 27733, 27745, 27739, 27725, 27726, + 28784, 29279, 29277, 30334, 31481, 31859, 31992, 32566, 32650, 32701, + 32769, 32771, 32780, 32786, 32819, 32895, 32905, 32907, 32908, 33251, + 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33406, 34411, + 34880, 34892, 34915, 35199, 38433, 20018, 20136, 20301, 20303, 20295, + 20311, 20318, 20276, 20315, 20309, 20272, 20304, 20305, 20285, 20282, + 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, 20302, + 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, 20918, + 20919, 21029, 21028, 21033, 21034, 21032, 21163, 21161, 21162, 21164, + 21283, 21363, 21365, 21533, 21549, 21534, 21566, 21542, 21582, 21543, + 21574, 21571, 21555, 21576, 21570, 21531, 21545, 21578, 21561, 21563, + 21560, 21550, 21557, 21558, 21536, 21564, 21568, 21553, 21547, 21535, + 21548, 22250, 22256, 22244, 22251, 22346, 22353, 22336, 22349, 22343, + 22350, 22334, 22352, 22351, 22331, 22767, 22846, 22941, 22930, 22952, + 22942, 22947, 22937, 22934, 22925, 22948, 22931, 22922, 22949, 23389, + 23388, 23386, 23387, 23436, 23435, 23439, 23596, 23616, 23617, 23615, + 23614, 23696, 23697, 23700, 23692, 24043, 24076, 24207, 24199, 24202, + 24311, 24324, 24351, 24420, 24418, 24439, 24441, 24536, 24524, 24535, + 24525, 24561, 24555, 24568, 24554, 25106, 25105, 25220, 25239, 25238, + 25216, 25206, 25225, 25197, 25226, 25212, 25214, 25209, 25203, 25234, + 25199, 25240, 25198, 25237, 25235, 25233, 25222, 25913, 25915, 25912, + 26097, 26356, 26463, 26446, 26447, 26448, 26449, 26460, 26454, 26462, + 26441, 26438, 26464, 26451, 26455, 27493, 27599, 27714, 27742, 27801, + 27777, 27784, 27785, 27781, 27803, 27754, 27770, 27792, 27760, 27788, + 27752, 27798, 27794, 27773, 27779, 27762, 27774, 27764, 27782, 27766, + 27789, 27796, 27800, 27778, 28790, 28796, 28797, 28792, 29282, 29281, + 29280, 29380, 29378, 29590, 29996, 29995, 30007, 30008, 30338, 30447, + 30691, 31169, 31168, 31167, 31350, 31995, 32597, 32918, 32915, 32925, + 32920, 32923, 32922, 32946, 33391, 33426, 33419, 33421, 35211, 35282, + 35328, 35895, 35910, 35925, 35997, 36196, 36208, 36275, 36523, 36554, + 36763, 36784, 36802, 36806, 36805, 36804, 24033, 37009, 37026, 37034, + 37030, 37027, 37193, 37318, 37324, 38450, 38446, 38449, 38442, 38444, + 20006, 20054, 20083, 20107, 20123, 20126, 20139, 20140, 20335, 20381, + 20365, 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, + 20360, 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, + 20821, 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, + 21050, 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, + 21329, 21350, 21367, 21368, 21369, 21462, 21460, 21463, 21619, 21621, + 21654, 21624, 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, + 21648, 21617, 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, + 22266, 22403, 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, + 22857, 22855, 22856, 22852, 22868, 22974, 22971, 22996, 22969, 22958, + 22993, 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, + 22981, 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, + 23578, 23624, 23621, 23622, 23735, 23713, 23736, 23721, 23723, 23729, + 23731, 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, + 24220, 24213, 24214, 24310, 24358, 24359, 24361, 24448, 24449, 24447, + 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, + 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, + 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, + 25298, 25307, 25259, 25299, 25300, 25291, 25288, 25256, 25277, 25276, + 25296, 25305, 25287, 25293, 25269, 25306, 25265, 25304, 25302, 25303, + 25286, 25260, 25294, 25918, 26023, 26044, 26106, 26132, 26131, 26124, + 26118, 26114, 26126, 26112, 26127, 26133, 26122, 26119, 26381, 26379, + 26477, 26507, 26517, 26481, 26524, 26483, 26487, 26503, 26525, 26519, + 26479, 26480, 26495, 26505, 26494, 26512, 26485, 26522, 26515, 26492, + 26474, 26482, 27427, 27494, 27495, 27519, 27667, 27675, 27875, 27880, + 27891, 27825, 27852, 27877, 27827, 27837, 27838, 27836, 27874, 27819, + 27861, 27859, 27832, 27844, 27833, 27841, 27822, 27863, 27845, 27889, + 27839, 27835, 27873, 27867, 27850, 27820, 27887, 27868, 27862, 27872, + 28821, 28814, 28818, 28810, 28825, 29228, 29229, 29240, 29256, 29287, + 29289, 29376, 29390, 29401, 29399, 29392, 29609, 29608, 29599, 29611, + 29605, 30013, 30109, 30105, 30106, 30340, 30402, 30450, 30452, 30693, + 30717, 31038, 31040, 31041, 31177, 31176, 31354, 31353, 31482, 31998, + 32596, 32652, 32651, 32773, 32954, 32933, 32930, 32945, 32929, 32939, + 32937, 32948, 32938, 32943, 33253, 33278, 33293, 33459, 33437, 33433, + 33453, 33469, 33439, 33465, 33457, 33452, 33445, 33455, 33464, 33443, + 33456, 33470, 33463, 34382, 34417, 21021, 34920, 36555, 36814, 36820, + 36817, 37045, 37048, 37041, 37046, 37319, 37329, 38263, 38272, 38428, + 38464, 38463, 38459, 38468, 38466, 38585, 38632, 38738, 38750, 20127, + 20141, 20142, 20449, 20405, 20399, 20415, 20448, 20433, 20431, 20445, + 20419, 20406, 20440, 20447, 20426, 20439, 20398, 20432, 20420, 20418, + 20442, 20430, 20446, 20407, 20823, 20882, 20881, 20896, 21070, 21059, + 21066, 21069, 21068, 21067, 21063, 21191, 21193, 21187, 21185, 21261, + 21335, 21371, 21402, 21467, 21676, 21696, 21672, 21710, 21705, 21688, + 21670, 21683, 21703, 21698, 21693, 21674, 21697, 21700, 21704, 21679, + 21675, 21681, 21691, 21673, 21671, 21695, 22271, 22402, 22411, 22432, + 22435, 22434, 22478, 22446, 22419, 22869, 22865, 22863, 22862, 22864, + 23004, 23000, 23039, 23011, 23016, 23043, 23013, 23018, 23002, 23014, + 23041, 23035, 23401, 23459, 23462, 23460, 23458, 23461, 23553, 23630, + 23631, 23629, 23627, 23769, 23762, 24055, 24093, 24101, 24095, 24189, + 24224, 24230, 24314, 24328, 24365, 24421, 24456, 24453, 24458, 24459, + 24455, 24460, 24457, 24594, 24605, 24608, 24613, 24590, 24616, 24653, + 24688, 24680, 24674, 24646, 24643, 24684, 24683, 24682, 24676, 25153, + 25308, 25366, 25353, 25340, 25325, 25345, 25326, 25341, 25351, 25329, + 25335, 25327, 25324, 25342, 25332, 25361, 25346, 25919, 25925, 26027, + 26045, 26082, 26149, 26157, 26144, 26151, 26159, 26143, 26152, 26161, + 26148, 26359, 26623, 26579, 26609, 26580, 26576, 26604, 26550, 26543, + 26613, 26601, 26607, 26564, 26577, 26548, 26586, 26597, 26552, 26575, + 26590, 26611, 26544, 26585, 26594, 26589, 26578, 27498, 27523, 27526, + 27573, 27602, 27607, 27679, 27849, 27915, 27954, 27946, 27969, 27941, + 27916, 27953, 27934, 27927, 27963, 27965, 27966, 27958, 27931, 27893, + 27961, 27943, 27960, 27945, 27950, 27957, 27918, 27947, 28843, 28858, + 28851, 28844, 28847, 28845, 28856, 28846, 28836, 29232, 29298, 29295, + 29300, 29417, 29408, 29409, 29623, 29642, 29627, 29618, 29645, 29632, + 29619, 29978, 29997, 30031, 30028, 30030, 30027, 30123, 30116, 30117, + 30114, 30115, 30328, 30342, 30343, 30344, 30408, 30406, 30403, 30405, + 30465, 30457, 30456, 30473, 30475, 30462, 30460, 30471, 30684, 30722, + 30740, 30732, 30733, 31046, 31049, 31048, 31047, 31161, 31162, 31185, + 31186, 31179, 31359, 31361, 31487, 31485, 31869, 32002, 32005, 32000, + 32009, 32007, 32004, 32006, 32568, 32654, 32703, 32772, 32784, 32781, + 32785, 32822, 32982, 32997, 32986, 32963, 32964, 32972, 32993, 32987, + 32974, 32990, 32996, 32989, 33268, 33314, 33511, 33539, 33541, 33507, + 33499, 33510, 33540, 33509, 33538, 33545, 33490, 33495, 33521, 33537, + 33500, 33492, 33489, 33502, 33491, 33503, 33519, 33542, 34384, 34425, + 34427, 34426, 34893, 34923, 35201, 35284, 35336, 35330, 35331, 35998, + 36000, 36212, 36211, 36276, 36557, 36556, 36848, 36838, 36834, 36842, + 36837, 36845, 36843, 36836, 36840, 37066, 37070, 37057, 37059, 37195, + 37194, 37325, 38274, 38480, 38475, 38476, 38477, 38754, 38761, 38859, + 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 20056, 20147, + 20492, 20493, 20515, 20463, 20518, 20517, 20472, 20521, 20502, 20486, + 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, 20520, 20465, + 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, 20478, 20523, + 20489, 20860, 20900, 20901, 20898, 20941, 20940, 20934, 20939, 21078, + 21084, 21076, 21083, 21085, 21290, 21375, 21407, 21405, 21471, 21736, + 21776, 21761, 21815, 21756, 21733, 21746, 21766, 21754, 21780, 21737, + 21741, 21729, 21769, 21742, 21738, 21734, 21799, 21767, 21757, 21775, + 22275, 22276, 22466, 22484, 22475, 22467, 22537, 22799, 22871, 22872, + 22874, 23057, 23064, 23068, 23071, 23067, 23059, 23020, 23072, 23075, + 23081, 23077, 23052, 23049, 23403, 23640, 23472, 23475, 23478, 23476, + 23470, 23477, 23481, 23480, 23556, 23633, 23637, 23632, 23789, 23805, + 23803, 23786, 23784, 23792, 23798, 23809, 23796, 24046, 24109, 24107, + 24235, 24237, 24231, 24369, 24466, 24465, 24464, 24665, 24675, 24677, + 24656, 24661, 24685, 24681, 24687, 24708, 24735, 24730, 24717, 24724, + 24716, 24709, 24726, 25159, 25331, 25352, 25343, 25422, 25406, 25391, + 25429, 25410, 25414, 25423, 25417, 25402, 25424, 25405, 25386, 25387, + 25384, 25421, 25420, 25928, 25929, 26009, 26049, 26053, 26178, 26185, + 26191, 26179, 26194, 26188, 26181, 26177, 26360, 26388, 26389, 26391, + 26657, 26680, 26696, 26694, 26707, 26681, 26690, 26708, 26665, 26803, + 26647, 26700, 26705, 26685, 26612, 26704, 26688, 26684, 26691, 26666, + 26693, 26643, 26648, 26689, 27530, 27529, 27575, 27683, 27687, 27688, + 27686, 27684, 27888, 28010, 28053, 28040, 28039, 28006, 28024, 28023, + 27993, 28051, 28012, 28041, 28014, 27994, 28020, 28009, 28044, 28042, + 28025, 28037, 28005, 28052, 28874, 28888, 28900, 28889, 28872, 28879, + 29241, 29305, 29436, 29433, 29437, 29432, 29431, 29574, 29677, 29705, + 29678, 29664, 29674, 29662, 30036, 30045, 30044, 30042, 30041, 30142, + 30149, 30151, 30130, 30131, 30141, 30140, 30137, 30146, 30136, 30347, + 30384, 30410, 30413, 30414, 30505, 30495, 30496, 30504, 30697, 30768, + 30759, 30776, 30749, 30772, 30775, 30757, 30765, 30752, 30751, 30770, + 31061, 31056, 31072, 31071, 31062, 31070, 31069, 31063, 31066, 31204, + 31203, 31207, 31199, 31206, 31209, 31192, 31364, 31368, 31449, 31494, + 31505, 31881, 32033, 32023, 32011, 32010, 32032, 32034, 32020, 32016, + 32021, 32026, 32028, 32013, 32025, 32027, 32570, 32607, 32660, 32709, + 32705, 32774, 32792, 32789, 32793, 32791, 32829, 32831, 33009, 33026, + 33008, 33029, 33005, 33012, 33030, 33016, 33011, 33032, 33021, 33034, + 33020, 33007, 33261, 33260, 33280, 33296, 33322, 33323, 33320, 33324, + 33467, 33579, 33618, 33620, 33610, 33592, 33616, 33609, 33589, 33588, + 33615, 33586, 33593, 33590, 33559, 33600, 33585, 33576, 33603, 34388, + 34442, 34474, 34451, 34468, 34473, 34444, 34467, 34460, 34928, 34935, + 34945, 34946, 34941, 34937, 35352, 35344, 35342, 35340, 35349, 35338, + 35351, 35347, 35350, 35343, 35345, 35912, 35962, 35961, 36001, 36002, + 36215, 36524, 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, + 36858, 36852, 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, + 37202, 37197, 37196, 37336, 37341, 37335, 37340, 37337, 38275, 38498, + 38499, 38497, 38491, 38493, 38500, 38488, 38494, 38587, 39138, 39340, + 39592, 39640, 39717, 39730, 39740, 20094, 20602, 20605, 20572, 20551, + 20547, 20556, 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, + 20599, 20559, 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, + 21202, 21209, 21208, 21205, 21264, 21263, 21273, 21311, 21312, 21310, + 21443, 26364, 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, + 21809, 21846, 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, + 21859, 21811, 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, + 22534, 22496, 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, + 23094, 23105, 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, + 23114, 23408, 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, + 23559, 23648, 23644, 23645, 23815, 23814, 23822, 23835, 23830, 23842, + 23825, 23849, 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, + 24115, 24119, 24247, 24248, 24246, 24245, 24254, 24373, 24375, 24407, + 24428, 24425, 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, + 24703, 24739, 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, + 24763, 24757, 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, + 24775, 25114, 25115, 25160, 25504, 25511, 25458, 25494, 25506, 25509, + 25463, 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, + 25512, 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, + 25449, 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, + 25944, 25941, 25940, 26012, 26011, 26028, 26063, 26059, 26060, 26062, + 26205, 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, + 26799, 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, + 26755, 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, + 26754, 27442, 27578, 27627, 27628, 27691, 28046, 28092, 28147, 28121, + 28082, 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, + 28113, 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, + 28085, 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, + 28074, 28140, 28095, 28134, 28921, 28937, 28938, 28925, 28911, 29245, + 29309, 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, + 29699, 29702, 29694, 29709, 29920, 29942, 29943, 29980, 29986, 30053, + 30054, 30050, 30064, 30095, 30164, 30165, 30133, 30154, 30157, 30350, + 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, 30522, 30827, + 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, 31520, 31528, + 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, 31893, 32070, + 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, 32068, 32047, + 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, 32722, 32796, + 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, 33060, 33282, + 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, 33698, 33686, + 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, 33659, 33660, + 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, 34485, 34502, + 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, 34962, 34966, + 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, 35377, 35373, + 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, 36008, 36010, + 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, 36877, 36890, + 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, 36879, 36898, + 36886, 36891, 36884, 37096, 37101, 37117, 37207, 37326, 37365, 37350, + 37347, 37351, 37357, 37353, 38281, 38506, 38517, 38515, 38520, 38512, + 38516, 38518, 38519, 38508, 38592, 38634, 38633, 31456, 31455, 38914, + 38915, 39770, 40165, 40565, 40575, 40613, 40635, 20642, 20621, 20613, + 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, 21106, 21108, + 21109, 21097, 21214, 21213, 21211, 21338, 21413, 21883, 21888, 21927, + 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, 21895, 21899, + 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, 21932, 21937, + 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, 22564, 22576, + 22577, 22561, 22557, 22560, 22777, 22778, 22880, 23159, 23194, 23167, + 23186, 23195, 23207, 23411, 23409, 23506, 23500, 23507, 23504, 23562, + 23563, 23601, 23884, 23888, 23860, 23879, 24061, 24133, 24125, 24128, + 24131, 24190, 24266, 24257, 24258, 24260, 24380, 24429, 24489, 24490, + 24488, 24785, 24801, 24754, 24758, 24800, 24860, 24867, 24826, 24853, + 24816, 24827, 24820, 24936, 24817, 24846, 24822, 24841, 24832, 24850, + 25119, 25161, 25507, 25484, 25551, 25536, 25577, 25545, 25542, 25549, + 25554, 25571, 25552, 25569, 25558, 25581, 25582, 25462, 25588, 25578, + 25563, 25682, 25562, 25593, 25950, 25958, 25954, 25955, 26001, 26000, + 26031, 26222, 26224, 26228, 26230, 26223, 26257, 26234, 26238, 26231, + 26366, 26367, 26399, 26397, 26874, 26837, 26848, 26840, 26839, 26885, + 26847, 26869, 26862, 26855, 26873, 26834, 26866, 26851, 26827, 26829, + 26893, 26898, 26894, 26825, 26842, 26990, 26875, 27454, 27450, 27453, + 27544, 27542, 27580, 27631, 27694, 27695, 27692, 28207, 28216, 28244, + 28193, 28210, 28263, 28234, 28192, 28197, 28195, 28187, 28251, 28248, + 28196, 28246, 28270, 28205, 28198, 28271, 28212, 28237, 28218, 28204, + 28227, 28189, 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, + 28265, 28255, 28953, 28954, 28966, 28976, 28961, 28982, 29038, 28956, + 29260, 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, + 29730, 29733, 29749, 29750, 29748, 29743, 29723, 29734, 29736, 29989, + 29990, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, 30176, + 30331, 30332, 30358, 30355, 30388, 30428, 30543, 30701, 30813, 30828, + 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, 31461, + 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, 31567, + 31569, 31903, 31909, 32094, 32080, 32104, 32085, 32043, 32110, 32114, + 32097, 32102, 32098, 32112, 32115, 21892, 32724, 32725, 32779, 32850, + 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, 33086, 33100, + 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, 33760, 33733, + 33803, 33729, 33775, 33777, 33780, 33879, 33802, 33776, 33804, 33740, + 33789, 33778, 33738, 33848, 33806, 33796, 33756, 33799, 33748, 33759, + 34395, 34527, 34521, 34541, 34516, 34523, 34532, 34512, 34526, 34903, + 35009, 35010, 34993, 35203, 35222, 35387, 35424, 35413, 35422, 35388, + 35393, 35412, 35419, 35408, 35398, 35380, 35386, 35382, 35414, 35937, + 35970, 36015, 36028, 36019, 36029, 36033, 36027, 36032, 36020, 36023, + 36022, 36031, 36024, 36234, 36229, 36225, 36302, 36317, 36299, 36314, + 36305, 36300, 36315, 36294, 36603, 36600, 36604, 36764, 36910, 36917, + 36913, 36920, 36914, 36918, 37122, 37109, 37129, 37118, 37219, 37221, + 37327, 37396, 37397, 37411, 37385, 37406, 37389, 37392, 37383, 37393, + 38292, 38287, 38283, 38289, 38291, 38290, 38286, 38538, 38542, 38539, + 38525, 38533, 38534, 38541, 38514, 38532, 38593, 38597, 38596, 38598, + 38599, 38639, 38642, 38860, 38917, 38918, 38920, 39143, 39146, 39151, + 39145, 39154, 39149, 39342, 39341, 40643, 40653, 40657, 20098, 20653, + 20661, 20658, 20659, 20677, 20670, 20652, 20663, 20667, 20655, 20679, + 21119, 21111, 21117, 21215, 21222, 21220, 21218, 21219, 21295, 21983, + 21992, 21971, 21990, 21966, 21980, 21959, 21969, 21987, 21988, 21999, + 21978, 21985, 21957, 21958, 21989, 21961, 22290, 22291, 22622, 22609, + 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, + 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, + 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, + 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, + 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, + 25121, 25122, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, + 25628, 25620, 25613, 25654, 25622, 25623, 25606, 25964, 26015, 26032, + 26263, 26249, 26247, 26248, 26262, 26244, 26264, 26253, 26371, 27028, + 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, + 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, + 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, + 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, + 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, + 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, + 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, + 29791, 29790, 29761, 29759, 29785, 29787, 29788, 30070, 30072, 30208, + 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, 30430, 30431, + 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, 30556, 30565, + 30568, 30562, 30702, 30862, 30896, 30871, 30872, 30860, 30857, 30844, + 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, 31260, 31258, + 31264, 31252, 31263, 31262, 31391, 31392, 31607, 31680, 31584, 31598, + 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, 32143, 32091, + 32622, 32617, 32618, 32626, 32681, 32680, 32676, 32854, 32856, 32902, + 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, 33145, 33146, + 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, 33894, 33899, + 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, 33901, 33862, + 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, 34558, 34555, + 34562, 34563, 34566, 34570, 34905, 35039, 35028, 35033, 35036, 35032, + 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, 35442, 35443, + 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, 35461, 35437, + 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, 35978, 35977, + 36042, 36039, 36040, 36036, 36018, 36035, 36034, 36037, 36321, 36319, + 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, 36611, 36617, + 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, 36948, 36924, + 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, 36929, 37138, + 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, 37437, 37440, + 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, 37445, 37433, + 37439, 37466, 38296, 38552, 38548, 38549, 38605, 38603, 38601, 38602, + 38647, 38651, 38649, 38646, 38742, 38772, 38774, 38928, 38929, 38931, + 38922, 38930, 38924, 39164, 39156, 39165, 39166, 39347, 39345, 39348, + 39649, 40169, 40578, 40718, 40723, 40736, 20711, 20718, 20709, 20694, + 20717, 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, + 21123, 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, + 22022, 22025, 22029, 22030, 22007, 22038, 22047, 22024, 22032, 22006, + 22296, 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, + 22781, 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, + 23254, 23256, 23267, 23413, 23518, 23527, 23521, 23525, 23526, 23528, + 23522, 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, + 24151, 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, + 24907, 24951, 24930, 24931, 24927, 24922, 24920, 24949, 25130, 25735, + 25688, 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, + 25723, 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, + 27029, 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, + 27088, 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, + 28467, 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, + 28418, 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, + 28459, 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, + 29081, 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, + 29796, 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, + 30217, 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, + 30887, 30899, 30889, 30883, 31118, 31119, 31117, 31278, 31281, 31402, + 31401, 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, + 31631, 31672, 31623, 31620, 31929, 31933, 31934, 32187, 32176, 32156, + 32189, 32190, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, + 32181, 32184, 32173, 32210, 32199, 32172, 32624, 32736, 32737, 32735, + 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, 33154, + 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, 33988, + 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, 33980, + 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, 34645, + 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, 35098, + 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, 35498, + 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, 36051, + 36049, 36050, 36203, 36249, 36245, 36348, 36628, 36626, 36629, 36627, + 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, 36955, + 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37504, 37509, + 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, 38305, 38312, + 38313, 38307, 38309, 38308, 38553, 38556, 38555, 38604, 38610, 38656, + 38780, 38789, 38902, 38935, 38936, 39087, 39089, 39171, 39173, 39180, + 39177, 39361, 39599, 39600, 39654, 39745, 39746, 40180, 40182, 40179, + 40636, 40763, 40778, 20740, 20736, 20731, 20725, 20729, 20738, 20744, + 20745, 20741, 20956, 21127, 21128, 21129, 21133, 21130, 21232, 21426, + 22062, 22075, 22073, 22066, 22079, 22068, 22057, 22099, 22094, 22103, + 22132, 22070, 22063, 22064, 22656, 22687, 22686, 22707, 22684, 22702, + 22697, 22694, 22893, 23305, 23291, 23307, 23285, 23308, 23304, 23534, + 23532, 23529, 23531, 23652, 23653, 23965, 23956, 24162, 24159, 24161, + 24290, 24282, 24287, 24285, 24291, 24288, 24392, 24433, 24503, 24501, + 24950, 24935, 24942, 24925, 24917, 24962, 24956, 24944, 24939, 24958, + 24999, 24976, 25003, 24974, 25004, 24986, 24996, 24980, 25006, 25134, + 25705, 25711, 25721, 25758, 25778, 25736, 25744, 25776, 25765, 25747, + 25749, 25769, 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, + 25779, 25973, 25975, 25976, 26286, 26283, 26292, 26289, 27171, 27167, + 27112, 27137, 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, + 27141, 27117, 27153, 27472, 27470, 27556, 27589, 27590, 28479, 28540, + 28548, 28497, 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, + 28538, 28528, 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, + 29100, 29105, 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, + 29822, 29824, 30079, 30240, 30249, 30239, 30244, 30246, 30241, 30242, + 30362, 30394, 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, + 30906, 30922, 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, + 31287, 31291, 31407, 31406, 31661, 31665, 31684, 31668, 31686, 31687, + 31681, 31648, 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, + 32221, 32232, 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, + 32629, 32631, 32687, 32745, 32806, 33179, 33180, 33181, 33184, 33178, + 33176, 34071, 34109, 34074, 34030, 34092, 34093, 34067, 34065, 34083, + 34081, 34068, 34028, 34085, 34047, 34054, 34690, 34676, 34678, 34656, + 34662, 34680, 34664, 34649, 34647, 34636, 34643, 34907, 34909, 35088, + 35079, 35090, 35091, 35093, 35082, 35516, 35538, 35527, 35524, 35477, + 35531, 35576, 35506, 35529, 35522, 35519, 35504, 35542, 35533, 35510, + 35513, 35547, 35916, 35918, 35948, 36064, 36062, 36070, 36068, 36076, + 36077, 36066, 36067, 36060, 36074, 36065, 36205, 36255, 36259, 36395, + 36368, 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, + 36635, 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, + 36968, 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, + 37251, 37573, 37563, 37559, 37610, 37548, 37604, 37569, 37555, 37564, + 37586, 37575, 37616, 37554, 38317, 38321, 38660, 38662, 38663, 38665, + 38752, 38797, 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, + 39186, 39192, 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, + 39607, 39662, 39663, 39719, 39749, 39748, 39799, 39791, 40198, 40201, + 40195, 40617, 40638, 40654, 22696, 40786, 20754, 20760, 20756, 20752, + 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, + 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, + 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, + 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, + 25032, 25136, 25797, 25793, 25803, 25787, 25788, 25818, 25796, 25799, + 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, + 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, + 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, + 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, + 28601, 28598, 28582, 28576, 28596, 29118, 29129, 29136, 29138, 29128, + 29141, 29113, 29134, 29145, 29148, 29123, 29124, 29544, 29852, 29859, + 29848, 29855, 29854, 29922, 29964, 29965, 30260, 30264, 30266, 30439, + 30437, 30624, 30622, 30623, 30629, 30952, 30938, 30956, 30951, 31142, + 31309, 31310, 31302, 31308, 31307, 31418, 31705, 31761, 31689, 31716, + 31707, 31713, 31721, 31718, 31957, 31958, 32266, 32273, 32264, 32283, + 32291, 32286, 32285, 32265, 32272, 32633, 32690, 32752, 32753, 32750, + 32808, 33203, 33193, 33192, 33275, 33288, 33368, 33369, 34122, 34137, + 34120, 34152, 34153, 34115, 34121, 34157, 34154, 34142, 34691, 34719, + 34718, 34722, 34701, 34913, 35114, 35122, 35109, 35115, 35105, 35242, + 35238, 35558, 35578, 35563, 35569, 35584, 35548, 35559, 35566, 35582, + 35585, 35586, 35575, 35565, 35571, 35574, 35580, 35947, 35949, 35987, + 36084, 36420, 36401, 36404, 36418, 36409, 36405, 36667, 36655, 36664, + 36659, 36776, 36774, 36981, 36980, 36984, 36978, 36988, 36986, 37172, + 37266, 37664, 37686, 37624, 37683, 37679, 37666, 37628, 37675, 37636, + 37658, 37648, 37670, 37665, 37653, 37678, 37657, 38331, 38567, 38568, + 38570, 38613, 38670, 38673, 38678, 38669, 38675, 38671, 38747, 38748, + 38758, 38808, 38960, 38968, 38971, 38967, 38957, 38969, 38948, 39184, + 39208, 39198, 39195, 39201, 39194, 39405, 39394, 39409, 39608, 39612, + 39675, 39661, 39720, 39825, 40213, 40227, 40230, 40232, 40210, 40219, + 40664, 40660, 40845, 40860, 20778, 20767, 20769, 20786, 21237, 22158, + 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, + 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, + 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, + 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, 25986, + 25987, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, 27299, + 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, 28657, + 28639, 28640, 28635, 28644, 28651, 28655, 28544, 28652, 28641, 28649, + 28629, 28654, 28656, 29159, 29151, 29166, 29158, 29157, 29165, 29164, + 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, 29862, 29864, + 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, 30631, 30637, + 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, 31319, 31423, + 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, 31966, 31970, + 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, 32323, 32299, + 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, 32319, 32303, + 32580, 32755, 32764, 32881, 32882, 32880, 32879, 32883, 33222, 33219, + 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, 33289, 33393, + 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, 34183, 34216, + 34186, 34407, 34752, 34769, 34739, 34770, 34758, 34731, 34747, 34746, + 34760, 34763, 35131, 35126, 35140, 35128, 35133, 35244, 35598, 35607, + 35609, 35611, 35594, 35616, 35613, 35588, 35600, 35905, 35903, 35955, + 36090, 36093, 36092, 36088, 36091, 36264, 36425, 36427, 36424, 36426, + 36676, 36670, 36674, 36677, 36671, 36991, 36989, 36996, 36993, 36994, + 36992, 37177, 37283, 37278, 37276, 37709, 37762, 37672, 37749, 37706, + 37733, 37707, 37656, 37758, 37740, 37723, 37744, 37722, 37716, 38346, + 38347, 38348, 38344, 38342, 38577, 38584, 38614, 38684, 38686, 38816, + 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, 39850, 39853, + 40251, 40255, 40587, 40655, 40670, 40668, 40669, 40667, 40766, 40779, + 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, 25139, 25844, + 25842, 25854, 25862, 25850, 25851, 25847, 26039, 26332, 26406, 27315, + 27308, 27331, 27323, 27320, 27330, 27310, 27311, 27487, 27512, 27567, + 28681, 28683, 28670, 28678, 28666, 28689, 28687, 29179, 29180, 29182, + 29176, 29559, 29557, 29863, 29887, 29973, 30294, 30296, 30290, 30653, + 30655, 30651, 30652, 30990, 31150, 31329, 31330, 31328, 31428, 31429, + 31787, 31783, 31786, 31774, 31779, 31777, 31975, 32340, 32341, 32350, + 32346, 32353, 32338, 32345, 32584, 32761, 32763, 32887, 32886, 33229, + 33231, 33290, 34255, 34217, 34253, 34256, 34249, 34224, 34234, 34233, + 34214, 34799, 34796, 34802, 34784, 35206, 35250, 35316, 35624, 35641, + 35628, 35627, 35920, 36101, 36441, 36451, 36454, 36452, 36447, 36437, + 36544, 36681, 36685, 36999, 36995, 37000, 37291, 37292, 37328, 37780, + 37770, 37782, 37794, 37811, 37806, 37804, 37808, 37784, 37786, 37783, + 38356, 38358, 38352, 38357, 38626, 38620, 38617, 38619, 38622, 38692, + 38819, 38822, 38829, 38905, 38989, 38991, 38988, 38990, 38995, 39098, + 39230, 39231, 39229, 39214, 39333, 39438, 39617, 39683, 39686, 39759, + 39758, 39757, 39882, 39881, 39933, 39880, 39872, 40273, 40285, 40288, + 40672, 40725, 40748, 20787, 22181, 22750, 22751, 22754, 23541, 40848, + 24300, 25074, 25079, 25078, 25077, 25856, 25871, 26336, 26333, 27365, + 27357, 27354, 27347, 28699, 28703, 28712, 28698, 28701, 28693, 28696, + 29190, 29197, 29272, 29346, 29560, 29562, 29885, 29898, 29923, 30087, + 30086, 30303, 30305, 30663, 31001, 31153, 31339, 31337, 31806, 31807, + 31800, 31805, 31799, 31808, 32363, 32365, 32377, 32361, 32362, 32645, + 32371, 32694, 32697, 32696, 33240, 34281, 34269, 34282, 34261, 34276, + 34277, 34295, 34811, 34821, 34829, 34809, 34814, 35168, 35167, 35158, + 35166, 35649, 35676, 35672, 35657, 35674, 35662, 35663, 35654, 35673, + 36104, 36106, 36476, 36466, 36487, 36470, 36460, 36474, 36468, 36692, + 36686, 36781, 37002, 37003, 37297, 37294, 37857, 37841, 37855, 37827, + 37832, 37852, 37853, 37846, 37858, 37837, 37848, 37860, 37847, 37864, + 38364, 38580, 38627, 38698, 38695, 38753, 38876, 38907, 39006, 39000, + 39003, 39100, 39237, 39241, 39446, 39449, 39693, 39912, 39911, 39894, + 39899, 40329, 40289, 40306, 40298, 40300, 40594, 40599, 40595, 40628, + 21240, 22184, 22199, 22198, 22196, 22204, 22756, 23360, 23363, 23421, + 23542, 24009, 25080, 25082, 25880, 25876, 25881, 26342, 26407, 27372, + 28734, 28720, 28722, 29200, 29563, 29903, 30306, 30309, 31014, 31018, + 31020, 31019, 31431, 31478, 31820, 31811, 31821, 31983, 31984, 36782, + 32381, 32380, 32386, 32588, 32768, 33242, 33382, 34299, 34297, 34321, + 34298, 34310, 34315, 34311, 34314, 34836, 34837, 35172, 35258, 35320, + 35696, 35692, 35686, 35695, 35679, 35691, 36111, 36109, 36489, 36481, + 36485, 36482, 37300, 37323, 37912, 37891, 37885, 38369, 38704, 39108, + 39250, 39249, 39336, 39467, 39472, 39479, 39477, 39955, 39949, 40569, + 40629, 40680, 40751, 40799, 40803, 40801, 20791, 20792, 22209, 22208, + 22210, 22804, 23660, 24013, 25084, 25086, 25885, 25884, 26005, 26345, + 27387, 27396, 27386, 27570, 28748, 29211, 29351, 29910, 29908, 30313, + 30675, 31824, 32399, 32396, 32700, 34327, 34349, 34330, 34851, 34850, + 34849, 34847, 35178, 35180, 35261, 35700, 35703, 35709, 36115, 36490, + 36493, 36491, 36703, 36783, 37306, 37934, 37939, 37941, 37946, 37944, + 37938, 37931, 38370, 38712, 38713, 38706, 38911, 39015, 39013, 39255, + 39493, 39491, 39488, 39486, 39631, 39764, 39761, 39981, 39973, 40367, + 40372, 40386, 40376, 40605, 40687, 40729, 40796, 40806, 40807, 20796, + 20795, 22216, 22218, 22217, 23423, 24020, 24018, 24398, 25087, 25892, + 27402, 27489, 28753, 28760, 29568, 29924, 30090, 30318, 30316, 31155, + 31840, 31839, 32894, 32893, 33247, 35186, 35183, 35324, 35712, 36118, + 36119, 36497, 36499, 36705, 37192, 37956, 37969, 37970, 38717, 38718, + 38851, 38849, 39019, 39253, 39509, 39501, 39634, 39706, 40009, 39985, + 39998, 39995, 40403, 40407, 40756, 40812, 40810, 40852, 22220, 24022, + 25088, 25891, 25899, 25898, 26348, 27408, 29914, 31434, 31844, 31843, + 31845, 32403, 32406, 32404, 33250, 34360, 34367, 34865, 35722, 37008, + 37007, 37987, 37984, 37988, 38760, 39023, 39260, 39514, 39515, 39511, + 39635, 39636, 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, + 22761, 25900, 28766, 30321, 30322, 30679, 32592, 32648, 34870, 34873, + 34914, 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, + 38724, 38854, 39024, 39519, 39714, 39768, 40031, 40441, 40442, 40572, + 40573, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, 34875, + 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, 40652, + 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, 36522, + 37317, 38013, 38014, 38012, 40055, 40056, 40695, 35924, 38015, 40474, + 29224, 39530, 39729, 40475, 40478, 31858, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 20022, 20031, 20101, 20128, + 20866, 20886, 20907, 21241, 21304, 21353, 21430, 22794, 23424, 24027, + 12083, 24191, 24308, 24400, 24417, 25908, 26080, 30098, 30326, 36789, + 38582, 168, 710, 12541, 12542, 12445, 12446, 12291, 20189, 12293, + 12294, 12295, 12540, 65339, 65341, 10045, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 12449, + 12450, 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, + 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, + 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, + 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, + 12490, 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, + 12500, 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, + 12510, 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, + 12520, 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, + 12530, 12531, 12532, 12533, 12534, 1040, 1041, 1042, 1043, 1044, + 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, + 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, + 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 1103, 8679, 8632, 8633, 12751, 131276, 20058, 131210, 20994, 17553, + 40880, 20872, 40881, 161287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 65506, 65508, 65287, 65282, 12849, 8470, + 8481, 12443, 12444, 11904, 11908, 11910, 11911, 11912, 11914, 11916, + 11917, 11925, 11932, 11933, 11941, 11943, 11946, 11948, 11950, 11958, + 11964, 11966, 11974, 11978, 11980, 11981, 11983, 11990, 11991, 11998, + 12003, 0x0000, 0x0000, 0x0000, 643, 592, 603, 596, 629, 339, + 248, 331, 650, 618, 20034, 20060, 20981, 21274, 21378, 19975, + 19980, 20039, 20109, 22231, 64012, 23662, 24435, 19983, 20871, 19982, + 20014, 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, + 22787, 22828, 23568, 24063, 26081, 27571, 27596, 27668, 29247, 20017, + 20028, 20200, 20188, 20201, 20193, 20189, 20186, 21004, 21276, 21324, + 22306, 22307, 22807, 22831, 23425, 23428, 23570, 23611, 23668, 23667, + 24068, 24192, 24194, 24521, 25097, 25168, 27669, 27702, 27715, 27711, + 27707, 29358, 29360, 29578, 31160, 32906, 38430, 20238, 20248, 20268, + 20213, 20244, 20209, 20224, 20215, 20232, 20253, 20226, 20229, 20258, + 20243, 20228, 20212, 20242, 20913, 21011, 21001, 21008, 21158, 21282, + 21279, 21325, 21386, 21511, 22241, 22239, 22318, 22314, 22324, 22844, + 22912, 22908, 22917, 22907, 22910, 22903, 22911, 23382, 23573, 23589, + 23676, 23674, 23675, 23678, 24031, 24181, 24196, 24322, 24346, 24436, + 24533, 24532, 24527, 25180, 25182, 25188, 25185, 25190, 25186, 25177, + 25184, 25178, 25189, 26095, 26094, 26430, 26425, 26424, 26427, 26426, + 26431, 26428, 26419, 27672, 27718, 27730, 27740, 27727, 27722, 27732, + 27723, 27724, 28785, 29278, 29364, 29365, 29582, 29994, 30335, 31349, + 32593, 33400, 33404, 33408, 33405, 33407, 34381, 35198, 37017, 37015, + 37016, 37019, 37012, 38434, 38436, 38432, 38435, 20310, 20283, 20322, + 20297, 20307, 20324, 20286, 20327, 20306, 20319, 20289, 20312, 20269, + 20275, 20287, 20321, 20879, 20921, 21020, 21022, 21025, 21165, 21166, + 21257, 21347, 21362, 21390, 21391, 21552, 21559, 21546, 21588, 21573, + 21529, 21532, 21541, 21528, 21565, 21583, 21569, 21544, 21540, 21575, + 22254, 22247, 22245, 22337, 22341, 22348, 22345, 22347, 22354, 22790, + 22848, 22950, 22936, 22944, 22935, 22926, 22946, 22928, 22927, 22951, + 22945, 23438, 23442, 23592, 23594, 23693, 23695, 23688, 23691, 23689, + 23698, 23690, 23686, 23699, 23701, 24032, 24074, 24078, 24203, 24201, + 24204, 24200, 24205, 24325, 24349, 24440, 24438, 24530, 24529, 24528, + 24557, 24552, 24558, 24563, 24545, 24548, 24547, 24570, 24559, 24567, + 24571, 24576, 24564, 25146, 25219, 25228, 25230, 25231, 25236, 25223, + 25201, 25211, 25210, 25200, 25217, 25224, 25207, 25213, 25202, 25204, + 25911, 26096, 26100, 26099, 26098, 26101, 26437, 26439, 26457, 26453, + 26444, 26440, 26461, 26445, 26458, 26443, 27600, 27673, 27674, 27768, + 27751, 27755, 27780, 27787, 27791, 27761, 27759, 27753, 27802, 27757, + 27783, 27797, 27804, 27750, 27763, 27749, 27771, 27790, 28788, 28794, + 29283, 29375, 29373, 29379, 29382, 29377, 29370, 29381, 29589, 29591, + 29587, 29588, 29586, 30010, 30009, 30100, 30101, 30337, 31037, 32820, + 32917, 32921, 32912, 32914, 32924, 33424, 33423, 33413, 33422, 33425, + 33427, 33418, 33411, 33412, 35960, 36809, 36799, 37023, 37025, 37029, + 37022, 37031, 37024, 38448, 38440, 38447, 38445, 20019, 20376, 20348, + 20357, 20349, 20352, 20359, 20342, 20340, 20361, 20356, 20343, 20300, + 20375, 20330, 20378, 20345, 20353, 20344, 20368, 20380, 20372, 20382, + 20370, 20354, 20373, 20331, 20334, 20894, 20924, 20926, 21045, 21042, + 21043, 21062, 21041, 21180, 21258, 21259, 21308, 21394, 21396, 21639, + 21631, 21633, 21649, 21634, 21640, 21611, 21626, 21630, 21605, 21612, + 21620, 21606, 21645, 21615, 21601, 21600, 21656, 21603, 21607, 21604, + 22263, 22265, 22383, 22386, 22381, 22379, 22385, 22384, 22390, 22400, + 22389, 22395, 22387, 22388, 22370, 22376, 22397, 22796, 22853, 22965, + 22970, 22991, 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, + 22961, 22973, 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, + 23620, 23623, 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, + 23715, 23725, 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, + 24087, 24084, 24089, 24360, 24354, 24355, 24356, 24404, 24450, 24446, + 24445, 24542, 24549, 24621, 24614, 24601, 24626, 24587, 24628, 24586, + 24599, 24627, 24602, 24606, 24620, 24610, 24589, 24592, 24622, 24595, + 24593, 24588, 24585, 24604, 25108, 25149, 25261, 25268, 25297, 25278, + 25258, 25270, 25290, 25262, 25267, 25263, 25275, 25257, 25264, 25272, + 25917, 26024, 26043, 26121, 26108, 26116, 26130, 26120, 26107, 26115, + 26123, 26125, 26117, 26109, 26129, 26128, 26358, 26378, 26501, 26476, + 26510, 26514, 26486, 26491, 26520, 26502, 26500, 26484, 26509, 26508, + 26490, 26527, 26513, 26521, 26499, 26493, 26497, 26488, 26489, 26516, + 27429, 27520, 27518, 27614, 27677, 27795, 27884, 27883, 27886, 27865, + 27830, 27860, 27821, 27879, 27831, 27856, 27842, 27834, 27843, 27846, + 27885, 27890, 27858, 27869, 27828, 27786, 27805, 27776, 27870, 27840, + 27952, 27853, 27847, 27824, 27897, 27855, 27881, 27857, 28820, 28824, + 28805, 28819, 28806, 28804, 28817, 28822, 28802, 28826, 28803, 29290, + 29398, 29387, 29400, 29385, 29404, 29394, 29396, 29402, 29388, 29393, + 29604, 29601, 29613, 29606, 29602, 29600, 29612, 29597, 29917, 29928, + 30015, 30016, 30014, 30092, 30104, 30383, 30451, 30449, 30448, 30453, + 30712, 30716, 30713, 30715, 30714, 30711, 31042, 31039, 31173, 31352, + 31355, 31483, 31861, 31997, 32821, 32911, 32942, 32931, 32952, 32949, + 32941, 33312, 33440, 33472, 33451, 33434, 33432, 33435, 33461, 33447, + 33454, 33468, 33438, 33466, 33460, 33448, 33441, 33449, 33474, 33444, + 33475, 33462, 33442, 34416, 34415, 34413, 34414, 35926, 36818, 36811, + 36819, 36813, 36822, 36821, 36823, 37042, 37044, 37039, 37043, 37040, + 38457, 38461, 38460, 38458, 38467, 20429, 20421, 20435, 20402, 20425, + 20427, 20417, 20436, 20444, 20441, 20411, 20403, 20443, 20423, 20438, + 20410, 20416, 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, + 21399, 21398, 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, + 33549, 21687, 21678, 21718, 21686, 21701, 21702, 21664, 21616, 21692, + 21666, 21694, 21618, 21726, 21680, 22453, 22430, 22431, 22436, 22412, + 22423, 22429, 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, + 22772, 22797, 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, + 23037, 23036, 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, + 23008, 23038, 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, + 23755, 23771, 23774, 23770, 23753, 23751, 23754, 23766, 23763, 23764, + 23759, 23752, 23750, 23758, 23775, 23800, 24057, 24097, 24098, 24099, + 24096, 24100, 24240, 24228, 24226, 24219, 24227, 24229, 24327, 24366, + 24406, 24454, 24631, 24633, 24660, 24690, 24670, 24645, 24659, 24647, + 24649, 24667, 24652, 24640, 24642, 24671, 24612, 24644, 24664, 24678, + 24686, 25154, 25155, 25295, 25357, 25355, 25333, 25358, 25347, 25323, + 25337, 25359, 25356, 25336, 25334, 25344, 25363, 25364, 25338, 25365, + 25339, 25328, 25921, 25923, 26026, 26047, 26166, 26145, 26162, 26165, + 26140, 26150, 26146, 26163, 26155, 26170, 26141, 26164, 26169, 26158, + 26383, 26384, 26561, 26610, 26568, 26554, 26588, 26555, 26616, 26584, + 26560, 26551, 26565, 26603, 26596, 26591, 26549, 26573, 26547, 26615, + 26614, 26606, 26595, 26562, 26553, 26574, 26599, 26608, 26546, 26620, + 26566, 26605, 26572, 26542, 26598, 26587, 26618, 26569, 26570, 26563, + 26602, 26571, 27432, 27522, 27524, 27574, 27606, 27608, 27616, 27680, + 27681, 27944, 27956, 27949, 27935, 27964, 27967, 27922, 27914, 27866, + 27955, 27908, 27929, 27962, 27930, 27921, 27904, 27933, 27970, 27905, + 27928, 27959, 27907, 27919, 27968, 27911, 27936, 27948, 27912, 27938, + 27913, 27920, 28855, 28831, 28862, 28849, 28848, 28833, 28852, 28853, + 28841, 29249, 29257, 29258, 29292, 29296, 29299, 29294, 29386, 29412, + 29416, 29419, 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, + 29637, 29625, 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, + 29638, 29624, 29643, 29932, 29934, 29998, 30023, 30024, 30119, 30122, + 30329, 30404, 30472, 30467, 30468, 30469, 30474, 30455, 30459, 30458, + 30695, 30696, 30726, 30737, 30738, 30725, 30736, 30735, 30734, 30729, + 30723, 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, + 31190, 31182, 31360, 31358, 31441, 31488, 31489, 31866, 31864, 31865, + 31871, 31872, 31873, 32003, 32008, 32001, 32600, 32657, 32653, 32702, + 32775, 32782, 32783, 32788, 32823, 32984, 32967, 32992, 32977, 32968, + 32962, 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, + 32983, 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, + 33512, 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, + 33525, 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, + 33517, 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, + 35283, 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, + 37055, 37077, 37061, 37054, 37063, 37067, 37064, 37332, 37331, 38484, + 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, + 20528, 20507, 20469, 20468, 20531, 20535, 20524, 20470, 20471, 20503, + 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, + 20938, 20932, 20933, 20936, 20942, 21089, 21082, 21074, 21086, 21087, + 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, 21778, 21735, + 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, 21765, 21745, + 21770, 21755, 21751, 21752, 21728, 21774, 21763, 21771, 22273, 22274, + 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, 22456, 22454, + 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, 23062, 23085, + 23086, 23061, 23055, 23063, 23050, 23070, 23091, 23404, 23463, 23469, + 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, 23799, 23808, + 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, 24368, 24423, + 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, 24705, 24733, + 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, 25158, 25330, + 25360, 25430, 25388, 25412, 25413, 25398, 25411, 25572, 25401, 25419, + 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, 25389, 25415, + 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, 25926, 26054, + 26051, 26052, 26050, 26186, 26207, 26183, 26193, 26386, 26387, 26655, + 26650, 26697, 26674, 26675, 26683, 26699, 26703, 26646, 26673, 26652, + 26677, 26667, 26669, 26671, 26702, 26692, 26676, 26653, 26642, 26644, + 26662, 26664, 26670, 26701, 26682, 26661, 26656, 27436, 27439, 27437, + 27441, 27444, 27501, 32898, 27528, 27622, 27620, 27624, 27619, 27618, + 27623, 27685, 28026, 28003, 28004, 28022, 27917, 28001, 28050, 27992, + 28002, 28013, 28015, 28049, 28045, 28143, 28031, 28038, 27998, 28007, + 28000, 28055, 28016, 28028, 27999, 28034, 28056, 27951, 28008, 28043, + 28030, 28032, 28036, 27926, 28035, 28027, 28029, 28021, 28048, 28892, + 28883, 28881, 28893, 28875, 32569, 28898, 28887, 28882, 28894, 28896, + 28884, 28877, 28869, 28870, 28871, 28890, 28878, 28897, 29250, 29304, + 29303, 29302, 29440, 29434, 29428, 29438, 29430, 29427, 29435, 29441, + 29651, 29657, 29669, 29654, 29628, 29671, 29667, 29673, 29660, 29650, + 29659, 29652, 29661, 29658, 29655, 29656, 29672, 29918, 29919, 29940, + 29941, 29985, 30043, 30047, 30128, 30145, 30139, 30148, 30144, 30143, + 30134, 30138, 30346, 30409, 30493, 30491, 30480, 30483, 30482, 30499, + 30481, 30485, 30489, 30490, 30498, 30503, 30755, 30764, 30754, 30773, + 30767, 30760, 30766, 30763, 30753, 30761, 30771, 30762, 30769, 31060, + 31067, 31055, 31068, 31059, 31058, 31057, 31211, 31212, 31200, 31214, + 31213, 31210, 31196, 31198, 31197, 31366, 31369, 31365, 31371, 31372, + 31370, 31367, 31448, 31504, 31492, 31507, 31493, 31503, 31496, 31498, + 31502, 31497, 31506, 31876, 31889, 31882, 31884, 31880, 31885, 31877, + 32030, 32029, 32017, 32014, 32024, 32022, 32019, 32031, 32018, 32015, + 32012, 32604, 32609, 32606, 32608, 32605, 32603, 32662, 32658, 32707, + 32706, 32704, 32790, 32830, 32825, 33018, 33010, 33017, 33013, 33025, + 33019, 33024, 33281, 33327, 33317, 33587, 33581, 33604, 33561, 33617, + 33573, 33622, 33599, 33601, 33574, 33564, 33570, 33602, 33614, 33563, + 33578, 33544, 33596, 33613, 33558, 33572, 33568, 33591, 33583, 33577, + 33607, 33605, 33612, 33619, 33566, 33580, 33611, 33575, 33608, 34387, + 34386, 34466, 34472, 34454, 34445, 34449, 34462, 34439, 34455, 34438, + 34443, 34458, 34437, 34469, 34457, 34465, 34471, 34453, 34456, 34446, + 34461, 34448, 34452, 34883, 34884, 34925, 34933, 34934, 34930, 34944, + 34929, 34943, 34927, 34947, 34942, 34932, 34940, 35346, 35911, 35927, + 35963, 36004, 36003, 36214, 36216, 36277, 36279, 36278, 36561, 36563, + 36862, 36853, 36866, 36863, 36859, 36868, 36860, 36854, 37078, 37088, + 37081, 37082, 37091, 37087, 37093, 37080, 37083, 37079, 37084, 37092, + 37200, 37198, 37199, 37333, 37346, 37338, 38492, 38495, 38588, 39139, + 39647, 39727, 20095, 20592, 20586, 20577, 20574, 20576, 20563, 20555, + 20573, 20594, 20552, 20557, 20545, 20571, 20554, 20578, 20501, 20549, + 20575, 20585, 20587, 20579, 20580, 20550, 20544, 20590, 20595, 20567, + 20561, 20944, 21099, 21101, 21100, 21102, 21206, 21203, 21293, 21404, + 21877, 21878, 21820, 21837, 21840, 21812, 21802, 21841, 21858, 21814, + 21813, 21808, 21842, 21829, 21772, 21810, 21861, 21838, 21817, 21832, + 21805, 21819, 21824, 21835, 22282, 22279, 22523, 22548, 22498, 22518, + 22492, 22516, 22528, 22509, 22525, 22536, 22520, 22539, 22515, 22479, + 22535, 22510, 22499, 22514, 22501, 22508, 22497, 22542, 22524, 22544, + 22503, 22529, 22540, 22513, 22505, 22512, 22541, 22532, 22876, 23136, + 23128, 23125, 23143, 23134, 23096, 23093, 23149, 23120, 23135, 23141, + 23148, 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, + 23182, 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, + 23106, 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, + 23834, 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, + 23843, 23839, 23854, 24126, 24116, 24241, 24244, 24249, 24242, 24243, + 24374, 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, + 24762, 24787, 24788, 24783, 24804, 24793, 24797, 24776, 24753, 24795, + 24759, 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, + 25469, 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, + 25488, 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, + 25503, 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, + 26209, 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, + 26733, 26734, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, + 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, + 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, + 26769, 26764, 26762, 26749, 27446, 27443, 27447, 27448, 27537, 27535, + 27533, 27534, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, + 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, + 28094, 28133, 28124, 28125, 28123, 28148, 28106, 28093, 28141, 28144, + 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, + 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, + 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, + 28939, 28930, 28942, 29310, 29307, 29308, 29311, 29469, 29463, 29447, + 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, + 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, + 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, 30155, 30156, + 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, 30513, 30514, + 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, + 30794, 30796, 30758, 30789, 30800, 31076, 31079, 31081, 31082, 31075, + 31083, 31073, 31163, 31226, 31224, 31222, 31223, 31375, 31380, 31376, + 31541, 31559, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, + 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, + 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, + 32041, 32065, 32071, 32062, 32063, 32074, 32059, 32040, 32611, 32661, + 32668, 32669, 32667, 32714, 32715, 32717, 32720, 32721, 32711, 32719, + 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, 33049, + 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, 33058, + 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, 33704, + 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, 33653, + 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, 33662, + 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, 33654, + 33690, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, + 34504, 34489, 34483, 34488, 34508, 34484, 34491, 34492, 34499, 34493, + 34494, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, 34977, + 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, 34963, + 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, 35897, + 35899, 35932, 35933, 35965, 36005, 36221, 36219, 36217, 36284, 36290, + 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, 36576, 36577, + 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, 37104, 37108, + 37106, 37107, 37076, 37099, 37100, 37097, 37206, 37208, 37210, 37203, + 37205, 37356, 37364, 37361, 37363, 37368, 37348, 37369, 37354, 37355, + 37367, 37352, 37358, 38266, 38278, 38280, 38524, 38509, 38507, 38513, + 38511, 38591, 38762, 38916, 39141, 39319, 20635, 20629, 20628, 20638, + 20619, 20643, 20611, 20620, 20622, 20637, 20584, 20636, 20626, 20610, + 20615, 20831, 20948, 21266, 21265, 21412, 21415, 21905, 21928, 21925, + 21933, 21879, 22085, 21922, 21907, 21896, 21903, 21941, 21889, 21923, + 21906, 21924, 21885, 21900, 21926, 21887, 21909, 21921, 21902, 22284, + 22569, 22583, 22553, 22558, 22567, 22563, 22568, 22517, 22600, 22565, + 22556, 22555, 22579, 22591, 22582, 22574, 22585, 22584, 22573, 22572, + 22587, 22881, 23215, 23188, 23199, 23162, 23202, 23198, 23160, 23206, + 23164, 23205, 23212, 23189, 23214, 23095, 23172, 23178, 23191, 23171, + 23179, 23209, 23163, 23165, 23180, 23196, 23183, 23187, 23197, 23530, + 23501, 23499, 23508, 23505, 23498, 23502, 23564, 23600, 23863, 23875, + 23915, 23873, 23883, 23871, 23861, 23889, 23886, 23893, 23859, 23866, + 23890, 23869, 23857, 23897, 23874, 23865, 23881, 23864, 23868, 23858, + 23862, 23872, 23877, 24132, 24129, 24408, 24486, 24485, 24491, 24777, + 24761, 24780, 24802, 24782, 24772, 24852, 24818, 24842, 24854, 24837, + 24821, 24851, 24824, 24828, 24830, 24769, 24835, 24856, 24861, 24848, + 24831, 24836, 24843, 25162, 25492, 25521, 25520, 25550, 25573, 25576, + 25583, 25539, 25757, 25587, 25546, 25568, 25590, 25557, 25586, 25589, + 25697, 25567, 25534, 25565, 25564, 25540, 25560, 25555, 25538, 25543, + 25548, 25547, 25544, 25584, 25559, 25561, 25906, 25959, 25962, 25956, + 25948, 25960, 25957, 25996, 26013, 26014, 26030, 26064, 26066, 26236, + 26220, 26235, 26240, 26225, 26233, 26218, 26226, 26369, 26892, 26835, + 26884, 26844, 26922, 26860, 26858, 26865, 26895, 26838, 26871, 26859, + 26852, 26870, 26899, 26896, 26867, 26849, 26887, 26828, 26888, 26992, + 26804, 26897, 26863, 26822, 26900, 26872, 26832, 26877, 26876, 26856, + 26891, 26890, 26903, 26830, 26824, 26845, 26846, 26854, 26868, 26833, + 26886, 26836, 26857, 26901, 26917, 26823, 27449, 27451, 27455, 27452, + 27540, 27543, 27545, 27541, 27581, 27632, 27634, 27635, 27696, 28156, + 28230, 28231, 28191, 28233, 28296, 28220, 28221, 28229, 28258, 28203, + 28223, 28225, 28253, 28275, 28188, 28211, 28235, 28224, 28241, 28219, + 28163, 28206, 28254, 28264, 28252, 28257, 28209, 28200, 28256, 28273, + 28267, 28217, 28194, 28208, 28243, 28261, 28199, 28280, 28260, 28279, + 28245, 28281, 28242, 28262, 28213, 28214, 28250, 28960, 28958, 28975, + 28923, 28974, 28977, 28963, 28965, 28962, 28978, 28959, 28968, 28986, + 28955, 29259, 29274, 29320, 29321, 29318, 29317, 29323, 29458, 29451, + 29488, 29474, 29489, 29491, 29479, 29490, 29485, 29478, 29475, 29493, + 29452, 29742, 29740, 29744, 29739, 29718, 29722, 29729, 29741, 29745, + 29732, 29731, 29725, 29737, 29728, 29746, 29947, 29999, 30063, 30060, + 30183, 30170, 30177, 30182, 30173, 30175, 30180, 30167, 30357, 30354, + 30426, 30534, 30535, 30532, 30541, 30533, 30538, 30542, 30539, 30540, + 30686, 30700, 30816, 30820, 30821, 30812, 30829, 30833, 30826, 30830, + 30832, 30825, 30824, 30814, 30818, 31092, 31091, 31090, 31088, 31234, + 31242, 31235, 31244, 31236, 31385, 31462, 31460, 31562, 31547, 31556, + 31560, 31564, 31566, 31552, 31576, 31557, 31906, 31902, 31912, 31905, + 32088, 32111, 32099, 32083, 32086, 32103, 32106, 32079, 32109, 32092, + 32107, 32082, 32084, 32105, 32081, 32095, 32078, 32574, 32575, 32613, + 32614, 32674, 32672, 32673, 32727, 32849, 32847, 32848, 33022, 32980, + 33091, 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, + 33271, 33272, 33273, 33284, 33340, 33341, 33343, 33397, 33595, 33743, + 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, 33782, 33808, + 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, 33752, 33791, + 33761, 33739, 33742, 33750, 33781, 33737, 33801, 33807, 33758, 33809, + 33798, 33730, 33779, 33749, 33786, 33735, 33745, 33770, 33811, 33731, + 33772, 33774, 33732, 33787, 33751, 33762, 33819, 33755, 33790, 34520, + 34530, 34534, 34515, 34531, 34522, 34538, 34525, 34539, 34524, 34540, + 34537, 34519, 34536, 34513, 34888, 34902, 34901, 35002, 35031, 35001, + 35000, 35008, 35006, 34998, 35004, 34999, 35005, 34994, 35073, 35017, + 35221, 35224, 35223, 35293, 35290, 35291, 35406, 35405, 35385, 35417, + 35392, 35415, 35416, 35396, 35397, 35410, 35400, 35409, 35402, 35404, + 35407, 35935, 35969, 35968, 36026, 36030, 36016, 36025, 36021, 36228, + 36224, 36233, 36312, 36307, 36301, 36295, 36310, 36316, 36303, 36309, + 36313, 36296, 36311, 36293, 36591, 36599, 36602, 36601, 36582, 36590, + 36581, 36597, 36583, 36584, 36598, 36587, 36593, 36588, 36596, 36585, + 36909, 36916, 36911, 37126, 37164, 37124, 37119, 37116, 37128, 37113, + 37115, 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, + 37216, 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, + 37394, 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, + 37399, 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, 38536, + 38537, 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, + 38766, 38919, 39081, 39147, 40166, 40697, 20099, 20100, 20150, 20669, + 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, + 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, 21115, + 21116, 21955, 21979, 21964, 21968, 21963, 21962, 21981, 21952, 21972, + 21956, 21993, 21951, 21970, 21901, 21967, 21973, 21986, 21974, 21960, + 22002, 21965, 21977, 21954, 22292, 22611, 22632, 22628, 22607, 22605, + 22601, 22639, 22613, 22606, 22621, 22617, 22629, 22619, 22589, 22627, + 22641, 22780, 23239, 23236, 23243, 23226, 23224, 23217, 23221, 23216, + 23231, 23240, 23227, 23238, 23223, 23232, 23242, 23220, 23222, 23245, + 23225, 23184, 23510, 23512, 23513, 23583, 23603, 23921, 23907, 23882, + 23909, 23922, 23916, 23902, 23912, 23911, 23906, 24048, 24143, 24142, + 24138, 24141, 24139, 24261, 24268, 24262, 24267, 24263, 24384, 24495, + 24493, 24823, 24905, 24906, 24875, 24901, 24886, 24882, 24878, 24902, + 24879, 24911, 24873, 24896, 25120, 37224, 25123, 25125, 25124, 25541, + 25585, 25579, 25616, 25618, 25609, 25632, 25636, 25651, 25667, 25631, + 25621, 25624, 25657, 25655, 25634, 25635, 25612, 25638, 25648, 25640, + 25665, 25653, 25647, 25610, 25626, 25664, 25637, 25639, 25611, 25575, + 25627, 25646, 25633, 25614, 25967, 26002, 26067, 26246, 26252, 26261, + 26256, 26251, 26250, 26265, 26260, 26232, 26400, 26982, 26975, 26936, + 26958, 26978, 26993, 26943, 26949, 26986, 26937, 26946, 26967, 26969, + 27002, 26952, 26953, 26933, 26988, 26931, 26941, 26981, 26864, 27000, + 26932, 26985, 26944, 26991, 26948, 26998, 26968, 26945, 26996, 26956, + 26939, 26955, 26935, 26972, 26959, 26961, 26930, 26962, 26927, 27003, + 26940, 27462, 27461, 27459, 27458, 27464, 27457, 27547, 64013, 27643, + 27644, 27641, 27639, 27640, 28315, 28374, 28360, 28303, 28352, 28319, + 28307, 28308, 28320, 28337, 28345, 28358, 28370, 28349, 28353, 28318, + 28361, 28343, 28336, 28365, 28326, 28367, 28338, 28350, 28355, 28380, + 28376, 28313, 28306, 28302, 28301, 28324, 28321, 28351, 28339, 28368, + 28362, 28311, 28334, 28323, 28999, 29012, 29010, 29027, 29024, 28993, + 29021, 29026, 29042, 29048, 29034, 29025, 28994, 29016, 28995, 29003, + 29040, 29023, 29008, 29011, 28996, 29005, 29018, 29263, 29325, 29324, + 29329, 29328, 29326, 29500, 29506, 29499, 29498, 29504, 29514, 29513, + 29764, 29770, 29771, 29778, 29777, 29783, 29760, 29775, 29776, 29774, + 29762, 29766, 29773, 29780, 29921, 29951, 29950, 29949, 29981, 30073, + 30071, 27011, 30191, 30223, 30211, 30199, 30206, 30204, 30201, 30200, + 30224, 30203, 30198, 30189, 30197, 30205, 30361, 30389, 30429, 30549, + 30559, 30560, 30546, 30550, 30554, 30569, 30567, 30548, 30553, 30573, + 30688, 30855, 30874, 30868, 30863, 30852, 30869, 30853, 30854, 30881, + 30851, 30841, 30873, 30848, 30870, 30843, 31100, 31106, 31101, 31097, + 31249, 31256, 31257, 31250, 31255, 31253, 31266, 31251, 31259, 31248, + 31395, 31394, 31390, 31467, 31590, 31588, 31597, 31604, 31593, 31602, + 31589, 31603, 31601, 31600, 31585, 31608, 31606, 31587, 31922, 31924, + 31919, 32136, 32134, 32128, 32141, 32127, 32133, 32122, 32142, 32123, + 32131, 32124, 32140, 32148, 32132, 32125, 32146, 32621, 32619, 32615, + 32616, 32620, 32678, 32677, 32679, 32731, 32732, 32801, 33124, 33120, + 33143, 33116, 33129, 33115, 33122, 33138, 26401, 33118, 33142, 33127, + 33135, 33092, 33121, 33309, 33353, 33348, 33344, 33346, 33349, 34033, + 33855, 33878, 33910, 33913, 33935, 33933, 33893, 33873, 33856, 33926, + 33895, 33840, 33869, 33917, 33882, 33881, 33908, 33907, 33885, 34055, + 33886, 33847, 33850, 33844, 33914, 33859, 33912, 33842, 33861, 33833, + 33753, 33867, 33839, 33858, 33837, 33887, 33904, 33849, 33870, 33868, + 33874, 33903, 33989, 33934, 33851, 33863, 33846, 33843, 33896, 33918, + 33860, 33835, 33888, 33876, 33902, 33872, 34571, 34564, 34551, 34572, + 34554, 34518, 34549, 34637, 34552, 34574, 34569, 34561, 34550, 34573, + 34565, 35030, 35019, 35021, 35022, 35038, 35035, 35034, 35020, 35024, + 35205, 35227, 35295, 35301, 35300, 35297, 35296, 35298, 35292, 35302, + 35446, 35462, 35455, 35425, 35391, 35447, 35458, 35460, 35445, 35459, + 35457, 35444, 35450, 35900, 35915, 35914, 35941, 35940, 35942, 35974, + 35972, 35973, 36044, 36200, 36201, 36241, 36236, 36238, 36239, 36237, + 36243, 36244, 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, + 36329, 36323, 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, + 36608, 36613, 36615, 36616, 36610, 36619, 36946, 36927, 36932, 36937, + 36925, 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, 37230, + 37231, 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, + 37422, 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, + 37473, 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, + 37462, 37426, 38303, 38300, 38302, 38299, 38546, 38547, 38545, 38551, + 38606, 38650, 38653, 38648, 38645, 38771, 38775, 38776, 38770, 38927, + 38925, 38926, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, + 39595, 39771, 40170, 40173, 40167, 40576, 40701, 20710, 20692, 20695, + 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, 20719, + 20707, 20704, 20952, 21120, 21121, 21225, 21227, 21296, 21420, 22055, + 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, 22010, + 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, 22657, + 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, 22664, + 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, 23274, + 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, 23261, + 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, 23933, + 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, 23949, + 23929, 23935, 24152, 24153, 24147, 24280, 24273, 24279, 24270, 24284, + 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, 24872, + 24897, 24926, 24945, 24947, 24914, 24915, 24946, 24940, 24960, 24948, + 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, 25127, + 25131, 25643, 25677, 25691, 25693, 25716, 25718, 25714, 25715, 25725, + 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, 25696, + 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, 26016, + 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, 27040, + 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, 27021, + 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, 27082, + 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, 27024, + 27074, 27061, 27045, 27078, 27466, 27469, 27467, 27550, 27551, 27552, + 27587, 27588, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, + 28411, 28462, 28425, 28494, 28441, 28442, 28455, 28440, 28475, 28434, + 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, + 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, + 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, + 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, + 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, + 29813, 29810, 29799, 29806, 29952, 29954, 29955, 30077, 30096, 30230, + 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, + 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, + 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, + 31114, 31115, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, + 31275, 31306, 31280, 31279, 31272, 31270, 31400, 31403, 31404, 31470, + 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, + 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, + 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, + 32196, 32198, 32203, 32204, 32175, 32185, 32150, 32188, 32159, 32166, + 32174, 32169, 32161, 32201, 32627, 32738, 32739, 32741, 32734, 32804, + 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, + 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, + 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, + 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, 33960, 34006, + 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, 33937, + 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, 34585, + 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, 34605, + 34620, 34578, 34618, 34609, 34613, 34626, 34598, 34599, 34616, 34596, + 34586, 34608, 34577, 35063, 35047, 35057, 35058, 35066, 35070, 35054, + 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, 35230, + 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, 35901, + 35944, 35945, 36053, 36047, 36055, 36246, 36361, 36354, 36351, 36365, + 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, 36624, + 36625, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, 37146, + 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, 37494, + 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, 37497, + 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, 37512, + 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, 37533, + 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, 38787, + 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, 39085, + 39086, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, 39354, + 39362, 39357, 39367, 39601, 39651, 39655, 39742, 39743, 39776, 39777, + 39775, 40177, 40178, 40181, 40615, 20735, 20739, 20784, 20728, 20742, + 20743, 20726, 20734, 20747, 20748, 20733, 20746, 21131, 21132, 21233, + 21231, 22088, 22082, 22092, 22069, 22081, 22090, 22089, 22086, 22104, + 22106, 22080, 22067, 22077, 22060, 22078, 22072, 22058, 22074, 22298, + 22699, 22685, 22705, 22688, 22691, 22703, 22700, 22693, 22689, 22783, + 23295, 23284, 23293, 23287, 23286, 23299, 23288, 23298, 23289, 23297, + 23303, 23301, 23311, 23655, 23961, 23959, 23967, 23954, 23970, 23955, + 23957, 23968, 23964, 23969, 23962, 23966, 24169, 24157, 24160, 24156, + 32243, 24283, 24286, 24289, 24393, 24498, 24971, 24963, 24953, 25009, + 25008, 24994, 24969, 24987, 24979, 25007, 25005, 24991, 24978, 25002, + 24993, 24973, 24934, 25011, 25133, 25710, 25712, 25750, 25760, 25733, + 25751, 25756, 25743, 25739, 25738, 25740, 25763, 25759, 25704, 25777, + 25752, 25974, 25978, 25977, 25979, 26034, 26035, 26293, 26288, 26281, + 26290, 26295, 26282, 26287, 27136, 27142, 27159, 27109, 27128, 27157, + 27121, 27108, 27168, 27135, 27116, 27106, 27163, 27165, 27134, 27175, + 27122, 27118, 27156, 27127, 27111, 27200, 27144, 27110, 27131, 27149, + 27132, 27115, 27145, 27140, 27160, 27173, 27151, 27126, 27174, 27143, + 27124, 27158, 27473, 27557, 27555, 27554, 27558, 27649, 27648, 27647, + 27650, 28481, 28454, 28542, 28551, 28614, 28562, 28557, 28553, 28556, + 28514, 28495, 28549, 28506, 28566, 28534, 28524, 28546, 28501, 28530, + 28498, 28496, 28503, 28564, 28563, 28509, 28416, 28513, 28523, 28541, + 28519, 28560, 28499, 28555, 28521, 28543, 28565, 28515, 28535, 28522, + 28539, 29106, 29103, 29083, 29104, 29088, 29082, 29097, 29109, 29085, + 29093, 29086, 29092, 29089, 29098, 29084, 29095, 29107, 29336, 29338, + 29528, 29522, 29534, 29535, 29536, 29533, 29531, 29537, 29530, 29529, + 29538, 29831, 29833, 29834, 29830, 29825, 29821, 29829, 29832, 29820, + 29817, 29960, 29959, 30078, 30245, 30238, 30233, 30237, 30236, 30243, + 30234, 30248, 30235, 30364, 30365, 30366, 30363, 30605, 30607, 30601, + 30600, 30925, 30907, 30927, 30924, 30929, 30926, 30932, 30920, 30915, + 30916, 30921, 31130, 31137, 31136, 31132, 31138, 31131, 27510, 31289, + 31410, 31412, 31411, 31671, 31691, 31678, 31660, 31694, 31663, 31673, + 31690, 31669, 31941, 31944, 31948, 31947, 32247, 32219, 32234, 32231, + 32215, 32225, 32259, 32250, 32230, 32246, 32241, 32240, 32238, 32223, + 32630, 32684, 32688, 32685, 32749, 32747, 32746, 32748, 32742, 32744, + 32868, 32871, 33187, 33183, 33182, 33173, 33186, 33177, 33175, 33302, + 33359, 33363, 33362, 33360, 33358, 33361, 34084, 34107, 34063, 34048, + 34089, 34062, 34057, 34061, 34079, 34058, 34087, 34076, 34043, 34091, + 34042, 34056, 34060, 34036, 34090, 34034, 34069, 34039, 34027, 34035, + 34044, 34066, 34026, 34025, 34070, 34046, 34088, 34077, 34094, 34050, + 34045, 34078, 34038, 34097, 34086, 34023, 34024, 34032, 34031, 34041, + 34072, 34080, 34096, 34059, 34073, 34095, 34402, 34646, 34659, 34660, + 34679, 34785, 34675, 34648, 34644, 34651, 34642, 34657, 34650, 34641, + 34654, 34669, 34666, 34640, 34638, 34655, 34653, 34671, 34668, 34682, + 34670, 34652, 34661, 34639, 34683, 34677, 34658, 34663, 34665, 34906, + 35077, 35084, 35092, 35083, 35095, 35096, 35097, 35078, 35094, 35089, + 35086, 35081, 35234, 35236, 35235, 35309, 35312, 35308, 35535, 35526, + 35512, 35539, 35537, 35540, 35541, 35515, 35543, 35518, 35520, 35525, + 35544, 35523, 35514, 35517, 35545, 35902, 35917, 35983, 36069, 36063, + 36057, 36072, 36058, 36061, 36071, 36256, 36252, 36257, 36251, 36384, + 36387, 36389, 36388, 36398, 36373, 36379, 36374, 36369, 36377, 36390, + 36391, 36372, 36370, 36376, 36371, 36380, 36375, 36378, 36652, 36644, + 36632, 36634, 36640, 36643, 36630, 36631, 36979, 36976, 36975, 36967, + 36971, 37167, 37163, 37161, 37162, 37170, 37158, 37166, 37253, 37254, + 37258, 37249, 37250, 37252, 37248, 37584, 37571, 37572, 37568, 37593, + 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, + 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, + 37598, 37607, 37585, 37587, 37557, 37601, 37574, 37556, 38268, 38316, + 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, 38746, + 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, 38952, + 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, 39190, 39191, + 39189, 39388, 39373, 39375, 39379, 39380, 39374, 39369, 39382, 39384, + 39371, 39383, 39372, 39603, 39660, 39659, 39667, 39666, 39665, 39750, + 39747, 39783, 39796, 39793, 39782, 39798, 39797, 39792, 39784, 39780, + 39788, 40188, 40186, 40189, 40191, 40183, 40199, 40192, 40185, 40187, + 40200, 40197, 40196, 40579, 40659, 40719, 40720, 20764, 20755, 20759, + 20762, 20753, 20958, 21300, 21473, 22128, 22112, 22126, 22131, 22118, + 22115, 22125, 22130, 22110, 22135, 22300, 22299, 22728, 22717, 22729, + 22719, 22714, 22722, 22716, 22726, 23319, 23321, 23323, 23329, 23316, + 23315, 23312, 23318, 23336, 23322, 23328, 23326, 23535, 23980, 23985, + 23977, 23975, 23989, 23984, 23982, 23978, 23976, 23986, 23981, 23983, + 23988, 24167, 24168, 24166, 24175, 24297, 24295, 24294, 24296, 24293, + 24395, 24508, 24989, 25000, 24982, 25029, 25012, 25030, 25025, 25036, + 25018, 25023, 25016, 24972, 25815, 25814, 25808, 25807, 25801, 25789, + 25737, 25795, 25819, 25843, 25817, 25907, 25983, 25980, 26018, 26312, + 26302, 26304, 26314, 26315, 26319, 26301, 26299, 26298, 26316, 26403, + 27188, 27238, 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, + 27227, 27217, 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, + 27215, 27220, 27247, 27241, 27232, 27196, 27230, 27222, 27221, 27213, + 27214, 27206, 27477, 27476, 27478, 27559, 27562, 27563, 27592, 27591, + 27652, 27651, 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, + 28510, 28612, 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, + 28588, 28586, 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, + 28594, 28592, 29125, 29122, 29119, 29112, 29142, 29120, 29121, 29131, + 29140, 29130, 29127, 29135, 29117, 29144, 29116, 29126, 29146, 29147, + 29341, 29342, 29545, 29542, 29543, 29548, 29541, 29547, 29546, 29823, + 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, 30253, + 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, 30618, + 30621, 30625, 30620, 30619, 30626, 30627, 30613, 30617, 30615, 30941, + 30953, 30949, 30954, 30942, 30947, 30939, 30945, 30946, 30957, 30943, + 30944, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, 31415, + 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, 31700, + 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, 31952, + 31953, 32274, 32289, 32279, 32268, 32287, 32288, 32275, 32270, 32284, + 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, 32293, 32292, + 32579, 32635, 32636, 32634, 32689, 32751, 32810, 32809, 32876, 33201, + 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, 33202, 33207, + 33191, 33266, 33365, 33366, 33367, 34134, 34117, 34155, 34125, 34131, + 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, 34119, + 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, 34144, + 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, 34715, + 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, 34681, 34695, + 34723, 34693, 34704, 34705, 34717, 34692, 34708, 34716, 34714, 34697, + 35102, 35110, 35120, 35117, 35118, 35111, 35121, 35106, 35113, 35107, + 35119, 35116, 35103, 35313, 35552, 35554, 35570, 35572, 35573, 35549, + 35604, 35556, 35551, 35568, 35528, 35550, 35553, 35560, 35583, 35567, + 35579, 35985, 35986, 35984, 36085, 36078, 36081, 36080, 36083, 36204, + 36206, 36261, 36263, 36403, 36414, 36408, 36416, 36421, 36406, 36412, + 36413, 36417, 36400, 36415, 36541, 36662, 36654, 36661, 36658, 36665, + 36663, 36660, 36982, 36985, 36987, 36998, 37114, 37171, 37173, 37174, + 37267, 37264, 37265, 37261, 37263, 37671, 37662, 37640, 37663, 37638, + 37647, 37754, 37688, 37692, 37659, 37667, 37650, 37633, 37702, 37677, + 37646, 37645, 37579, 37661, 37626, 37669, 37651, 37625, 37623, 37684, + 37634, 37668, 37631, 37673, 37689, 37685, 37674, 37652, 37644, 37643, + 37630, 37641, 37632, 37627, 37654, 38332, 38349, 38334, 38329, 38330, + 38326, 38335, 38325, 38333, 38569, 38612, 38667, 38674, 38672, 38809, + 38807, 38804, 38896, 38904, 38965, 38959, 38962, 39204, 39199, 39207, + 39209, 39326, 39406, 39404, 39397, 39396, 39408, 39395, 39402, 39401, + 39399, 39609, 39615, 39604, 39611, 39670, 39674, 39673, 39671, 39731, + 39808, 39813, 39815, 39804, 39806, 39803, 39810, 39827, 39826, 39824, + 39802, 39829, 39805, 39816, 40229, 40215, 40224, 40222, 40212, 40233, + 40221, 40216, 40226, 40208, 40217, 40223, 40584, 40582, 40583, 40622, + 40621, 40661, 40662, 40698, 40722, 40765, 20774, 20773, 20770, 20772, + 20768, 20777, 21236, 22163, 22156, 22157, 22150, 22148, 22147, 22142, + 22146, 22143, 22145, 22742, 22740, 22735, 22738, 23341, 23333, 23346, + 23331, 23340, 23335, 23334, 23343, 23342, 23419, 23537, 23538, 23991, + 24172, 24170, 24510, 24507, 25027, 25013, 25020, 25063, 25056, 25061, + 25060, 25064, 25054, 25839, 25833, 25827, 25835, 25828, 25832, 25985, + 25984, 26038, 26074, 26322, 27277, 27286, 27265, 27301, 27273, 27295, + 27291, 27297, 27294, 27271, 27283, 27278, 27285, 27267, 27304, 27300, + 27281, 27263, 27302, 27290, 27269, 27276, 27282, 27483, 27565, 27657, + 28620, 28585, 28660, 28628, 28643, 28636, 28653, 28647, 28646, 28638, + 28658, 28637, 28642, 28648, 29153, 29169, 29160, 29170, 29156, 29168, + 29154, 29555, 29550, 29551, 29847, 29874, 29867, 29840, 29866, 29869, + 29873, 29861, 29871, 29968, 29969, 29970, 29967, 30084, 30275, 30280, + 30281, 30279, 30372, 30441, 30645, 30635, 30642, 30647, 30646, 30644, + 30641, 30632, 30704, 30963, 30973, 30978, 30971, 30972, 30962, 30981, + 30969, 30974, 30980, 31147, 31144, 31324, 31323, 31318, 31320, 31316, + 31322, 31422, 31424, 31425, 31749, 31759, 31730, 31744, 31743, 31739, + 31758, 31732, 31755, 31731, 31746, 31753, 31747, 31745, 31736, 31741, + 31750, 31728, 31729, 31760, 31754, 31976, 32301, 32316, 32322, 32307, + 38984, 32312, 32298, 32329, 32320, 32327, 32297, 32332, 32304, 32315, + 32310, 32324, 32314, 32581, 32639, 32638, 32637, 32756, 32754, 32812, + 33211, 33220, 33228, 33226, 33221, 33223, 33212, 33257, 33371, 33370, + 33372, 34179, 34176, 34191, 34215, 34197, 34208, 34187, 34211, 34171, + 34212, 34202, 34206, 34167, 34172, 34185, 34209, 34170, 34168, 34135, + 34190, 34198, 34182, 34189, 34201, 34205, 34177, 34210, 34178, 34184, + 34181, 34169, 34166, 34200, 34192, 34207, 34408, 34750, 34730, 34733, + 34757, 34736, 34732, 34745, 34741, 34748, 34734, 34761, 34755, 34754, + 34764, 34743, 34735, 34756, 34762, 34740, 34742, 34751, 34744, 34749, + 34782, 34738, 35125, 35123, 35132, 35134, 35137, 35154, 35127, 35138, + 35245, 35247, 35246, 35314, 35315, 35614, 35608, 35606, 35601, 35589, + 35595, 35618, 35599, 35602, 35605, 35591, 35597, 35592, 35590, 35612, + 35603, 35610, 35919, 35952, 35954, 35953, 35951, 35989, 35988, 36089, + 36207, 36430, 36429, 36435, 36432, 36428, 36423, 36675, 36672, 36997, + 36990, 37176, 37274, 37282, 37275, 37273, 37279, 37281, 37277, 37280, + 37793, 37763, 37807, 37732, 37718, 37703, 37756, 37720, 37724, 37750, + 37705, 37712, 37713, 37728, 37741, 37775, 37708, 37738, 37753, 37719, + 37717, 37714, 37711, 37745, 37751, 37755, 37729, 37726, 37731, 37735, + 37760, 37710, 37721, 38343, 38336, 38345, 38339, 38341, 38327, 38574, + 38576, 38572, 38688, 38687, 38680, 38685, 38681, 38810, 38817, 38812, + 38814, 38813, 38869, 38868, 38897, 38977, 38980, 38986, 38985, 38981, + 38979, 39205, 39211, 39212, 39210, 39219, 39218, 39215, 39213, 39217, + 39216, 39320, 39331, 39329, 39426, 39418, 39412, 39415, 39417, 39416, + 39414, 39419, 39421, 39422, 39420, 39427, 39614, 39678, 39677, 39681, + 39676, 39752, 39834, 39848, 39838, 39835, 39846, 39841, 39845, 39844, + 39814, 39842, 39840, 39855, 40243, 40257, 40295, 40246, 40238, 40239, + 40241, 40248, 40240, 40261, 40258, 40259, 40254, 40247, 40256, 40253, + 32757, 40237, 40586, 40585, 40589, 40624, 40648, 40666, 40699, 40703, + 40740, 40739, 40738, 40788, 40864, 20785, 20781, 20782, 22168, 22172, + 22167, 22170, 22173, 22169, 22896, 23356, 23657, 23658, 24000, 24173, + 24174, 25048, 25055, 25069, 25070, 25073, 25066, 25072, 25067, 25046, + 25065, 25855, 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, + 26330, 26331, 26328, 27333, 27321, 27325, 27361, 27334, 27322, 27318, + 27319, 27335, 27316, 27309, 27486, 27593, 27659, 28679, 28684, 28685, + 28673, 28677, 28692, 28686, 28671, 28672, 28667, 28710, 28668, 28663, + 28682, 29185, 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, + 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, + 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30975, + 30988, 30995, 30996, 30985, 30992, 30994, 30993, 31149, 31148, 31327, + 31772, 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, + 31781, 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, + 32352, 32343, 32339, 32693, 32691, 32759, 32760, 32885, 33233, 33234, + 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, + 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, + 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, + 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, + 34776, 34787, 34724, 34775, 34777, 34817, 34804, 34792, 34781, 35155, + 35147, 35151, 35148, 35142, 35152, 35153, 35145, 35626, 35623, 35619, + 35635, 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, + 35622, 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, + 35992, 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, + 36438, 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, + 36678, 36679, 36680, 36683, 37160, 37178, 37179, 37182, 37288, 37285, + 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, + 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37773, + 37809, 37777, 37810, 37796, 37800, 37812, 37795, 37797, 38354, 38355, + 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, + 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, + 38873, 38870, 38872, 38906, 38992, 38993, 38994, 39096, 39233, 39228, + 39226, 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, + 39430, 39616, 39644, 39688, 39684, 39685, 39721, 39733, 39754, 39756, + 39755, 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, + 39876, 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, + 40278, 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, + 40671, 40705, 40704, 40726, 40741, 40747, 40746, 40745, 40744, 40780, + 40789, 20788, 20789, 21142, 21239, 21428, 22187, 22189, 22182, 22183, + 22186, 22188, 22746, 22749, 22747, 22802, 23357, 23358, 23359, 24003, + 24176, 24511, 25083, 25863, 25872, 25869, 25865, 25868, 25870, 25988, + 26078, 26077, 26334, 27367, 27360, 27340, 27345, 27353, 27339, 27359, + 27356, 27344, 27371, 27343, 27341, 27358, 27488, 27568, 27660, 28697, + 28711, 28704, 28694, 28715, 28705, 28706, 28707, 28713, 28695, 28708, + 28700, 28714, 29196, 29194, 29191, 29186, 29189, 29349, 29350, 29348, + 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, 30665, 30666, + 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, 31152, 31335, + 31336, 31795, 31804, 31801, 31788, 31803, 31980, 31978, 32374, 32373, + 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, 32587, 32586, + 32643, 32646, 32695, 32765, 32766, 32888, 33239, 33237, 33380, 33377, + 33379, 34283, 34289, 34285, 34265, 34273, 34280, 34266, 34263, 34284, + 34290, 34296, 34264, 34271, 34275, 34268, 34257, 34288, 34278, 34287, + 34270, 34274, 34816, 34810, 34819, 34806, 34807, 34825, 34828, 34827, + 34822, 34812, 34824, 34815, 34826, 34818, 35170, 35162, 35163, 35159, + 35169, 35164, 35160, 35165, 35161, 35208, 35255, 35254, 35318, 35664, + 35656, 35658, 35648, 35667, 35670, 35668, 35659, 35669, 35665, 35650, + 35666, 35671, 35907, 35959, 35958, 35994, 36102, 36103, 36105, 36268, + 36266, 36269, 36267, 36461, 36472, 36467, 36458, 36463, 36475, 36546, + 36690, 36689, 36687, 36688, 36691, 36788, 37184, 37183, 37296, 37293, + 37854, 37831, 37839, 37826, 37850, 37840, 37881, 37868, 37836, 37849, + 37801, 37862, 37834, 37844, 37870, 37859, 37845, 37828, 37838, 37824, + 37842, 37863, 38269, 38362, 38363, 38625, 38697, 38699, 38700, 38696, + 38694, 38835, 38839, 38838, 38877, 38878, 38879, 39004, 39001, 39005, + 38999, 39103, 39101, 39099, 39102, 39240, 39239, 39235, 39334, 39335, + 39450, 39445, 39461, 39453, 39460, 39451, 39458, 39456, 39463, 39459, + 39454, 39452, 39444, 39618, 39691, 39690, 39694, 39692, 39735, 39914, + 39915, 39904, 39902, 39908, 39910, 39906, 39920, 39892, 39895, 39916, + 39900, 39897, 39909, 39893, 39905, 39898, 40311, 40321, 40330, 40324, + 40328, 40305, 40320, 40312, 40326, 40331, 40332, 40317, 40299, 40308, + 40309, 40304, 40297, 40325, 40307, 40315, 40322, 40303, 40313, 40319, + 40327, 40296, 40596, 40593, 40640, 40700, 40749, 40768, 40769, 40781, + 40790, 40791, 40792, 21303, 22194, 22197, 22195, 22755, 23365, 24006, + 24007, 24302, 24303, 24512, 24513, 25081, 25879, 25878, 25877, 25875, + 26079, 26344, 26339, 26340, 27379, 27376, 27370, 27368, 27385, 27377, + 27374, 27375, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, + 28735, 28730, 28729, 28736, 28731, 28723, 28737, 29203, 29204, 29352, + 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, 30670, 30671, + 30669, 30706, 31013, 31011, 31015, 31016, 31012, 31017, 31154, 31342, + 31340, 31341, 31479, 31817, 31816, 31818, 31815, 31813, 31982, 32379, + 32382, 32385, 32384, 32698, 32767, 32889, 33243, 33241, 33291, 33384, + 33385, 34338, 34303, 34305, 34302, 34331, 34304, 34294, 34308, 34313, + 34309, 34316, 34301, 34841, 34832, 34833, 34839, 34835, 34838, 35171, + 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, 35685, 35687, + 35693, 36270, 36486, 36488, 36484, 36697, 36694, 36695, 36693, 36696, + 36698, 37005, 37187, 37185, 37303, 37301, 37298, 37299, 37899, 37907, + 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, 37913, 37901, + 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, 37897, 37880, + 37898, 37887, 37884, 37900, 37878, 37905, 37894, 38366, 38368, 38367, + 38702, 38703, 38841, 38843, 38909, 38910, 39008, 39010, 39011, 39007, + 39105, 39106, 39248, 39246, 39257, 39244, 39243, 39251, 39474, 39476, + 39473, 39468, 39466, 39478, 39465, 39470, 39480, 39469, 39623, 39626, + 39622, 39696, 39698, 39697, 39947, 39944, 39927, 39941, 39954, 39928, + 40000, 39943, 39950, 39942, 39959, 39956, 39945, 40351, 40345, 40356, + 40349, 40338, 40344, 40336, 40347, 40352, 40340, 40348, 40362, 40343, + 40353, 40346, 40354, 40360, 40350, 40355, 40383, 40361, 40342, 40358, + 40359, 40601, 40603, 40602, 40677, 40676, 40679, 40678, 40752, 40750, + 40795, 40800, 40798, 40797, 40793, 40849, 20794, 20793, 21144, 21143, + 22211, 22205, 22206, 23368, 23367, 24011, 24015, 24305, 25085, 25883, + 27394, 27388, 27395, 27384, 27392, 28739, 28740, 28746, 28744, 28745, + 28741, 28742, 29213, 29210, 29209, 29566, 29975, 30314, 30672, 31021, + 31025, 31023, 31828, 31827, 31986, 32394, 32391, 32392, 32395, 32390, + 32397, 32589, 32699, 32816, 33245, 34328, 34346, 34342, 34335, 34339, + 34332, 34329, 34343, 34350, 34337, 34336, 34345, 34334, 34341, 34857, + 34845, 34843, 34848, 34852, 34844, 34859, 34890, 35181, 35177, 35182, + 35179, 35322, 35705, 35704, 35653, 35706, 35707, 36112, 36116, 36271, + 36494, 36492, 36702, 36699, 36701, 37190, 37188, 37189, 37305, 37951, + 37947, 37942, 37929, 37949, 37948, 37936, 37945, 37930, 37943, 37932, + 37952, 37937, 38373, 38372, 38371, 38709, 38714, 38847, 38881, 39012, + 39113, 39110, 39104, 39256, 39254, 39481, 39485, 39494, 39492, 39490, + 39489, 39482, 39487, 39629, 39701, 39703, 39704, 39702, 39738, 39762, + 39979, 39965, 39964, 39980, 39971, 39976, 39977, 39972, 39969, 40375, + 40374, 40380, 40385, 40391, 40394, 40399, 40382, 40389, 40387, 40379, + 40373, 40398, 40377, 40378, 40364, 40392, 40369, 40365, 40396, 40371, + 40397, 40370, 40570, 40604, 40683, 40686, 40685, 40731, 40728, 40730, + 40753, 40782, 40805, 40804, 40850, 20153, 22214, 22213, 22219, 22897, + 23371, 23372, 24021, 24017, 24306, 25889, 25888, 25894, 25890, 27403, + 27400, 27401, 27661, 28757, 28758, 28759, 28754, 29214, 29215, 29353, + 29567, 29912, 29909, 29913, 29911, 30317, 30381, 31029, 31156, 31344, + 31345, 31831, 31836, 31833, 31835, 31834, 31988, 31985, 32401, 32591, + 32647, 33246, 33387, 34356, 34357, 34355, 34348, 34354, 34358, 34860, + 34856, 34854, 34858, 34853, 35185, 35263, 35262, 35323, 35710, 35716, + 35714, 35718, 35717, 35711, 36117, 36501, 36500, 36506, 36498, 36496, + 36502, 36503, 36704, 36706, 37191, 37964, 37968, 37962, 37963, 37967, + 37959, 37957, 37960, 37961, 37958, 38719, 38883, 39018, 39017, 39115, + 39252, 39259, 39502, 39507, 39508, 39500, 39503, 39496, 39498, 39497, + 39506, 39504, 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, + 39999, 40004, 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, + 39990, 40411, 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, + 40425, 40409, 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, + 40755, 40754, 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, + 22898, 23373, 24024, 34863, 24399, 25089, 25091, 25092, 25897, 25893, + 26006, 26347, 27409, 27410, 27407, 27594, 28763, 28762, 29218, 29570, + 29569, 29571, 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, + 34361, 34364, 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, + 35188, 35187, 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, + 36708, 36707, 37308, 37986, 37973, 37981, 37975, 37982, 38852, 38853, + 38912, 39510, 39513, 39710, 39711, 39712, 40018, 40024, 40016, 40010, + 40013, 40011, 40021, 40025, 40012, 40014, 40443, 40439, 40431, 40419, + 40427, 40440, 40420, 40438, 40417, 40430, 40422, 40434, 40432, 40418, + 40428, 40436, 40435, 40424, 40429, 40642, 40656, 40690, 40691, 40710, + 40732, 40760, 40759, 40758, 40771, 40783, 40817, 40816, 40814, 40815, + 22227, 22221, 23374, 23661, 25901, 26349, 26350, 27411, 28767, 28769, + 28765, 28768, 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, + 32407, 32649, 33389, 34371, 34872, 34871, 34869, 34891, 35732, 35733, + 36510, 36511, 36512, 36509, 37310, 37309, 37314, 37995, 37992, 37993, + 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, + 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, + 40453, 40448, 40449, 40457, 40447, 40445, 40452, 40608, 40734, 40774, + 40820, 40821, 40822, 22228, 25902, 26040, 27416, 27417, 27415, 27418, + 28770, 29222, 29354, 30680, 30681, 31033, 31849, 31851, 31990, 32410, + 32408, 32411, 32409, 33248, 33249, 34374, 34375, 34376, 35193, 35194, + 35196, 35195, 35327, 35736, 35737, 36517, 36516, 36515, 37998, 37997, + 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, + 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, + 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, + 38004, 38008, 38006, 38005, 39520, 40052, 40051, 40049, 40053, 40468, + 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, 34878, 34877, + 34879, 35742, 35996, 36521, 36553, 38731, 39027, 39028, 39116, 39265, + 39339, 39524, 39526, 39527, 39716, 40469, 40471, 40776, 25095, 27422, + 29223, 34380, 36520, 38018, 38016, 38017, 39529, 39528, 39726, 40473, + 29225, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, + 28777, 28778, 40612, 40830, 40777, 40856, 30849, 37561, 35023, 22715, + 24658, 31911, 23290, 9556, 9574, 9559, 9568, 9580, 9571, 9562, + 9577, 9565, 9554, 9572, 9557, 9566, 9578, 9569, 9560, 9575, + 9563, 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, + 9553, 9552, 9581, 9582, 9584, 9583, 65517, 132423, 37595, 132575, + 147397, 34124, 17077, 29679, 20917, 13897, 149826, 166372, 37700, 137691, + 33518, 146632, 30780, 26436, 25311, 149811, 166314, 131744, 158643, 135941, + 20395, 140525, 20488, 159017, 162436, 144896, 150193, 140563, 20521, 131966, + 24484, 131968, 131911, 28379, 132127, 20605, 20737, 13434, 20750, 39020, + 14147, 33814, 149924, 132231, 20832, 144308, 20842, 134143, 139516, 131813, + 140592, 132494, 143923, 137603, 23426, 34685, 132531, 146585, 20914, 20920, + 40244, 20937, 20943, 20945, 15580, 20947, 150182, 20915, 20962, 21314, + 20973, 33741, 26942, 145197, 24443, 21003, 21030, 21052, 21173, 21079, + 21140, 21177, 21189, 31765, 34114, 21216, 34317, 158483, 21253, 166622, + 21833, 28377, 147328, 133460, 147436, 21299, 21316, 134114, 27851, 136998, + 26651, 29653, 24650, 16042, 14540, 136936, 29149, 17570, 21357, 21364, + 165547, 21374, 21375, 136598, 136723, 30694, 21395, 166555, 21408, 21419, + 21422, 29607, 153458, 16217, 29596, 21441, 21445, 27721, 20041, 22526, + 21465, 15019, 134031, 21472, 147435, 142755, 21494, 134263, 21523, 28793, + 21803, 26199, 27995, 21613, 158547, 134516, 21853, 21647, 21668, 18342, + 136973, 134877, 15796, 134477, 166332, 140952, 21831, 19693, 21551, 29719, + 21894, 21929, 22021, 137431, 147514, 17746, 148533, 26291, 135348, 22071, + 26317, 144010, 26276, 26285, 22093, 22095, 30961, 22257, 38791, 21502, + 22272, 22255, 22253, 166758, 13859, 135759, 22342, 147877, 27758, 28811, + 22338, 14001, 158846, 22502, 136214, 22531, 136276, 148323, 22566, 150517, + 22620, 22698, 13665, 22752, 22748, 135740, 22779, 23551, 22339, 172368, + 148088, 37843, 13729, 22815, 26790, 14019, 28249, 136766, 23076, 21843, + 136850, 34053, 22985, 134478, 158849, 159018, 137180, 23001, 137211, 137138, + 159142, 28017, 137256, 136917, 23033, 159301, 23211, 23139, 14054, 149929, + 23159, 14088, 23190, 29797, 23251, 159649, 140628, 15749, 137489, 14130, + 136888, 24195, 21200, 23414, 25992, 23420, 162318, 16388, 18525, 131588, + 23509, 24928, 137780, 154060, 132517, 23539, 23453, 19728, 23557, 138052, + 23571, 29646, 23572, 138405, 158504, 23625, 18653, 23685, 23785, 23791, + 23947, 138745, 138807, 23824, 23832, 23878, 138916, 23738, 24023, 33532, + 14381, 149761, 139337, 139635, 33415, 14390, 15298, 24110, 27274, 24181, + 24186, 148668, 134355, 21414, 20151, 24272, 21416, 137073, 24073, 24308, + 164994, 24313, 24315, 14496, 24316, 26686, 37915, 24333, 131521, 194708, + 15070, 18606, 135994, 24378, 157832, 140240, 24408, 140401, 24419, 38845, + 159342, 24434, 37696, 166454, 24487, 23990, 15711, 152144, 139114, 159992, + 140904, 37334, 131742, 166441, 24625, 26245, 137335, 14691, 15815, 13881, + 22416, 141236, 31089, 15936, 24734, 24740, 24755, 149890, 149903, 162387, + 29860, 20705, 23200, 24932, 33828, 24898, 194726, 159442, 24961, 20980, + 132694, 24967, 23466, 147383, 141407, 25043, 166813, 170333, 25040, 14642, + 141696, 141505, 24611, 24924, 25886, 25483, 131352, 25285, 137072, 25301, + 142861, 25452, 149983, 14871, 25656, 25592, 136078, 137212, 25744, 28554, + 142902, 38932, 147596, 153373, 25825, 25829, 38011, 14950, 25658, 14935, + 25933, 28438, 150056, 150051, 25989, 25965, 25951, 143486, 26037, 149824, + 19255, 26065, 16600, 137257, 26080, 26083, 24543, 144384, 26136, 143863, + 143864, 26180, 143780, 143781, 26187, 134773, 26215, 152038, 26227, 26228, + 138813, 143921, 165364, 143816, 152339, 30661, 141559, 39332, 26370, 148380, + 150049, 15147, 27130, 145346, 26462, 26471, 26466, 147917, 168173, 26583, + 17641, 26658, 28240, 37436, 26625, 144358, 159136, 26717, 144495, 27105, + 27147, 166623, 26995, 26819, 144845, 26881, 26880, 15666, 14849, 144956, + 15232, 26540, 26977, 166474, 17148, 26934, 27032, 15265, 132041, 33635, + 20624, 27129, 144985, 139562, 27205, 145155, 27293, 15347, 26545, 27336, + 168348, 15373, 27421, 133411, 24798, 27445, 27508, 141261, 28341, 146139, + 132021, 137560, 14144, 21537, 146266, 27617, 147196, 27612, 27703, 140427, + 149745, 158545, 27738, 33318, 27769, 146876, 17605, 146877, 147876, 149772, + 149760, 146633, 14053, 15595, 134450, 39811, 143865, 140433, 32655, 26679, + 159013, 159137, 159211, 28054, 27996, 28284, 28420, 149887, 147589, 159346, + 34099, 159604, 20935, 27804, 28189, 33838, 166689, 28207, 146991, 29779, + 147330, 31180, 28239, 23185, 143435, 28664, 14093, 28573, 146992, 28410, + 136343, 147517, 17749, 37872, 28484, 28508, 15694, 28532, 168304, 15675, + 28575, 147780, 28627, 147601, 147797, 147513, 147440, 147380, 147775, 20959, + 147798, 147799, 147776, 156125, 28747, 28798, 28839, 28801, 28876, 28885, + 28886, 28895, 16644, 15848, 29108, 29078, 148087, 28971, 28997, 23176, + 29002, 29038, 23708, 148325, 29007, 37730, 148161, 28972, 148570, 150055, + 150050, 29114, 166888, 28861, 29198, 37954, 29205, 22801, 37955, 29220, + 37697, 153093, 29230, 29248, 149876, 26813, 29269, 29271, 15957, 143428, + 26637, 28477, 29314, 29482, 29483, 149539, 165931, 18669, 165892, 29480, + 29486, 29647, 29610, 134202, 158254, 29641, 29769, 147938, 136935, 150052, + 26147, 14021, 149943, 149901, 150011, 29687, 29717, 26883, 150054, 29753, + 132547, 16087, 29788, 141485, 29792, 167602, 29767, 29668, 29814, 33721, + 29804, 14128, 29812, 37873, 27180, 29826, 18771, 150156, 147807, 150137, + 166799, 23366, 166915, 137374, 29896, 137608, 29966, 29929, 29982, 167641, + 137803, 23511, 167596, 37765, 30029, 30026, 30055, 30062, 151426, 16132, + 150803, 30094, 29789, 30110, 30132, 30210, 30252, 30289, 30287, 30319, + 30326, 156661, 30352, 33263, 14328, 157969, 157966, 30369, 30373, 30391, + 30412, 159647, 33890, 151709, 151933, 138780, 30494, 30502, 30528, 25775, + 152096, 30552, 144044, 30639, 166244, 166248, 136897, 30708, 30729, 136054, + 150034, 26826, 30895, 30919, 30931, 38565, 31022, 153056, 30935, 31028, + 30897, 161292, 36792, 34948, 166699, 155779, 140828, 31110, 35072, 26882, + 31104, 153687, 31133, 162617, 31036, 31145, 28202, 160038, 16040, 31174, + 168205, 31188, +}; + +static const unsigned long myencoding_map_euc_kr[] = { + 44034, 44035, 44037, 44038, 44043, 44044, 44045, 44046, 44047, 44056, + 44062, 44063, 44065, 44066, 44067, 44069, 44070, 44071, 44072, 44073, + 44074, 44075, 44078, 44082, 44083, 44084, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44085, 44086, 44087, 44090, 44091, 44093, 44094, 44095, + 44097, 44098, 44099, 44100, 44101, 44102, 44103, 44104, 44105, 44106, + 44108, 44110, 44111, 44112, 44113, 44114, 44115, 44117, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44118, 44119, 44121, 44122, 44123, 44125, + 44126, 44127, 44128, 44129, 44130, 44131, 44132, 44133, 44134, 44135, + 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44146, 44147, + 44149, 44150, 44153, 44155, 44156, 44157, 44158, 44159, 44162, 44167, + 44168, 44173, 44174, 44175, 44177, 44178, 44179, 44181, 44182, 44183, + 44184, 44185, 44186, 44187, 44190, 44194, 44195, 44196, 44197, 44198, + 44199, 44203, 44205, 44206, 44209, 44210, 44211, 44212, 44213, 44214, + 44215, 44218, 44222, 44223, 44224, 44226, 44227, 44229, 44230, 44231, + 44233, 44234, 44235, 44237, 44238, 44239, 44240, 44241, 44242, 44243, + 44244, 44246, 44248, 44249, 44250, 44251, 44252, 44253, 44254, 44255, + 44258, 44259, 44261, 44262, 44265, 44267, 44269, 44270, 44274, 44276, + 44279, 44280, 44281, 44282, 44283, 44286, 44287, 44289, 44290, 44291, + 44293, 44295, 44296, 44297, 44298, 44299, 44302, 44304, 44306, 44307, + 44308, 44309, 44310, 44311, 44313, 44314, 44315, 44317, 44318, 44319, + 44321, 44322, 44323, 44324, 44325, 44326, 44327, 44328, 44330, 44331, + 44334, 44335, 44336, 44337, 44338, 44339, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44342, 44343, 44345, 44346, 44347, 44349, 44350, 44351, + 44352, 44353, 44354, 44355, 44358, 44360, 44362, 44363, 44364, 44365, + 44366, 44367, 44369, 44370, 44371, 44373, 44374, 44375, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44377, 44378, 44379, 44380, 44381, 44382, + 44383, 44384, 44386, 44388, 44389, 44390, 44391, 44392, 44393, 44394, + 44395, 44398, 44399, 44401, 44402, 44407, 44408, 44409, 44410, 44414, + 44416, 44419, 44420, 44421, 44422, 44423, 44426, 44427, 44429, 44430, + 44431, 44433, 44434, 44435, 44436, 44437, 44438, 44439, 44440, 44441, + 44442, 44443, 44446, 44447, 44448, 44449, 44450, 44451, 44453, 44454, + 44455, 44456, 44457, 44458, 44459, 44460, 44461, 44462, 44463, 44464, + 44465, 44466, 44467, 44468, 44469, 44470, 44472, 44473, 44474, 44475, + 44476, 44477, 44478, 44479, 44482, 44483, 44485, 44486, 44487, 44489, + 44490, 44491, 44492, 44493, 44494, 44495, 44498, 44500, 44501, 44502, + 44503, 44504, 44505, 44506, 44507, 44509, 44510, 44511, 44513, 44514, + 44515, 44517, 44518, 44519, 44520, 44521, 44522, 44523, 44524, 44525, + 44526, 44527, 44528, 44529, 44530, 44531, 44532, 44533, 44534, 44535, + 44538, 44539, 44541, 44542, 44546, 44547, 44548, 44549, 44550, 44551, + 44554, 44556, 44558, 44559, 44560, 44561, 44562, 44563, 44565, 44566, + 44567, 44568, 44569, 44570, 44571, 44572, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44573, 44574, 44575, 44576, 44577, 44578, 44579, 44580, + 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, + 44591, 44594, 44595, 44597, 44598, 44601, 44603, 44604, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44605, 44606, 44607, 44610, 44612, 44615, + 44616, 44617, 44619, 44623, 44625, 44626, 44627, 44629, 44631, 44632, + 44633, 44634, 44635, 44638, 44642, 44643, 44644, 44646, 44647, 44650, + 44651, 44653, 44654, 44655, 44657, 44658, 44659, 44660, 44661, 44662, + 44663, 44666, 44670, 44671, 44672, 44673, 44674, 44675, 44678, 44679, + 44680, 44681, 44682, 44683, 44685, 44686, 44687, 44688, 44689, 44690, + 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, + 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, + 44711, 44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, + 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, + 44731, 44735, 44737, 44738, 44739, 44741, 44742, 44743, 44744, 44745, + 44746, 44747, 44750, 44754, 44755, 44756, 44757, 44758, 44759, 44762, + 44763, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, + 44774, 44775, 44777, 44778, 44780, 44782, 44783, 44784, 44785, 44786, + 44787, 44789, 44790, 44791, 44793, 44794, 44795, 44797, 44798, 44799, + 44800, 44801, 44802, 44803, 44804, 44805, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44806, 44809, 44810, 44811, 44812, 44814, 44815, 44817, + 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, + 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44836, 44837, 44838, 44839, 44840, 44841, + 44842, 44843, 44846, 44847, 44849, 44851, 44853, 44854, 44855, 44856, + 44857, 44858, 44859, 44862, 44864, 44868, 44869, 44870, 44871, 44874, + 44875, 44876, 44877, 44878, 44879, 44881, 44882, 44883, 44884, 44885, + 44886, 44887, 44888, 44889, 44890, 44891, 44894, 44895, 44896, 44897, + 44898, 44899, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, + 44910, 44911, 44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, + 44920, 44922, 44923, 44924, 44925, 44926, 44927, 44929, 44930, 44931, + 44933, 44934, 44935, 44937, 44938, 44939, 44940, 44941, 44942, 44943, + 44946, 44947, 44948, 44950, 44951, 44952, 44953, 44954, 44955, 44957, + 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, + 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, + 44978, 44979, 44980, 44981, 44982, 44983, 44986, 44987, 44989, 44990, + 44991, 44993, 44994, 44995, 44996, 44997, 44998, 45002, 45004, 45007, + 45008, 45009, 45010, 45011, 45013, 45014, 45015, 45016, 45017, 45018, + 45019, 45021, 45022, 45023, 45024, 45025, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45026, 45027, 45028, 45029, 45030, 45031, 45034, 45035, + 45036, 45037, 45038, 45039, 45042, 45043, 45045, 45046, 45047, 45049, + 45050, 45051, 45052, 45053, 45054, 45055, 45058, 45059, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45061, 45062, 45063, 45064, 45065, 45066, + 45067, 45069, 45070, 45071, 45073, 45074, 45075, 45077, 45078, 45079, + 45080, 45081, 45082, 45083, 45086, 45087, 45088, 45089, 45090, 45091, + 45092, 45093, 45094, 45095, 45097, 45098, 45099, 45100, 45101, 45102, + 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112, + 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, + 45123, 45126, 45127, 45129, 45131, 45133, 45135, 45136, 45137, 45138, + 45142, 45144, 45146, 45147, 45148, 45150, 45151, 45152, 45153, 45154, + 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, + 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, + 45175, 45176, 45177, 45178, 45179, 45182, 45183, 45185, 45186, 45187, + 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45198, 45200, 45202, + 45203, 45204, 45205, 45206, 45207, 45211, 45213, 45214, 45219, 45220, + 45221, 45222, 45223, 45226, 45232, 45234, 45238, 45239, 45241, 45242, + 45243, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45254, 45258, + 45259, 45260, 45261, 45262, 45263, 45266, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45267, 45269, 45270, 45271, 45273, 45274, 45275, 45276, + 45277, 45278, 45279, 45281, 45282, 45283, 45284, 45286, 45287, 45288, + 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45297, 45298, 45299, 45300, 45301, 45302, + 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, + 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45322, 45325, 45326, + 45327, 45329, 45332, 45333, 45334, 45335, 45338, 45342, 45343, 45344, + 45345, 45346, 45350, 45351, 45353, 45354, 45355, 45357, 45358, 45359, + 45360, 45361, 45362, 45363, 45366, 45370, 45371, 45372, 45373, 45374, + 45375, 45378, 45379, 45381, 45382, 45383, 45385, 45386, 45387, 45388, + 45389, 45390, 45391, 45394, 45395, 45398, 45399, 45401, 45402, 45403, + 45405, 45406, 45407, 45409, 45410, 45411, 45412, 45413, 45414, 45415, + 45416, 45417, 45418, 45419, 45420, 45421, 45422, 45423, 45424, 45425, + 45426, 45427, 45428, 45429, 45430, 45431, 45434, 45435, 45437, 45438, + 45439, 45441, 45443, 45444, 45445, 45446, 45447, 45450, 45452, 45454, + 45455, 45456, 45457, 45461, 45462, 45463, 45465, 45466, 45467, 45469, + 45470, 45471, 45472, 45473, 45474, 45475, 45476, 45477, 45478, 45479, + 45481, 45482, 45483, 45484, 45485, 45486, 45487, 45488, 45489, 45490, + 45491, 45492, 45493, 45494, 45495, 45496, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45497, 45498, 45499, 45500, 45501, 45502, 45503, 45504, + 45505, 45506, 45507, 45508, 45509, 45510, 45511, 45512, 45513, 45514, + 45515, 45517, 45518, 45519, 45521, 45522, 45523, 45525, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45526, 45527, 45528, 45529, 45530, 45531, + 45534, 45536, 45537, 45538, 45539, 45540, 45541, 45542, 45543, 45546, + 45547, 45549, 45550, 45551, 45553, 45554, 45555, 45556, 45557, 45558, + 45559, 45560, 45562, 45564, 45566, 45567, 45568, 45569, 45570, 45571, + 45574, 45575, 45577, 45578, 45581, 45582, 45583, 45584, 45585, 45586, + 45587, 45590, 45592, 45594, 45595, 45596, 45597, 45598, 45599, 45601, + 45602, 45603, 45604, 45605, 45606, 45607, 45608, 45609, 45610, 45611, + 45612, 45613, 45614, 45615, 45616, 45617, 45618, 45619, 45621, 45622, + 45623, 45624, 45625, 45626, 45627, 45629, 45630, 45631, 45632, 45633, + 45634, 45635, 45636, 45637, 45638, 45639, 45640, 45641, 45642, 45643, + 45644, 45645, 45646, 45647, 45648, 45649, 45650, 45651, 45652, 45653, + 45654, 45655, 45657, 45658, 45659, 45661, 45662, 45663, 45665, 45666, + 45667, 45668, 45669, 45670, 45671, 45674, 45675, 45676, 45677, 45678, + 45679, 45680, 45681, 45682, 45683, 45686, 45687, 45688, 45689, 45690, + 45691, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45702, 45703, + 45704, 45706, 45707, 45708, 45709, 45710, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45711, 45714, 45715, 45717, 45718, 45719, 45723, 45724, + 45725, 45726, 45727, 45730, 45732, 45735, 45736, 45737, 45739, 45741, + 45742, 45743, 45745, 45746, 45747, 45749, 45750, 45751, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45752, 45753, 45754, 45755, 45756, 45757, + 45758, 45759, 45760, 45761, 45762, 45763, 45764, 45765, 45766, 45767, + 45770, 45771, 45773, 45774, 45775, 45777, 45779, 45780, 45781, 45782, + 45783, 45786, 45788, 45790, 45791, 45792, 45793, 45795, 45799, 45801, + 45802, 45808, 45809, 45810, 45814, 45820, 45821, 45822, 45826, 45827, + 45829, 45830, 45831, 45833, 45834, 45835, 45836, 45837, 45838, 45839, + 45842, 45846, 45847, 45848, 45849, 45850, 45851, 45853, 45854, 45855, + 45856, 45857, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, + 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, + 45876, 45877, 45878, 45879, 45880, 45881, 45882, 45883, 45884, 45885, + 45886, 45887, 45888, 45889, 45890, 45891, 45892, 45893, 45894, 45895, + 45896, 45897, 45898, 45899, 45900, 45901, 45902, 45903, 45904, 45905, + 45906, 45907, 45911, 45913, 45914, 45917, 45920, 45921, 45922, 45923, + 45926, 45928, 45930, 45932, 45933, 45935, 45938, 45939, 45941, 45942, + 45943, 45945, 45946, 45947, 45948, 45949, 45950, 45951, 45954, 45958, + 45959, 45960, 45961, 45962, 45963, 45965, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45966, 45967, 45969, 45970, 45971, 45973, 45974, 45975, + 45976, 45977, 45978, 45979, 45980, 45981, 45982, 45983, 45986, 45987, + 45988, 45989, 45990, 45991, 45993, 45994, 45995, 45997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45998, 45999, 46000, 46001, 46002, 46003, + 46004, 46005, 46006, 46007, 46008, 46009, 46010, 46011, 46012, 46013, + 46014, 46015, 46016, 46017, 46018, 46019, 46022, 46023, 46025, 46026, + 46029, 46031, 46033, 46034, 46035, 46038, 46040, 46042, 46044, 46046, + 46047, 46049, 46050, 46051, 46053, 46054, 46055, 46057, 46058, 46059, + 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46067, 46068, 46069, + 46070, 46071, 46072, 46073, 46074, 46075, 46077, 46078, 46079, 46080, + 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46088, 46089, 46090, + 46091, 46092, 46093, 46094, 46095, 46097, 46098, 46099, 46100, 46101, + 46102, 46103, 46105, 46106, 46107, 46109, 46110, 46111, 46113, 46114, + 46115, 46116, 46117, 46118, 46119, 46122, 46124, 46125, 46126, 46127, + 46128, 46129, 46130, 46131, 46133, 46134, 46135, 46136, 46137, 46138, + 46139, 46140, 46141, 46142, 46143, 46144, 46145, 46146, 46147, 46148, + 46149, 46150, 46151, 46152, 46153, 46154, 46155, 46156, 46157, 46158, + 46159, 46162, 46163, 46165, 46166, 46167, 46169, 46170, 46171, 46172, + 46173, 46174, 46175, 46178, 46180, 46182, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46183, 46184, 46185, 46186, 46187, 46189, 46190, 46191, + 46192, 46193, 46194, 46195, 46196, 46197, 46198, 46199, 46200, 46201, + 46202, 46203, 46204, 46205, 46206, 46207, 46209, 46210, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46211, 46212, 46213, 46214, 46215, 46217, + 46218, 46219, 46220, 46221, 46222, 46223, 46224, 46225, 46226, 46227, + 46228, 46229, 46230, 46231, 46232, 46233, 46234, 46235, 46236, 46238, + 46239, 46240, 46241, 46242, 46243, 46245, 46246, 46247, 46249, 46250, + 46251, 46253, 46254, 46255, 46256, 46257, 46258, 46259, 46260, 46262, + 46264, 46266, 46267, 46268, 46269, 46270, 46271, 46273, 46274, 46275, + 46277, 46278, 46279, 46281, 46282, 46283, 46284, 46285, 46286, 46287, + 46289, 46290, 46291, 46292, 46294, 46295, 46296, 46297, 46298, 46299, + 46302, 46303, 46305, 46306, 46309, 46311, 46312, 46313, 46314, 46315, + 46318, 46320, 46322, 46323, 46324, 46325, 46326, 46327, 46329, 46330, + 46331, 46332, 46333, 46334, 46335, 46336, 46337, 46338, 46339, 46340, + 46341, 46342, 46343, 46344, 46345, 46346, 46347, 46348, 46349, 46350, + 46351, 46352, 46353, 46354, 46355, 46358, 46359, 46361, 46362, 46365, + 46366, 46367, 46368, 46369, 46370, 46371, 46374, 46379, 46380, 46381, + 46382, 46383, 46386, 46387, 46389, 46390, 46391, 46393, 46394, 46395, + 46396, 46397, 46398, 46399, 46402, 46406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46407, 46408, 46409, 46410, 46414, 46415, 46417, 46418, + 46419, 46421, 46422, 46423, 46424, 46425, 46426, 46427, 46430, 46434, + 46435, 46436, 46437, 46438, 46439, 46440, 46441, 46442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46443, 46444, 46445, 46446, 46447, 46448, + 46449, 46450, 46451, 46452, 46453, 46454, 46455, 46456, 46457, 46458, + 46459, 46460, 46461, 46462, 46463, 46464, 46465, 46466, 46467, 46468, + 46469, 46470, 46471, 46472, 46473, 46474, 46475, 46476, 46477, 46478, + 46479, 46480, 46481, 46482, 46483, 46484, 46485, 46486, 46487, 46488, + 46489, 46490, 46491, 46492, 46493, 46494, 46495, 46498, 46499, 46501, + 46502, 46503, 46505, 46508, 46509, 46510, 46511, 46514, 46518, 46519, + 46520, 46521, 46522, 46526, 46527, 46529, 46530, 46531, 46533, 46534, + 46535, 46536, 46537, 46538, 46539, 46542, 46546, 46547, 46548, 46549, + 46550, 46551, 46553, 46554, 46555, 46556, 46557, 46558, 46559, 46560, + 46561, 46562, 46563, 46564, 46565, 46566, 46567, 46568, 46569, 46570, + 46571, 46573, 46574, 46575, 46576, 46577, 46578, 46579, 46580, 46581, + 46582, 46583, 46584, 46585, 46586, 46587, 46588, 46589, 46590, 46591, + 46592, 46593, 46594, 46595, 46596, 46597, 46598, 46599, 46600, 46601, + 46602, 46603, 46604, 46605, 46606, 46607, 46610, 46611, 46613, 46614, + 46615, 46617, 46618, 46619, 46620, 46621, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46622, 46623, 46624, 46625, 46626, 46627, 46628, 46630, + 46631, 46632, 46633, 46634, 46635, 46637, 46638, 46639, 46640, 46641, + 46642, 46643, 46645, 46646, 46647, 46648, 46649, 46650, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46651, 46652, 46653, 46654, 46655, 46656, + 46657, 46658, 46659, 46660, 46661, 46662, 46663, 46665, 46666, 46667, + 46668, 46669, 46670, 46671, 46672, 46673, 46674, 46675, 46676, 46677, + 46678, 46679, 46680, 46681, 46682, 46683, 46684, 46685, 46686, 46687, + 46688, 46689, 46690, 46691, 46693, 46694, 46695, 46697, 46698, 46699, + 46700, 46701, 46702, 46703, 46704, 46705, 46706, 46707, 46708, 46709, + 46710, 46711, 46712, 46713, 46714, 46715, 46716, 46717, 46718, 46719, + 46720, 46721, 46722, 46723, 46724, 46725, 46726, 46727, 46728, 46729, + 46730, 46731, 46732, 46733, 46734, 46735, 46736, 46737, 46738, 46739, + 46740, 46741, 46742, 46743, 46744, 46745, 46746, 46747, 46750, 46751, + 46753, 46754, 46755, 46757, 46758, 46759, 46760, 46761, 46762, 46765, + 46766, 46767, 46768, 46770, 46771, 46772, 46773, 46774, 46775, 46776, + 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, + 46787, 46788, 46789, 46790, 46791, 46792, 46793, 46794, 46795, 46796, + 46797, 46798, 46799, 46800, 46801, 46802, 46803, 46805, 46806, 46807, + 46808, 46809, 46810, 46811, 46812, 46813, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46814, 46815, 46816, 46817, 46818, 46819, 46820, 46821, + 46822, 46823, 46824, 46825, 46826, 46827, 46828, 46829, 46830, 46831, + 46833, 46834, 46835, 46837, 46838, 46839, 46841, 46842, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46843, 46844, 46845, 46846, 46847, 46850, + 46851, 46852, 46854, 46855, 46856, 46857, 46858, 46859, 46860, 46861, + 46862, 46863, 46864, 46865, 46866, 46867, 46868, 46869, 46870, 46871, + 46872, 46873, 46874, 46875, 46876, 46877, 46878, 46879, 46880, 46881, + 46882, 46883, 46884, 46885, 46886, 46887, 46890, 46891, 46893, 46894, + 46897, 46898, 46899, 46900, 46901, 46902, 46903, 46906, 46908, 46909, + 46910, 46911, 46912, 46913, 46914, 46915, 46917, 46918, 46919, 46921, + 46922, 46923, 46925, 46926, 46927, 46928, 46929, 46930, 46931, 46934, + 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46945, + 46946, 46947, 46949, 46950, 46951, 46953, 46954, 46955, 46956, 46957, + 46958, 46959, 46962, 46964, 46966, 46967, 46968, 46969, 46970, 46971, + 46974, 46975, 46977, 46978, 46979, 46981, 46982, 46983, 46984, 46985, + 46986, 46987, 46990, 46995, 46996, 46997, 47002, 47003, 47005, 47006, + 47007, 47009, 47010, 47011, 47012, 47013, 47014, 47015, 47018, 47022, + 47023, 47024, 47025, 47026, 47027, 47030, 47031, 47033, 47034, 47035, + 47036, 47037, 47038, 47039, 47040, 47041, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47042, 47043, 47044, 47045, 47046, 47048, 47050, 47051, + 47052, 47053, 47054, 47055, 47056, 47057, 47058, 47059, 47060, 47061, + 47062, 47063, 47064, 47065, 47066, 47067, 47068, 47069, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47070, 47071, 47072, 47073, 47074, 47075, + 47076, 47077, 47078, 47079, 47080, 47081, 47082, 47083, 47086, 47087, + 47089, 47090, 47091, 47093, 47094, 47095, 47096, 47097, 47098, 47099, + 47102, 47106, 47107, 47108, 47109, 47110, 47114, 47115, 47117, 47118, + 47119, 47121, 47122, 47123, 47124, 47125, 47126, 47127, 47130, 47132, + 47134, 47135, 47136, 47137, 47138, 47139, 47142, 47143, 47145, 47146, + 47147, 47149, 47150, 47151, 47152, 47153, 47154, 47155, 47158, 47162, + 47163, 47164, 47165, 47166, 47167, 47169, 47170, 47171, 47173, 47174, + 47175, 47176, 47177, 47178, 47179, 47180, 47181, 47182, 47183, 47184, + 47186, 47188, 47189, 47190, 47191, 47192, 47193, 47194, 47195, 47198, + 47199, 47201, 47202, 47203, 47205, 47206, 47207, 47208, 47209, 47210, + 47211, 47214, 47216, 47218, 47219, 47220, 47221, 47222, 47223, 47225, + 47226, 47227, 47229, 47230, 47231, 47232, 47233, 47234, 47235, 47236, + 47237, 47238, 47239, 47240, 47241, 47242, 47243, 47244, 47246, 47247, + 47248, 47249, 47250, 47251, 47252, 47253, 47254, 47255, 47256, 47257, + 47258, 47259, 47260, 47261, 47262, 47263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47264, 47265, 47266, 47267, 47268, 47269, 47270, 47271, + 47273, 47274, 47275, 47276, 47277, 47278, 47279, 47281, 47282, 47283, + 47285, 47286, 47287, 47289, 47290, 47291, 47292, 47293, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47294, 47295, 47298, 47300, 47302, 47303, + 47304, 47305, 47306, 47307, 47309, 47310, 47311, 47313, 47314, 47315, + 47317, 47318, 47319, 47320, 47321, 47322, 47323, 47324, 47326, 47328, + 47330, 47331, 47332, 47333, 47334, 47335, 47338, 47339, 47341, 47342, + 47343, 47345, 47346, 47347, 47348, 47349, 47350, 47351, 47354, 47356, + 47358, 47359, 47360, 47361, 47362, 47363, 47365, 47366, 47367, 47368, + 47369, 47370, 47371, 47372, 47373, 47374, 47375, 47376, 47377, 47378, + 47379, 47380, 47381, 47382, 47383, 47385, 47386, 47387, 47388, 47389, + 47390, 47391, 47393, 47394, 47395, 47396, 47397, 47398, 47399, 47400, + 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47409, 47410, + 47411, 47412, 47413, 47414, 47415, 47416, 47417, 47418, 47419, 47422, + 47423, 47425, 47426, 47427, 47429, 47430, 47431, 47432, 47433, 47434, + 47435, 47437, 47438, 47440, 47442, 47443, 47444, 47445, 47446, 47447, + 47450, 47451, 47453, 47454, 47455, 47457, 47458, 47459, 47460, 47461, + 47462, 47463, 47466, 47468, 47470, 47471, 47472, 47473, 47474, 47475, + 47478, 47479, 47481, 47482, 47483, 47485, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47486, 47487, 47488, 47489, 47490, 47491, 47494, 47496, + 47499, 47500, 47503, 47504, 47505, 47506, 47507, 47508, 47509, 47510, + 47511, 47512, 47513, 47514, 47515, 47516, 47517, 47518, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47519, 47520, 47521, 47522, 47523, 47524, + 47525, 47526, 47527, 47528, 47529, 47530, 47531, 47534, 47535, 47537, + 47538, 47539, 47541, 47542, 47543, 47544, 47545, 47546, 47547, 47550, + 47552, 47554, 47555, 47556, 47557, 47558, 47559, 47562, 47563, 47565, + 47571, 47572, 47573, 47574, 47575, 47578, 47580, 47583, 47584, 47586, + 47590, 47591, 47593, 47594, 47595, 47597, 47598, 47599, 47600, 47601, + 47602, 47603, 47606, 47611, 47612, 47613, 47614, 47615, 47618, 47619, + 47620, 47621, 47622, 47623, 47625, 47626, 47627, 47628, 47629, 47630, + 47631, 47632, 47633, 47634, 47635, 47636, 47638, 47639, 47640, 47641, + 47642, 47643, 47644, 47645, 47646, 47647, 47648, 47649, 47650, 47651, + 47652, 47653, 47654, 47655, 47656, 47657, 47658, 47659, 47660, 47661, + 47662, 47663, 47664, 47665, 47666, 47667, 47668, 47669, 47670, 47671, + 47674, 47675, 47677, 47678, 47679, 47681, 47683, 47684, 47685, 47686, + 47687, 47690, 47692, 47695, 47696, 47697, 47698, 47702, 47703, 47705, + 47706, 47707, 47709, 47710, 47711, 47712, 47713, 47714, 47715, 47718, + 47722, 47723, 47724, 47725, 47726, 47727, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47730, 47731, 47733, 47734, 47735, 47737, 47738, 47739, + 47740, 47741, 47742, 47743, 47744, 47745, 47746, 47750, 47752, 47753, + 47754, 47755, 47757, 47758, 47759, 47760, 47761, 47762, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47763, 47764, 47765, 47766, 47767, 47768, + 47769, 47770, 47771, 47772, 47773, 47774, 47775, 47776, 47777, 47778, + 47779, 47780, 47781, 47782, 47783, 47786, 47789, 47790, 47791, 47793, + 47795, 47796, 47797, 47798, 47799, 47802, 47804, 47806, 47807, 47808, + 47809, 47810, 47811, 47813, 47814, 47815, 47817, 47818, 47819, 47820, + 47821, 47822, 47823, 47824, 47825, 47826, 47827, 47828, 47829, 47830, + 47831, 47834, 47835, 47836, 47837, 47838, 47839, 47840, 47841, 47842, + 47843, 47844, 47845, 47846, 47847, 47848, 47849, 47850, 47851, 47852, + 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, + 47863, 47864, 47865, 47866, 47867, 47869, 47870, 47871, 47873, 47874, + 47875, 47877, 47878, 47879, 47880, 47881, 47882, 47883, 47884, 47886, + 47888, 47890, 47891, 47892, 47893, 47894, 47895, 47897, 47898, 47899, + 47901, 47902, 47903, 47905, 47906, 47907, 47908, 47909, 47910, 47911, + 47912, 47914, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, + 47927, 47929, 47930, 47935, 47936, 47937, 47938, 47939, 47942, 47944, + 47946, 47947, 47948, 47950, 47953, 47954, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47955, 47957, 47958, 47959, 47961, 47962, 47963, 47964, + 47965, 47966, 47967, 47968, 47970, 47972, 47973, 47974, 47975, 47976, + 47977, 47978, 47979, 47981, 47982, 47983, 47984, 47985, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47986, 47987, 47988, 47989, 47990, 47991, + 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, + 48002, 48003, 48004, 48005, 48006, 48007, 48009, 48010, 48011, 48013, + 48014, 48015, 48017, 48018, 48019, 48020, 48021, 48022, 48023, 48024, + 48025, 48026, 48027, 48028, 48029, 48030, 48031, 48032, 48033, 48034, + 48035, 48037, 48038, 48039, 48041, 48042, 48043, 48045, 48046, 48047, + 48048, 48049, 48050, 48051, 48053, 48054, 48056, 48057, 48058, 48059, + 48060, 48061, 48062, 48063, 48065, 48066, 48067, 48069, 48070, 48071, + 48073, 48074, 48075, 48076, 48077, 48078, 48079, 48081, 48082, 48084, + 48085, 48086, 48087, 48088, 48089, 48090, 48091, 48092, 48093, 48094, + 48095, 48096, 48097, 48098, 48099, 48100, 48101, 48102, 48103, 48104, + 48105, 48106, 48107, 48108, 48109, 48110, 48111, 48112, 48113, 48114, + 48115, 48116, 48117, 48118, 48119, 48122, 48123, 48125, 48126, 48129, + 48131, 48132, 48133, 48134, 48135, 48138, 48142, 48144, 48146, 48147, + 48153, 48154, 48160, 48161, 48162, 48163, 48166, 48168, 48170, 48171, + 48172, 48174, 48175, 48178, 48179, 48181, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48182, 48183, 48185, 48186, 48187, 48188, 48189, 48190, + 48191, 48194, 48198, 48199, 48200, 48202, 48203, 48206, 48207, 48209, + 48210, 48211, 48212, 48213, 48214, 48215, 48216, 48217, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48218, 48219, 48220, 48222, 48223, 48224, + 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, + 48235, 48236, 48237, 48238, 48239, 48240, 48241, 48242, 48243, 48244, + 48245, 48246, 48247, 48248, 48249, 48250, 48251, 48252, 48253, 48254, + 48255, 48256, 48257, 48258, 48259, 48262, 48263, 48265, 48266, 48269, + 48271, 48272, 48273, 48274, 48275, 48278, 48280, 48283, 48284, 48285, + 48286, 48287, 48290, 48291, 48293, 48294, 48297, 48298, 48299, 48300, + 48301, 48302, 48303, 48306, 48310, 48311, 48312, 48313, 48314, 48315, + 48318, 48319, 48321, 48322, 48323, 48325, 48326, 48327, 48328, 48329, + 48330, 48331, 48332, 48334, 48338, 48339, 48340, 48342, 48343, 48345, + 48346, 48347, 48349, 48350, 48351, 48352, 48353, 48354, 48355, 48356, + 48357, 48358, 48359, 48360, 48361, 48362, 48363, 48364, 48365, 48366, + 48367, 48368, 48369, 48370, 48371, 48375, 48377, 48378, 48379, 48381, + 48382, 48383, 48384, 48385, 48386, 48387, 48390, 48392, 48394, 48395, + 48396, 48397, 48398, 48399, 48401, 48402, 48403, 48405, 48406, 48407, + 48408, 48409, 48410, 48411, 48412, 48413, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48414, 48415, 48416, 48417, 48418, 48419, 48421, 48422, + 48423, 48424, 48425, 48426, 48427, 48429, 48430, 48431, 48432, 48433, + 48434, 48435, 48436, 48437, 48438, 48439, 48440, 48441, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48442, 48443, 48444, 48445, 48446, 48447, + 48449, 48450, 48451, 48452, 48453, 48454, 48455, 48458, 48459, 48461, + 48462, 48463, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48474, + 48475, 48476, 48477, 48478, 48479, 48480, 48481, 48482, 48483, 48485, + 48486, 48487, 48489, 48490, 48491, 48492, 48493, 48494, 48495, 48496, + 48497, 48498, 48499, 48500, 48501, 48502, 48503, 48504, 48505, 48506, + 48507, 48508, 48509, 48510, 48511, 48514, 48515, 48517, 48518, 48523, + 48524, 48525, 48526, 48527, 48530, 48532, 48534, 48535, 48536, 48539, + 48541, 48542, 48543, 48544, 48545, 48546, 48547, 48549, 48550, 48551, + 48552, 48553, 48554, 48555, 48556, 48557, 48558, 48559, 48561, 48562, + 48563, 48564, 48565, 48566, 48567, 48569, 48570, 48571, 48572, 48573, + 48574, 48575, 48576, 48577, 48578, 48579, 48580, 48581, 48582, 48583, + 48584, 48585, 48586, 48587, 48588, 48589, 48590, 48591, 48592, 48593, + 48594, 48595, 48598, 48599, 48601, 48602, 48603, 48605, 48606, 48607, + 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48618, + 48619, 48620, 48621, 48622, 48623, 48625, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48626, 48627, 48629, 48630, 48631, 48633, 48634, 48635, + 48636, 48637, 48638, 48639, 48641, 48642, 48644, 48646, 48647, 48648, + 48649, 48650, 48651, 48654, 48655, 48657, 48658, 48659, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48661, 48662, 48663, 48664, 48665, 48666, + 48667, 48670, 48672, 48673, 48674, 48675, 48676, 48677, 48678, 48679, + 48680, 48681, 48682, 48683, 48684, 48685, 48686, 48687, 48688, 48689, + 48690, 48691, 48692, 48693, 48694, 48695, 48696, 48697, 48698, 48699, + 48700, 48701, 48702, 48703, 48704, 48705, 48706, 48707, 48710, 48711, + 48713, 48714, 48715, 48717, 48719, 48720, 48721, 48722, 48723, 48726, + 48728, 48732, 48733, 48734, 48735, 48738, 48739, 48741, 48742, 48743, + 48745, 48747, 48748, 48749, 48750, 48751, 48754, 48758, 48759, 48760, + 48761, 48762, 48766, 48767, 48769, 48770, 48771, 48773, 48774, 48775, + 48776, 48777, 48778, 48779, 48782, 48786, 48787, 48788, 48789, 48790, + 48791, 48794, 48795, 48796, 48797, 48798, 48799, 48800, 48801, 48802, + 48803, 48804, 48805, 48806, 48807, 48809, 48810, 48811, 48812, 48813, + 48814, 48815, 48816, 48817, 48818, 48819, 48820, 48821, 48822, 48823, + 48824, 48825, 48826, 48827, 48828, 48829, 48830, 48831, 48832, 48833, + 48834, 48835, 48836, 48837, 48838, 48839, 48840, 48841, 48842, 48843, + 48844, 48845, 48846, 48847, 48850, 48851, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48853, 48854, 48857, 48858, 48859, 48860, 48861, 48862, + 48863, 48865, 48866, 48870, 48871, 48872, 48873, 48874, 48875, 48877, + 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48886, 48887, 48888, 48889, 48890, 48891, + 48892, 48893, 48894, 48895, 48896, 48898, 48899, 48900, 48901, 48902, + 48903, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48914, + 48915, 48916, 48917, 48918, 48919, 48922, 48926, 48927, 48928, 48929, + 48930, 48931, 48932, 48933, 48934, 48935, 48936, 48937, 48938, 48939, + 48940, 48941, 48942, 48943, 48944, 48945, 48946, 48947, 48948, 48949, + 48950, 48951, 48952, 48953, 48954, 48955, 48956, 48957, 48958, 48959, + 48962, 48963, 48965, 48966, 48967, 48969, 48970, 48971, 48972, 48973, + 48974, 48975, 48978, 48979, 48980, 48982, 48983, 48984, 48985, 48986, + 48987, 48988, 48989, 48990, 48991, 48992, 48993, 48994, 48995, 48996, + 48997, 48998, 48999, 49000, 49001, 49002, 49003, 49004, 49005, 49006, + 49007, 49008, 49009, 49010, 49011, 49012, 49013, 49014, 49015, 49016, + 49017, 49018, 49019, 49020, 49021, 49022, 49023, 49024, 49025, 49026, + 49027, 49028, 49029, 49030, 49031, 49032, 49033, 49034, 49035, 49036, + 49037, 49038, 49039, 49040, 49041, 49042, 49043, 49045, 49046, 49047, + 49048, 49049, 49050, 49051, 49052, 49053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49054, 49055, 49056, 49057, 49058, 49059, 49060, 49061, + 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, + 49073, 49074, 49075, 49076, 49077, 49078, 49079, 49080, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49081, 49082, 49083, 49084, 49085, 49086, + 49087, 49088, 49089, 49090, 49091, 49092, 49094, 49095, 49096, 49097, + 49098, 49099, 49102, 49103, 49105, 49106, 49107, 49109, 49110, 49111, + 49112, 49113, 49114, 49115, 49117, 49118, 49120, 49122, 49123, 49124, + 49125, 49126, 49127, 49128, 49129, 49130, 49131, 49132, 49133, 49134, + 49135, 49136, 49137, 49138, 49139, 49140, 49141, 49142, 49143, 49144, + 49145, 49146, 49147, 49148, 49149, 49150, 49151, 49152, 49153, 49154, + 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49162, 49163, 49164, + 49165, 49166, 49167, 49168, 49169, 49170, 49171, 49172, 49173, 49174, + 49175, 49176, 49177, 49178, 49179, 49180, 49181, 49182, 49183, 49184, + 49185, 49186, 49187, 49188, 49189, 49190, 49191, 49192, 49193, 49194, + 49195, 49196, 49197, 49198, 49199, 49200, 49201, 49202, 49203, 49204, + 49205, 49206, 49207, 49208, 49209, 49210, 49211, 49213, 49214, 49215, + 49216, 49217, 49218, 49219, 49220, 49221, 49222, 49223, 49224, 49225, + 49226, 49227, 49228, 49229, 49230, 49231, 49232, 49234, 49235, 49236, + 49237, 49238, 49239, 49241, 49242, 49243, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49245, 49246, 49247, 49249, 49250, 49251, 49252, 49253, + 49254, 49255, 49258, 49259, 49260, 49261, 49262, 49263, 49264, 49265, + 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49273, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49274, 49275, 49276, 49277, 49278, 49279, + 49280, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, + 49290, 49291, 49292, 49293, 49294, 49295, 49298, 49299, 49301, 49302, + 49303, 49305, 49306, 49307, 49308, 49309, 49310, 49311, 49314, 49316, + 49318, 49319, 49320, 49321, 49322, 49323, 49326, 49329, 49330, 49335, + 49336, 49337, 49338, 49339, 49342, 49346, 49347, 49348, 49350, 49351, + 49354, 49355, 49357, 49358, 49359, 49361, 49362, 49363, 49364, 49365, + 49366, 49367, 49370, 49374, 49375, 49376, 49377, 49378, 49379, 49382, + 49383, 49385, 49386, 49387, 49389, 49390, 49391, 49392, 49393, 49394, + 49395, 49398, 49400, 49402, 49403, 49404, 49405, 49406, 49407, 49409, + 49410, 49411, 49413, 49414, 49415, 49417, 49418, 49419, 49420, 49421, + 49422, 49423, 49425, 49426, 49427, 49428, 49430, 49431, 49432, 49433, + 49434, 49435, 49441, 49442, 49445, 49448, 49449, 49450, 49451, 49454, + 49458, 49459, 49460, 49461, 49463, 49466, 49467, 49469, 49470, 49471, + 49473, 49474, 49475, 49476, 49477, 49478, 49479, 49482, 49486, 49487, + 49488, 49489, 49490, 49491, 49494, 49495, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49497, 49498, 49499, 49501, 49502, 49503, 49504, 49505, + 49506, 49507, 49510, 49514, 49515, 49516, 49517, 49518, 49519, 49521, + 49522, 49523, 49525, 49526, 49527, 49529, 49530, 49531, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49532, 49533, 49534, 49535, 49536, 49537, + 49538, 49539, 49540, 49542, 49543, 49544, 49545, 49546, 49547, 49551, + 49553, 49554, 49555, 49557, 49559, 49560, 49561, 49562, 49563, 49566, + 49568, 49570, 49571, 49572, 49574, 49575, 49578, 49579, 49581, 49582, + 49583, 49585, 49586, 49587, 49588, 49589, 49590, 49591, 49592, 49593, + 49594, 49595, 49596, 49598, 49599, 49600, 49601, 49602, 49603, 49605, + 49606, 49607, 49609, 49610, 49611, 49613, 49614, 49615, 49616, 49617, + 49618, 49619, 49621, 49622, 49625, 49626, 49627, 49628, 49629, 49630, + 49631, 49633, 49634, 49635, 49637, 49638, 49639, 49641, 49642, 49643, + 49644, 49645, 49646, 49647, 49650, 49652, 49653, 49654, 49655, 49656, + 49657, 49658, 49659, 49662, 49663, 49665, 49666, 49667, 49669, 49670, + 49671, 49672, 49673, 49674, 49675, 49678, 49680, 49682, 49683, 49684, + 49685, 49686, 49687, 49690, 49691, 49693, 49694, 49697, 49698, 49699, + 49700, 49701, 49702, 49703, 49706, 49708, 49710, 49712, 49715, 49717, + 49718, 49719, 49720, 49721, 49722, 49723, 49724, 49725, 49726, 49727, + 49728, 49729, 49730, 49731, 49732, 49733, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49734, 49735, 49737, 49738, 49739, 49740, 49741, 49742, + 49743, 49746, 49747, 49749, 49750, 49751, 49753, 49754, 49755, 49756, + 49757, 49758, 49759, 49761, 49762, 49763, 49764, 49766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49767, 49768, 49769, 49770, 49771, 49774, + 49775, 49777, 49778, 49779, 49781, 49782, 49783, 49784, 49785, 49786, + 49787, 49790, 49792, 49794, 49795, 49796, 49797, 49798, 49799, 49802, + 49803, 49804, 49805, 49806, 49807, 49809, 49810, 49811, 49812, 49813, + 49814, 49815, 49817, 49818, 49820, 49822, 49823, 49824, 49825, 49826, + 49827, 49830, 49831, 49833, 49834, 49835, 49838, 49839, 49840, 49841, + 49842, 49843, 49846, 49848, 49850, 49851, 49852, 49853, 49854, 49855, + 49856, 49857, 49858, 49859, 49860, 49861, 49862, 49863, 49864, 49865, + 49866, 49867, 49868, 49869, 49870, 49871, 49872, 49873, 49874, 49875, + 49876, 49877, 49878, 49879, 49880, 49881, 49882, 49883, 49886, 49887, + 49889, 49890, 49893, 49894, 49895, 49896, 49897, 49898, 49902, 49904, + 49906, 49907, 49908, 49909, 49911, 49914, 49917, 49918, 49919, 49921, + 49922, 49923, 49924, 49925, 49926, 49927, 49930, 49931, 49934, 49935, + 49936, 49937, 49938, 49942, 49943, 49945, 49946, 49947, 49949, 49950, + 49951, 49952, 49953, 49954, 49955, 49958, 49959, 49962, 49963, 49964, + 49965, 49966, 49967, 49968, 49969, 49970, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49971, 49972, 49973, 49974, 49975, 49976, 49977, 49978, + 49979, 49980, 49981, 49982, 49983, 49984, 49985, 49986, 49987, 49988, + 49990, 49991, 49992, 49993, 49994, 49995, 49996, 49997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49998, 49999, 50000, 50001, 50002, 50003, + 50004, 50005, 50006, 50007, 50008, 50009, 50010, 50011, 50012, 50013, + 50014, 50015, 50016, 50017, 50018, 50019, 50020, 50021, 50022, 50023, + 50026, 50027, 50029, 50030, 50031, 50033, 50035, 50036, 50037, 50038, + 50039, 50042, 50043, 50046, 50047, 50048, 50049, 50050, 50051, 50053, + 50054, 50055, 50057, 50058, 50059, 50061, 50062, 50063, 50064, 50065, + 50066, 50067, 50068, 50069, 50070, 50071, 50072, 50073, 50074, 50075, + 50076, 50077, 50078, 50079, 50080, 50081, 50082, 50083, 50084, 50085, + 50086, 50087, 50088, 50089, 50090, 50091, 50092, 50093, 50094, 50095, + 50096, 50097, 50098, 50099, 50100, 50101, 50102, 50103, 50104, 50105, + 50106, 50107, 50108, 50109, 50110, 50111, 50113, 50114, 50115, 50116, + 50117, 50118, 50119, 50120, 50121, 50122, 50123, 50124, 50125, 50126, + 50127, 50128, 50129, 50130, 50131, 50132, 50133, 50134, 50135, 50138, + 50139, 50141, 50142, 50145, 50147, 50148, 50149, 50150, 50151, 50154, + 50155, 50156, 50158, 50159, 50160, 50161, 50162, 50163, 50166, 50167, + 50169, 50170, 50171, 50172, 50173, 50174, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50175, 50176, 50177, 50178, 50179, 50180, 50181, 50182, + 50183, 50185, 50186, 50187, 50188, 50189, 50190, 50191, 50193, 50194, + 50195, 50196, 50197, 50198, 50199, 50200, 50201, 50202, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50203, 50204, 50205, 50206, 50207, 50208, + 50209, 50210, 50211, 50213, 50214, 50215, 50216, 50217, 50218, 50219, + 50221, 50222, 50223, 50225, 50226, 50227, 50229, 50230, 50231, 50232, + 50233, 50234, 50235, 50238, 50239, 50240, 50241, 50242, 50243, 50244, + 50245, 50246, 50247, 50249, 50250, 50251, 50252, 50253, 50254, 50255, + 50256, 50257, 50258, 50259, 50260, 50261, 50262, 50263, 50264, 50265, + 50266, 50267, 50268, 50269, 50270, 50271, 50272, 50273, 50274, 50275, + 50278, 50279, 50281, 50282, 50283, 50285, 50286, 50287, 50288, 50289, + 50290, 50291, 50294, 50295, 50296, 50298, 50299, 50300, 50301, 50302, + 50303, 50305, 50306, 50307, 50308, 50309, 50310, 50311, 50312, 50313, + 50314, 50315, 50316, 50317, 50318, 50319, 50320, 50321, 50322, 50323, + 50325, 50326, 50327, 50328, 50329, 50330, 50331, 50333, 50334, 50335, + 50336, 50337, 50338, 50339, 50340, 50341, 50342, 50343, 50344, 50345, + 50346, 50347, 50348, 50349, 50350, 50351, 50352, 50353, 50354, 50355, + 50356, 50357, 50358, 50359, 50361, 50362, 50363, 50365, 50366, 50367, + 50368, 50369, 50370, 50371, 50372, 50373, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50374, 50375, 50376, 50377, 50378, 50379, 50380, 50381, + 50382, 50383, 50384, 50385, 50386, 50387, 50388, 50389, 50390, 50391, + 50392, 50393, 50394, 50395, 50396, 50397, 50398, 50399, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50400, 50401, 50402, 50403, 50404, 50405, + 50406, 50407, 50408, 50410, 50411, 50412, 50413, 50414, 50415, 50418, + 50419, 50421, 50422, 50423, 50425, 50427, 50428, 50429, 50430, 50434, + 50435, 50436, 50437, 50438, 50439, 50440, 50441, 50442, 50443, 50445, + 50446, 50447, 50449, 50450, 50451, 50453, 50454, 50455, 50456, 50457, + 50458, 50459, 50461, 50462, 50463, 50464, 50465, 50466, 50467, 50468, + 50469, 50470, 50471, 50474, 50475, 50477, 50478, 50479, 50481, 50482, + 50483, 50484, 50485, 50486, 50487, 50490, 50492, 50494, 50495, 50496, + 50497, 50498, 50499, 50502, 50503, 50507, 50511, 50512, 50513, 50514, + 50518, 50522, 50523, 50524, 50527, 50530, 50531, 50533, 50534, 50535, + 50537, 50538, 50539, 50540, 50541, 50542, 50543, 50546, 50550, 50551, + 50552, 50553, 50554, 50555, 50558, 50559, 50561, 50562, 50563, 50565, + 50566, 50568, 50569, 50570, 50571, 50574, 50576, 50578, 50579, 50580, + 50582, 50585, 50586, 50587, 50589, 50590, 50591, 50593, 50594, 50595, + 50596, 50597, 50598, 50599, 50600, 50602, 50603, 50604, 50605, 50606, + 50607, 50608, 50609, 50610, 50611, 50614, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50615, 50618, 50623, 50624, 50625, 50626, 50627, 50635, + 50637, 50639, 50642, 50643, 50645, 50646, 50647, 50649, 50650, 50651, + 50652, 50653, 50654, 50655, 50658, 50660, 50662, 50663, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50664, 50665, 50666, 50667, 50671, 50673, + 50674, 50675, 50677, 50680, 50681, 50682, 50683, 50690, 50691, 50692, + 50697, 50698, 50699, 50701, 50702, 50703, 50705, 50706, 50707, 50708, + 50709, 50710, 50711, 50714, 50717, 50718, 50719, 50720, 50721, 50722, + 50723, 50726, 50727, 50729, 50730, 50731, 50735, 50737, 50738, 50742, + 50744, 50746, 50748, 50749, 50750, 50751, 50754, 50755, 50757, 50758, + 50759, 50761, 50762, 50763, 50764, 50765, 50766, 50767, 50770, 50774, + 50775, 50776, 50777, 50778, 50779, 50782, 50783, 50785, 50786, 50787, + 50788, 50789, 50790, 50791, 50792, 50793, 50794, 50795, 50797, 50798, + 50800, 50802, 50803, 50804, 50805, 50806, 50807, 50810, 50811, 50813, + 50814, 50815, 50817, 50818, 50819, 50820, 50821, 50822, 50823, 50826, + 50828, 50830, 50831, 50832, 50833, 50834, 50835, 50838, 50839, 50841, + 50842, 50843, 50845, 50846, 50847, 50848, 50849, 50850, 50851, 50854, + 50856, 50858, 50859, 50860, 50861, 50862, 50863, 50866, 50867, 50869, + 50870, 50871, 50875, 50876, 50877, 50878, 50879, 50882, 50884, 50886, + 50887, 50888, 50889, 50890, 50891, 50894, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50895, 50897, 50898, 50899, 50901, 50902, 50903, 50904, + 50905, 50906, 50907, 50910, 50911, 50914, 50915, 50916, 50917, 50918, + 50919, 50922, 50923, 50925, 50926, 50927, 50929, 50930, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50931, 50932, 50933, 50934, 50935, 50938, + 50939, 50940, 50942, 50943, 50944, 50945, 50946, 50947, 50950, 50951, + 50953, 50954, 50955, 50957, 50958, 50959, 50960, 50961, 50962, 50963, + 50966, 50968, 50970, 50971, 50972, 50973, 50974, 50975, 50978, 50979, + 50981, 50982, 50983, 50985, 50986, 50987, 50988, 50989, 50990, 50991, + 50994, 50996, 50998, 51000, 51001, 51002, 51003, 51006, 51007, 51009, + 51010, 51011, 51013, 51014, 51015, 51016, 51017, 51019, 51022, 51024, + 51033, 51034, 51035, 51037, 51038, 51039, 51041, 51042, 51043, 51044, + 51045, 51046, 51047, 51049, 51050, 51052, 51053, 51054, 51055, 51056, + 51057, 51058, 51059, 51062, 51063, 51065, 51066, 51067, 51071, 51072, + 51073, 51074, 51078, 51083, 51084, 51085, 51087, 51090, 51091, 51093, + 51097, 51099, 51100, 51101, 51102, 51103, 51106, 51111, 51112, 51113, + 51114, 51115, 51118, 51119, 51121, 51122, 51123, 51125, 51126, 51127, + 51128, 51129, 51130, 51131, 51134, 51138, 51139, 51140, 51141, 51142, + 51143, 51146, 51147, 51149, 51151, 51153, 51154, 51155, 51156, 51157, + 51158, 51159, 51161, 51162, 51163, 51164, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51166, 51167, 51168, 51169, 51170, 51171, 51173, 51174, + 51175, 51177, 51178, 51179, 51181, 51182, 51183, 51184, 51185, 51186, + 51187, 51188, 51189, 51190, 51191, 51192, 51193, 51194, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51195, 51196, 51197, 51198, 51199, 51202, + 51203, 51205, 51206, 51207, 51209, 51211, 51212, 51213, 51214, 51215, + 51218, 51220, 51223, 51224, 51225, 51226, 51227, 51230, 51231, 51233, + 51234, 51235, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51246, + 51248, 51250, 51251, 51252, 51253, 51254, 51255, 51257, 51258, 51259, + 51261, 51262, 51263, 51265, 51266, 51267, 51268, 51269, 51270, 51271, + 51274, 51275, 51278, 51279, 51280, 51281, 51282, 51283, 51285, 51286, + 51287, 51288, 51289, 51290, 51291, 51292, 51293, 51294, 51295, 51296, + 51297, 51298, 51299, 51300, 51301, 51302, 51303, 51304, 51305, 51306, + 51307, 51308, 51309, 51310, 51311, 51314, 51315, 51317, 51318, 51319, + 51321, 51323, 51324, 51325, 51326, 51327, 51330, 51332, 51336, 51337, + 51338, 51342, 51343, 51344, 51345, 51346, 51347, 51349, 51350, 51351, + 51352, 51353, 51354, 51355, 51356, 51358, 51360, 51362, 51363, 51364, + 51365, 51366, 51367, 51369, 51370, 51371, 51372, 51373, 51374, 51375, + 51376, 51377, 51378, 51379, 51380, 51381, 51382, 51383, 51384, 51385, + 51386, 51387, 51390, 51391, 51392, 51393, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51394, 51395, 51397, 51398, 51399, 51401, 51402, 51403, + 51405, 51406, 51407, 51408, 51409, 51410, 51411, 51414, 51416, 51418, + 51419, 51420, 51421, 51422, 51423, 51426, 51427, 51429, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51430, 51431, 51432, 51433, 51434, 51435, + 51436, 51437, 51438, 51439, 51440, 51441, 51442, 51443, 51444, 51446, + 51447, 51448, 51449, 51450, 51451, 51454, 51455, 51457, 51458, 51459, + 51463, 51464, 51465, 51466, 51467, 51470, 12288, 12289, 12290, 183, + 8229, 8230, 168, 12291, 173, 8213, 8741, 65340, 8764, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12304, 12305, 177, 215, 247, 8800, 8804, + 8805, 8734, 8756, 176, 8242, 8243, 8451, 8491, 65504, 65505, + 65509, 9794, 9792, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 167, 8251, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, + 9632, 9651, 9650, 9661, 9660, 8594, 8592, 8593, 8595, 8596, + 12307, 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 8743, 8744, 65506, + 51472, 51474, 51475, 51476, 51477, 51478, 51479, 51481, 51482, 51483, + 51484, 51485, 51486, 51487, 51488, 51489, 51490, 51491, 51492, 51493, + 51494, 51495, 51496, 51497, 51498, 51499, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51501, 51502, 51503, 51504, 51505, 51506, 51507, 51509, + 51510, 51511, 51512, 51513, 51514, 51515, 51516, 51517, 51518, 51519, + 51520, 51521, 51522, 51523, 51524, 51525, 51526, 51527, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51528, 51529, 51530, 51531, 51532, 51533, + 51534, 51535, 51538, 51539, 51541, 51542, 51543, 51545, 51546, 51547, + 51548, 51549, 51550, 51551, 51554, 51556, 51557, 51558, 51559, 51560, + 51561, 51562, 51563, 51565, 51566, 51567, 8658, 8660, 8704, 8707, + 180, 65374, 711, 728, 733, 730, 729, 184, 731, 161, + 191, 720, 8750, 8721, 8719, 164, 8457, 8240, 9665, 9664, + 9655, 9654, 9828, 9824, 9825, 9829, 9831, 9827, 8857, 9672, + 9635, 9680, 9681, 9618, 9636, 9637, 9640, 9639, 9638, 9641, + 9832, 9743, 9742, 9756, 9758, 182, 8224, 8225, 8597, 8599, + 8601, 8598, 8600, 9837, 9833, 9834, 9836, 12927, 12828, 8470, + 13255, 8482, 13250, 13272, 8481, 8364, 174, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51569, 51570, 51571, 51573, 51574, 51575, 51576, 51577, 51578, 51579, + 51581, 51582, 51583, 51584, 51585, 51586, 51587, 51588, 51589, 51590, + 51591, 51594, 51595, 51597, 51598, 51599, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51601, 51602, 51603, 51604, 51605, 51606, 51607, 51610, + 51612, 51614, 51615, 51616, 51617, 51618, 51619, 51620, 51621, 51622, + 51623, 51624, 51625, 51626, 51627, 51628, 51629, 51630, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51631, 51632, 51633, 51634, 51635, 51636, + 51637, 51638, 51639, 51640, 51641, 51642, 51643, 51644, 51645, 51646, + 51647, 51650, 51651, 51653, 51654, 51657, 51659, 51660, 51661, 51662, + 51663, 51666, 51668, 51671, 51672, 51675, 65281, 65282, 65283, 65284, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65510, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 51678, 51679, 51681, 51683, 51685, 51686, 51688, 51689, 51690, 51691, + 51694, 51698, 51699, 51700, 51701, 51702, 51703, 51706, 51707, 51709, + 51710, 51711, 51713, 51714, 51715, 51716, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51717, 51718, 51719, 51722, 51726, 51727, 51728, 51729, + 51730, 51731, 51733, 51734, 51735, 51737, 51738, 51739, 51740, 51741, + 51742, 51743, 51744, 51745, 51746, 51747, 51748, 51749, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51750, 51751, 51752, 51754, 51755, 51756, + 51757, 51758, 51759, 51760, 51761, 51762, 51763, 51764, 51765, 51766, + 51767, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, + 51777, 51778, 51779, 51780, 51781, 51782, 12593, 12594, 12595, 12596, + 12597, 12598, 12599, 12600, 12601, 12602, 12603, 12604, 12605, 12606, + 12607, 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615, 12616, + 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, + 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 12636, + 12637, 12638, 12639, 12640, 12641, 12642, 12643, 12644, 12645, 12646, + 12647, 12648, 12649, 12650, 12651, 12652, 12653, 12654, 12655, 12656, + 12657, 12658, 12659, 12660, 12661, 12662, 12663, 12664, 12665, 12666, + 12667, 12668, 12669, 12670, 12671, 12672, 12673, 12674, 12675, 12676, + 12677, 12678, 12679, 12680, 12681, 12682, 12683, 12684, 12685, 12686, + 51783, 51784, 51785, 51786, 51787, 51790, 51791, 51793, 51794, 51795, + 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51806, 51810, 51811, + 51812, 51813, 51814, 51815, 51817, 51818, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51826, + 51827, 51828, 51829, 51830, 51831, 51832, 51833, 51834, 51835, 51836, + 51838, 51839, 51840, 51841, 51842, 51843, 51845, 51846, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51847, 51848, 51849, 51850, 51851, 51852, + 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, + 51863, 51865, 51866, 51867, 51868, 51869, 51870, 51871, 51872, 51873, + 51874, 51875, 51876, 51877, 51878, 51879, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, + 8553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, + 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 963, 964, 965, + 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, + 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, + 51902, 51903, 51905, 51906, 51907, 51909, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51910, 51911, 51912, 51913, 51914, 51915, 51918, 51920, + 51922, 51924, 51925, 51926, 51927, 51930, 51931, 51932, 51933, 51934, + 51935, 51937, 51938, 51939, 51940, 51941, 51942, 51943, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51944, 51945, 51946, 51947, 51949, 51950, + 51951, 51952, 51953, 51954, 51955, 51957, 51958, 51959, 51960, 51961, + 51962, 51963, 51964, 51965, 51966, 51967, 51968, 51969, 51970, 51971, + 51972, 51973, 51974, 51975, 51977, 51978, 9472, 9474, 9484, 9488, + 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, 9487, + 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, + 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, + 9498, 9497, 9494, 9493, 9486, 9485, 9502, 9503, 9505, 9506, + 9510, 9511, 9513, 9514, 9517, 9518, 9521, 9522, 9525, 9526, + 9529, 9530, 9533, 9534, 9536, 9537, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51979, 51980, 51981, 51982, 51983, 51985, 51986, 51987, 51989, 51990, + 51991, 51993, 51994, 51995, 51996, 51997, 51998, 51999, 52002, 52003, + 52004, 52005, 52006, 52007, 52008, 52009, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52010, 52011, 52012, 52013, 52014, 52015, 52016, 52017, + 52018, 52019, 52020, 52021, 52022, 52023, 52024, 52025, 52026, 52027, + 52028, 52029, 52030, 52031, 52032, 52034, 52035, 52036, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52037, 52038, 52039, 52042, 52043, 52045, + 52046, 52047, 52049, 52050, 52051, 52052, 52053, 52054, 52055, 52058, + 52059, 52060, 52062, 52063, 52064, 52065, 52066, 52067, 52069, 52070, + 52071, 52072, 52073, 52074, 52075, 52076, 13205, 13206, 13207, 8467, + 13208, 13252, 13219, 13220, 13221, 13222, 13209, 13210, 13211, 13212, + 13213, 13214, 13215, 13216, 13217, 13218, 13258, 13197, 13198, 13199, + 13263, 13192, 13193, 13256, 13223, 13224, 13232, 13233, 13234, 13235, + 13236, 13237, 13238, 13239, 13240, 13241, 13184, 13185, 13186, 13187, + 13188, 13242, 13243, 13244, 13245, 13246, 13247, 13200, 13201, 13202, + 13203, 13204, 8486, 13248, 13249, 13194, 13195, 13196, 13270, 13253, + 13229, 13230, 13231, 13275, 13225, 13226, 13227, 13228, 13277, 13264, + 13267, 13251, 13257, 13276, 13254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52077, 52078, 52079, 52080, 52081, 52082, 52083, 52084, 52085, 52086, + 52087, 52090, 52091, 52092, 52093, 52094, 52095, 52096, 52097, 52098, + 52099, 52100, 52101, 52102, 52103, 52104, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52105, 52106, 52107, 52108, 52109, 52110, 52111, 52112, + 52113, 52114, 52115, 52116, 52117, 52118, 52119, 52120, 52121, 52122, + 52123, 52125, 52126, 52127, 52128, 52129, 52130, 52131, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52132, 52133, 52134, 52135, 52136, 52137, + 52138, 52139, 52140, 52141, 52142, 52143, 52144, 52145, 52146, 52147, + 52148, 52149, 52150, 52151, 52153, 52154, 52155, 52156, 52157, 52158, + 52159, 52160, 52161, 52162, 52163, 52164, 198, 208, 170, 294, + 0x0000, 306, 0x0000, 319, 321, 216, 338, 186, 222, 358, + 330, 0x0000, 12896, 12897, 12898, 12899, 12900, 12901, 12902, 12903, + 12904, 12905, 12906, 12907, 12908, 12909, 12910, 12911, 12912, 12913, + 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, + 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, + 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, + 9444, 9445, 9446, 9447, 9448, 9449, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, + 9326, 189, 8531, 8532, 188, 190, 8539, 8540, 8541, 8542, + 52165, 52166, 52167, 52168, 52169, 52170, 52171, 52172, 52173, 52174, + 52175, 52176, 52177, 52178, 52179, 52181, 52182, 52183, 52184, 52185, + 52186, 52187, 52188, 52189, 52190, 52191, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52192, 52193, 52194, 52195, 52197, 52198, 52200, 52202, + 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, + 52213, 52214, 52215, 52216, 52217, 52218, 52219, 52220, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52221, 52222, 52223, 52224, 52225, 52226, + 52227, 52228, 52229, 52230, 52231, 52232, 52233, 52234, 52235, 52238, + 52239, 52241, 52242, 52243, 52245, 52246, 52247, 52248, 52249, 52250, + 52251, 52254, 52255, 52256, 52259, 52260, 230, 273, 240, 295, + 305, 307, 312, 320, 322, 248, 339, 223, 254, 359, + 331, 329, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, + 12808, 12809, 12810, 12811, 12812, 12813, 12814, 12815, 12816, 12817, + 12818, 12819, 12820, 12821, 12822, 12823, 12824, 12825, 12826, 12827, + 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, + 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, + 9392, 9393, 9394, 9395, 9396, 9397, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, + 9346, 185, 178, 179, 8308, 8319, 8321, 8322, 8323, 8324, + 52261, 52262, 52266, 52267, 52269, 52271, 52273, 52274, 52275, 52276, + 52277, 52278, 52279, 52282, 52287, 52288, 52289, 52290, 52291, 52294, + 52295, 52297, 52298, 52299, 52301, 52302, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52303, 52304, 52305, 52306, 52307, 52310, 52314, 52315, + 52316, 52317, 52318, 52319, 52321, 52322, 52323, 52325, 52327, 52329, + 52330, 52331, 52332, 52333, 52334, 52335, 52337, 52338, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52339, 52340, 52342, 52343, 52344, 52345, + 52346, 52347, 52348, 52349, 52350, 52351, 52352, 52353, 52354, 52355, + 52356, 52357, 52358, 52359, 52360, 52361, 52362, 52363, 52364, 52365, + 52366, 52367, 52368, 52369, 52370, 52371, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52372, 52373, 52374, 52375, 52378, 52379, 52381, 52382, 52383, 52385, + 52386, 52387, 52388, 52389, 52390, 52391, 52394, 52398, 52399, 52400, + 52401, 52402, 52403, 52406, 52407, 52409, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52410, 52411, 52413, 52414, 52415, 52416, 52417, 52418, + 52419, 52422, 52424, 52426, 52427, 52428, 52429, 52430, 52431, 52433, + 52434, 52435, 52437, 52438, 52439, 52440, 52441, 52442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52443, 52444, 52445, 52446, 52447, 52448, + 52449, 52450, 52451, 52453, 52454, 52455, 52456, 52457, 52458, 52459, + 52461, 52462, 52463, 52465, 52466, 52467, 52468, 52469, 52470, 52471, + 52472, 52473, 52474, 52475, 52476, 52477, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52478, 52479, 52480, 52482, 52483, 52484, 52485, 52486, 52487, 52490, + 52491, 52493, 52494, 52495, 52497, 52498, 52499, 52500, 52501, 52502, + 52503, 52506, 52508, 52510, 52511, 52512, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52513, 52514, 52515, 52517, 52518, 52519, 52521, 52522, + 52523, 52525, 52526, 52527, 52528, 52529, 52530, 52531, 52532, 52533, + 52534, 52535, 52536, 52538, 52539, 52540, 52541, 52542, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52543, 52544, 52545, 52546, 52547, 52548, + 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52558, + 52559, 52560, 52561, 52562, 52563, 52564, 52565, 52566, 52567, 52568, + 52569, 52570, 52571, 52573, 52574, 52575, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52577, 52578, 52579, 52581, 52582, 52583, 52584, 52585, 52586, 52587, + 52590, 52592, 52594, 52595, 52596, 52597, 52598, 52599, 52601, 52602, + 52603, 52604, 52605, 52606, 52607, 52608, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52609, 52610, 52611, 52612, 52613, 52614, 52615, 52617, + 52618, 52619, 52620, 52621, 52622, 52623, 52624, 52625, 52626, 52627, + 52630, 52631, 52633, 52634, 52635, 52637, 52638, 52639, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52640, 52641, 52642, 52643, 52646, 52648, + 52650, 52651, 52652, 52653, 52654, 52655, 52657, 52658, 52659, 52660, + 52661, 52662, 52663, 52664, 52665, 52666, 52667, 52668, 52669, 52670, + 52671, 52672, 52673, 52674, 52675, 52677, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52678, 52679, 52680, 52681, 52682, 52683, 52685, 52686, 52687, 52689, + 52690, 52691, 52692, 52693, 52694, 52695, 52696, 52697, 52698, 52699, + 52700, 52701, 52702, 52703, 52704, 52705, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52706, 52707, 52708, 52709, 52710, 52711, 52713, 52714, + 52715, 52717, 52718, 52719, 52721, 52722, 52723, 52724, 52725, 52726, + 52727, 52730, 52732, 52734, 52735, 52736, 52737, 52738, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52739, 52741, 52742, 52743, 52745, 52746, + 52747, 52749, 52750, 52751, 52752, 52753, 52754, 52755, 52757, 52758, + 52759, 52760, 52762, 52763, 52764, 52765, 52766, 52767, 52770, 52771, + 52773, 52774, 52775, 52777, 52778, 52779, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52780, 52781, 52782, 52783, 52786, 52788, 52790, 52791, 52792, 52793, + 52794, 52795, 52796, 52797, 52798, 52799, 52800, 52801, 52802, 52803, + 52804, 52805, 52806, 52807, 52808, 52809, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52810, 52811, 52812, 52813, 52814, 52815, 52816, 52817, + 52818, 52819, 52820, 52821, 52822, 52823, 52826, 52827, 52829, 52830, + 52834, 52835, 52836, 52837, 52838, 52839, 52842, 52844, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52846, 52847, 52848, 52849, 52850, 52851, + 52854, 52855, 52857, 52858, 52859, 52861, 52862, 52863, 52864, 52865, + 52866, 52867, 52870, 52872, 52874, 52875, 52876, 52877, 52878, 52879, + 52882, 52883, 52885, 52886, 52887, 52889, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52890, 52891, 52892, 52893, 52894, 52895, 52898, 52902, 52903, 52904, + 52905, 52906, 52907, 52910, 52911, 52912, 52913, 52914, 52915, 52916, + 52917, 52918, 52919, 52920, 52921, 52922, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52923, 52924, 52925, 52926, 52927, 52928, 52930, 52931, + 52932, 52933, 52934, 52935, 52936, 52937, 52938, 52939, 52940, 52941, + 52942, 52943, 52944, 52945, 52946, 52947, 52948, 52949, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52950, 52951, 52952, 52953, 52954, 52955, + 52956, 52957, 52958, 52959, 52960, 52961, 52962, 52963, 52966, 52967, + 52969, 52970, 52973, 52974, 52975, 52976, 52977, 52978, 52979, 52982, + 52986, 52987, 52988, 52989, 52990, 52991, 44032, 44033, 44036, 44039, + 44040, 44041, 44042, 44048, 44049, 44050, 44051, 44052, 44053, 44054, + 44055, 44057, 44058, 44059, 44060, 44061, 44064, 44068, 44076, 44077, + 44079, 44080, 44081, 44088, 44089, 44092, 44096, 44107, 44109, 44116, + 44120, 44124, 44144, 44145, 44148, 44151, 44152, 44154, 44160, 44161, + 44163, 44164, 44165, 44166, 44169, 44170, 44171, 44172, 44176, 44180, + 44188, 44189, 44191, 44192, 44193, 44200, 44201, 44202, 44204, 44207, + 44208, 44216, 44217, 44219, 44220, 44221, 44225, 44228, 44232, 44236, + 44245, 44247, 44256, 44257, 44260, 44263, 44264, 44266, 44268, 44271, + 44272, 44273, 44275, 44277, 44278, 44284, 44285, 44288, 44292, 44294, + 52994, 52995, 52997, 52998, 52999, 53001, 53002, 53003, 53004, 53005, + 53006, 53007, 53010, 53012, 53014, 53015, 53016, 53017, 53018, 53019, + 53021, 53022, 53023, 53025, 53026, 53027, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53029, 53030, 53031, 53032, 53033, 53034, 53035, 53038, + 53042, 53043, 53044, 53045, 53046, 53047, 53049, 53050, 53051, 53052, + 53053, 53054, 53055, 53056, 53057, 53058, 53059, 53060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53061, 53062, 53063, 53064, 53065, 53066, + 53067, 53068, 53069, 53070, 53071, 53072, 53073, 53074, 53075, 53078, + 53079, 53081, 53082, 53083, 53085, 53086, 53087, 53088, 53089, 53090, + 53091, 53094, 53096, 53098, 53099, 53100, 44300, 44301, 44303, 44305, + 44312, 44316, 44320, 44329, 44332, 44333, 44340, 44341, 44344, 44348, + 44356, 44357, 44359, 44361, 44368, 44372, 44376, 44385, 44387, 44396, + 44397, 44400, 44403, 44404, 44405, 44406, 44411, 44412, 44413, 44415, + 44417, 44418, 44424, 44425, 44428, 44432, 44444, 44445, 44452, 44471, + 44480, 44481, 44484, 44488, 44496, 44497, 44499, 44508, 44512, 44516, + 44536, 44537, 44540, 44543, 44544, 44545, 44552, 44553, 44555, 44557, + 44564, 44592, 44593, 44596, 44599, 44600, 44602, 44608, 44609, 44611, + 44613, 44614, 44618, 44620, 44621, 44622, 44624, 44628, 44630, 44636, + 44637, 44639, 44640, 44641, 44645, 44648, 44649, 44652, 44656, 44664, + 53101, 53102, 53103, 53106, 53107, 53109, 53110, 53111, 53113, 53114, + 53115, 53116, 53117, 53118, 53119, 53121, 53122, 53123, 53124, 53126, + 53127, 53128, 53129, 53130, 53131, 53133, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53134, 53135, 53136, 53137, 53138, 53139, 53140, 53141, + 53142, 53143, 53144, 53145, 53146, 53147, 53148, 53149, 53150, 53151, + 53152, 53154, 53155, 53156, 53157, 53158, 53159, 53161, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53162, 53163, 53164, 53165, 53166, 53167, + 53169, 53170, 53171, 53172, 53173, 53174, 53175, 53176, 53177, 53178, + 53179, 53180, 53181, 53182, 53183, 53184, 53185, 53186, 53187, 53189, + 53190, 53191, 53192, 53193, 53194, 53195, 44665, 44667, 44668, 44669, + 44676, 44677, 44684, 44732, 44733, 44734, 44736, 44740, 44748, 44749, + 44751, 44752, 44753, 44760, 44761, 44764, 44776, 44779, 44781, 44788, + 44792, 44796, 44807, 44808, 44813, 44816, 44844, 44845, 44848, 44850, + 44852, 44860, 44861, 44863, 44865, 44866, 44867, 44872, 44873, 44880, + 44892, 44893, 44900, 44901, 44921, 44928, 44932, 44936, 44944, 44945, + 44949, 44956, 44984, 44985, 44988, 44992, 44999, 45000, 45001, 45003, + 45005, 45006, 45012, 45020, 45032, 45033, 45040, 45041, 45044, 45048, + 45056, 45057, 45060, 45068, 45072, 45076, 45084, 45085, 45096, 45124, + 45125, 45128, 45130, 45132, 45134, 45139, 45140, 45141, 45143, 45145, + 53196, 53197, 53198, 53199, 53200, 53201, 53202, 53203, 53204, 53205, + 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53215, + 53218, 53219, 53221, 53222, 53223, 53225, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53226, 53227, 53228, 53229, 53230, 53231, 53234, 53236, + 53238, 53239, 53240, 53241, 53242, 53243, 53245, 53246, 53247, 53249, + 53250, 53251, 53253, 53254, 53255, 53256, 53257, 53258, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53259, 53260, 53261, 53262, 53263, 53264, + 53266, 53267, 53268, 53269, 53270, 53271, 53273, 53274, 53275, 53276, + 53277, 53278, 53279, 53280, 53281, 53282, 53283, 53284, 53285, 53286, + 53287, 53288, 53289, 53290, 53291, 53292, 45149, 45180, 45181, 45184, + 45188, 45196, 45197, 45199, 45201, 45208, 45209, 45210, 45212, 45215, + 45216, 45217, 45218, 45224, 45225, 45227, 45228, 45229, 45230, 45231, + 45233, 45235, 45236, 45237, 45240, 45244, 45252, 45253, 45255, 45256, + 45257, 45264, 45265, 45268, 45272, 45280, 45285, 45320, 45321, 45323, + 45324, 45328, 45330, 45331, 45336, 45337, 45339, 45340, 45341, 45347, + 45348, 45349, 45352, 45356, 45364, 45365, 45367, 45368, 45369, 45376, + 45377, 45380, 45384, 45392, 45393, 45396, 45397, 45400, 45404, 45408, + 45432, 45433, 45436, 45440, 45442, 45448, 45449, 45451, 45453, 45458, + 45459, 45460, 45464, 45468, 45480, 45516, 45520, 45524, 45532, 45533, + 53294, 53295, 53296, 53297, 53298, 53299, 53302, 53303, 53305, 53306, + 53307, 53309, 53310, 53311, 53312, 53313, 53314, 53315, 53318, 53320, + 53322, 53323, 53324, 53325, 53326, 53327, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53329, 53330, 53331, 53333, 53334, 53335, 53337, 53338, + 53339, 53340, 53341, 53342, 53343, 53345, 53346, 53347, 53348, 53349, + 53350, 53351, 53352, 53353, 53354, 53355, 53358, 53359, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53361, 53362, 53363, 53365, 53366, 53367, + 53368, 53369, 53370, 53371, 53374, 53375, 53376, 53378, 53379, 53380, + 53381, 53382, 53383, 53384, 53385, 53386, 53387, 53388, 53389, 53390, + 53391, 53392, 53393, 53394, 53395, 53396, 45535, 45544, 45545, 45548, + 45552, 45561, 45563, 45565, 45572, 45573, 45576, 45579, 45580, 45588, + 45589, 45591, 45593, 45600, 45620, 45628, 45656, 45660, 45664, 45672, + 45673, 45684, 45685, 45692, 45700, 45701, 45705, 45712, 45713, 45716, + 45720, 45721, 45722, 45728, 45729, 45731, 45733, 45734, 45738, 45740, + 45744, 45748, 45768, 45769, 45772, 45776, 45778, 45784, 45785, 45787, + 45789, 45794, 45796, 45797, 45798, 45800, 45803, 45804, 45805, 45806, + 45807, 45811, 45812, 45813, 45815, 45816, 45817, 45818, 45819, 45823, + 45824, 45825, 45828, 45832, 45840, 45841, 45843, 45844, 45845, 45852, + 45908, 45909, 45910, 45912, 45915, 45916, 45918, 45919, 45924, 45925, + 53397, 53398, 53399, 53400, 53401, 53402, 53403, 53404, 53405, 53406, + 53407, 53408, 53409, 53410, 53411, 53414, 53415, 53417, 53418, 53419, + 53421, 53422, 53423, 53424, 53425, 53426, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53427, 53430, 53432, 53434, 53435, 53436, 53437, 53438, + 53439, 53442, 53443, 53445, 53446, 53447, 53450, 53451, 53452, 53453, + 53454, 53455, 53458, 53462, 53463, 53464, 53465, 53466, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53467, 53470, 53471, 53473, 53474, 53475, + 53477, 53478, 53479, 53480, 53481, 53482, 53483, 53486, 53490, 53491, + 53492, 53493, 53494, 53495, 53497, 53498, 53499, 53500, 53501, 53502, + 53503, 53504, 53505, 53506, 53507, 53508, 45927, 45929, 45931, 45934, + 45936, 45937, 45940, 45944, 45952, 45953, 45955, 45956, 45957, 45964, + 45968, 45972, 45984, 45985, 45992, 45996, 46020, 46021, 46024, 46027, + 46028, 46030, 46032, 46036, 46037, 46039, 46041, 46043, 46045, 46048, + 46052, 46056, 46076, 46096, 46104, 46108, 46112, 46120, 46121, 46123, + 46132, 46160, 46161, 46164, 46168, 46176, 46177, 46179, 46181, 46188, + 46208, 46216, 46237, 46244, 46248, 46252, 46261, 46263, 46265, 46272, + 46276, 46280, 46288, 46293, 46300, 46301, 46304, 46307, 46308, 46310, + 46316, 46317, 46319, 46321, 46328, 46356, 46357, 46360, 46363, 46364, + 46372, 46373, 46375, 46376, 46377, 46378, 46384, 46385, 46388, 46392, + 53509, 53510, 53511, 53512, 53513, 53514, 53515, 53516, 53518, 53519, + 53520, 53521, 53522, 53523, 53524, 53525, 53526, 53527, 53528, 53529, + 53530, 53531, 53532, 53533, 53534, 53535, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53536, 53537, 53538, 53539, 53540, 53541, 53542, 53543, + 53544, 53545, 53546, 53547, 53548, 53549, 53550, 53551, 53554, 53555, + 53557, 53558, 53559, 53561, 53563, 53564, 53565, 53566, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53567, 53570, 53574, 53575, 53576, 53577, + 53578, 53579, 53582, 53583, 53585, 53586, 53587, 53589, 53590, 53591, + 53592, 53593, 53594, 53595, 53598, 53600, 53602, 53603, 53604, 53605, + 53606, 53607, 53609, 53610, 53611, 53613, 46400, 46401, 46403, 46404, + 46405, 46411, 46412, 46413, 46416, 46420, 46428, 46429, 46431, 46432, + 46433, 46496, 46497, 46500, 46504, 46506, 46507, 46512, 46513, 46515, + 46516, 46517, 46523, 46524, 46525, 46528, 46532, 46540, 46541, 46543, + 46544, 46545, 46552, 46572, 46608, 46609, 46612, 46616, 46629, 46636, + 46644, 46664, 46692, 46696, 46748, 46749, 46752, 46756, 46763, 46764, + 46769, 46804, 46832, 46836, 46840, 46848, 46849, 46853, 46888, 46889, + 46892, 46895, 46896, 46904, 46905, 46907, 46916, 46920, 46924, 46932, + 46933, 46944, 46948, 46952, 46960, 46961, 46963, 46965, 46972, 46973, + 46976, 46980, 46988, 46989, 46991, 46992, 46993, 46994, 46998, 46999, + 53614, 53615, 53616, 53617, 53618, 53619, 53620, 53621, 53622, 53623, + 53624, 53625, 53626, 53627, 53629, 53630, 53631, 53632, 53633, 53634, + 53635, 53637, 53638, 53639, 53641, 53642, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53643, 53644, 53645, 53646, 53647, 53648, 53649, 53650, + 53651, 53652, 53653, 53654, 53655, 53656, 53657, 53658, 53659, 53660, + 53661, 53662, 53663, 53666, 53667, 53669, 53670, 53671, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53673, 53674, 53675, 53676, 53677, 53678, + 53679, 53682, 53684, 53686, 53687, 53688, 53689, 53691, 53693, 53694, + 53695, 53697, 53698, 53699, 53700, 53701, 53702, 53703, 53704, 53705, + 53706, 53707, 53708, 53709, 53710, 53711, 47000, 47001, 47004, 47008, + 47016, 47017, 47019, 47020, 47021, 47028, 47029, 47032, 47047, 47049, + 47084, 47085, 47088, 47092, 47100, 47101, 47103, 47104, 47105, 47111, + 47112, 47113, 47116, 47120, 47128, 47129, 47131, 47133, 47140, 47141, + 47144, 47148, 47156, 47157, 47159, 47160, 47161, 47168, 47172, 47185, + 47187, 47196, 47197, 47200, 47204, 47212, 47213, 47215, 47217, 47224, + 47228, 47245, 47272, 47280, 47284, 47288, 47296, 47297, 47299, 47301, + 47308, 47312, 47316, 47325, 47327, 47329, 47336, 47337, 47340, 47344, + 47352, 47353, 47355, 47357, 47364, 47384, 47392, 47420, 47421, 47424, + 47428, 47436, 47439, 47441, 47448, 47449, 47452, 47456, 47464, 47465, + 53712, 53713, 53714, 53715, 53716, 53717, 53718, 53719, 53721, 53722, + 53723, 53724, 53725, 53726, 53727, 53728, 53729, 53730, 53731, 53732, + 53733, 53734, 53735, 53736, 53737, 53738, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53739, 53740, 53741, 53742, 53743, 53744, 53745, 53746, + 53747, 53749, 53750, 53751, 53753, 53754, 53755, 53756, 53757, 53758, + 53759, 53760, 53761, 53762, 53763, 53764, 53765, 53766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53768, 53770, 53771, 53772, 53773, 53774, + 53775, 53777, 53778, 53779, 53780, 53781, 53782, 53783, 53784, 53785, + 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53795, + 53796, 53797, 53798, 53799, 53800, 53801, 47467, 47469, 47476, 47477, + 47480, 47484, 47492, 47493, 47495, 47497, 47498, 47501, 47502, 47532, + 47533, 47536, 47540, 47548, 47549, 47551, 47553, 47560, 47561, 47564, + 47566, 47567, 47568, 47569, 47570, 47576, 47577, 47579, 47581, 47582, + 47585, 47587, 47588, 47589, 47592, 47596, 47604, 47605, 47607, 47608, + 47609, 47610, 47616, 47617, 47624, 47637, 47672, 47673, 47676, 47680, + 47682, 47688, 47689, 47691, 47693, 47694, 47699, 47700, 47701, 47704, + 47708, 47716, 47717, 47719, 47720, 47721, 47728, 47729, 47732, 47736, + 47747, 47748, 47749, 47751, 47756, 47784, 47785, 47787, 47788, 47792, + 47794, 47800, 47801, 47803, 47805, 47812, 47816, 47832, 47833, 47868, + 53802, 53803, 53806, 53807, 53809, 53810, 53811, 53813, 53814, 53815, + 53816, 53817, 53818, 53819, 53822, 53824, 53826, 53827, 53828, 53829, + 53830, 53831, 53833, 53834, 53835, 53836, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53837, 53838, 53839, 53840, 53841, 53842, 53843, 53844, + 53845, 53846, 53847, 53848, 53849, 53850, 53851, 53853, 53854, 53855, + 53856, 53857, 53858, 53859, 53861, 53862, 53863, 53864, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53865, 53866, 53867, 53868, 53869, 53870, + 53871, 53872, 53873, 53874, 53875, 53876, 53877, 53878, 53879, 53880, + 53881, 53882, 53883, 53884, 53885, 53886, 53887, 53890, 53891, 53893, + 53894, 53895, 53897, 53898, 53899, 53900, 47872, 47876, 47885, 47887, + 47889, 47896, 47900, 47904, 47913, 47915, 47924, 47925, 47926, 47928, + 47931, 47932, 47933, 47934, 47940, 47941, 47943, 47945, 47949, 47951, + 47952, 47956, 47960, 47969, 47971, 47980, 48008, 48012, 48016, 48036, + 48040, 48044, 48052, 48055, 48064, 48068, 48072, 48080, 48083, 48120, + 48121, 48124, 48127, 48128, 48130, 48136, 48137, 48139, 48140, 48141, + 48143, 48145, 48148, 48149, 48150, 48151, 48152, 48155, 48156, 48157, + 48158, 48159, 48164, 48165, 48167, 48169, 48173, 48176, 48177, 48180, + 48184, 48192, 48193, 48195, 48196, 48197, 48201, 48204, 48205, 48208, + 48221, 48260, 48261, 48264, 48267, 48268, 48270, 48276, 48277, 48279, + 53901, 53902, 53903, 53906, 53907, 53908, 53910, 53911, 53912, 53913, + 53914, 53915, 53917, 53918, 53919, 53921, 53922, 53923, 53925, 53926, + 53927, 53928, 53929, 53930, 53931, 53933, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53934, 53935, 53936, 53938, 53939, 53940, 53941, 53942, + 53943, 53946, 53947, 53949, 53950, 53953, 53955, 53956, 53957, 53958, + 53959, 53962, 53964, 53965, 53966, 53967, 53968, 53969, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53970, 53971, 53973, 53974, 53975, 53977, + 53978, 53979, 53981, 53982, 53983, 53984, 53985, 53986, 53987, 53990, + 53991, 53992, 53993, 53994, 53995, 53996, 53997, 53998, 53999, 54002, + 54003, 54005, 54006, 54007, 54009, 54010, 48281, 48282, 48288, 48289, + 48292, 48295, 48296, 48304, 48305, 48307, 48308, 48309, 48316, 48317, + 48320, 48324, 48333, 48335, 48336, 48337, 48341, 48344, 48348, 48372, + 48373, 48374, 48376, 48380, 48388, 48389, 48391, 48393, 48400, 48404, + 48420, 48428, 48448, 48456, 48457, 48460, 48464, 48472, 48473, 48484, + 48488, 48512, 48513, 48516, 48519, 48520, 48521, 48522, 48528, 48529, + 48531, 48533, 48537, 48538, 48540, 48548, 48560, 48568, 48596, 48597, + 48600, 48604, 48617, 48624, 48628, 48632, 48640, 48643, 48645, 48652, + 48653, 48656, 48660, 48668, 48669, 48671, 48708, 48709, 48712, 48716, + 48718, 48724, 48725, 48727, 48729, 48730, 48731, 48736, 48737, 48740, + 54011, 54012, 54013, 54014, 54015, 54018, 54020, 54022, 54023, 54024, + 54025, 54026, 54027, 54031, 54033, 54034, 54035, 54037, 54039, 54040, + 54041, 54042, 54043, 54046, 54050, 54051, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54052, 54054, 54055, 54058, 54059, 54061, 54062, 54063, + 54065, 54066, 54067, 54068, 54069, 54070, 54071, 54074, 54078, 54079, + 54080, 54081, 54082, 54083, 54086, 54087, 54088, 54089, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54090, 54091, 54092, 54093, 54094, 54095, + 54096, 54097, 54098, 54099, 54100, 54101, 54102, 54103, 54104, 54105, + 54106, 54107, 54108, 54109, 54110, 54111, 54112, 54113, 54114, 54115, + 54116, 54117, 54118, 54119, 54120, 54121, 48744, 48746, 48752, 48753, + 48755, 48756, 48757, 48763, 48764, 48765, 48768, 48772, 48780, 48781, + 48783, 48784, 48785, 48792, 48793, 48808, 48848, 48849, 48852, 48855, + 48856, 48864, 48867, 48868, 48869, 48876, 48897, 48904, 48905, 48920, + 48921, 48923, 48924, 48925, 48960, 48961, 48964, 48968, 48976, 48977, + 48981, 49044, 49072, 49093, 49100, 49101, 49104, 49108, 49116, 49119, + 49121, 49212, 49233, 49240, 49244, 49248, 49256, 49257, 49296, 49297, + 49300, 49304, 49312, 49313, 49315, 49317, 49324, 49325, 49327, 49328, + 49331, 49332, 49333, 49334, 49340, 49341, 49343, 49344, 49345, 49349, + 49352, 49353, 49356, 49360, 49368, 49369, 49371, 49372, 49373, 49380, + 54122, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, + 54132, 54133, 54134, 54135, 54136, 54137, 54138, 54139, 54142, 54143, + 54145, 54146, 54147, 54149, 54150, 54151, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54152, 54153, 54154, 54155, 54158, 54162, 54163, 54164, + 54165, 54166, 54167, 54170, 54171, 54173, 54174, 54175, 54177, 54178, + 54179, 54180, 54181, 54182, 54183, 54186, 54188, 54190, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54191, 54192, 54193, 54194, 54195, 54197, + 54198, 54199, 54201, 54202, 54203, 54205, 54206, 54207, 54208, 54209, + 54210, 54211, 54214, 54215, 54218, 54219, 54220, 54221, 54222, 54223, + 54225, 54226, 54227, 54228, 54229, 54230, 49381, 49384, 49388, 49396, + 49397, 49399, 49401, 49408, 49412, 49416, 49424, 49429, 49436, 49437, + 49438, 49439, 49440, 49443, 49444, 49446, 49447, 49452, 49453, 49455, + 49456, 49457, 49462, 49464, 49465, 49468, 49472, 49480, 49481, 49483, + 49484, 49485, 49492, 49493, 49496, 49500, 49508, 49509, 49511, 49512, + 49513, 49520, 49524, 49528, 49541, 49548, 49549, 49550, 49552, 49556, + 49558, 49564, 49565, 49567, 49569, 49573, 49576, 49577, 49580, 49584, + 49597, 49604, 49608, 49612, 49620, 49623, 49624, 49632, 49636, 49640, + 49648, 49649, 49651, 49660, 49661, 49664, 49668, 49676, 49677, 49679, + 49681, 49688, 49689, 49692, 49695, 49696, 49704, 49705, 49707, 49709, + 54231, 54233, 54234, 54235, 54236, 54237, 54238, 54239, 54240, 54242, + 54244, 54245, 54246, 54247, 54248, 54249, 54250, 54251, 54254, 54255, + 54257, 54258, 54259, 54261, 54262, 54263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54264, 54265, 54266, 54267, 54270, 54272, 54274, 54275, + 54276, 54277, 54278, 54279, 54281, 54282, 54283, 54284, 54285, 54286, + 54287, 54288, 54289, 54290, 54291, 54292, 54293, 54294, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54295, 54296, 54297, 54298, 54299, 54300, + 54302, 54303, 54304, 54305, 54306, 54307, 54308, 54309, 54310, 54311, + 54312, 54313, 54314, 54315, 54316, 54317, 54318, 54319, 54320, 54321, + 54322, 54323, 54324, 54325, 54326, 54327, 49711, 49713, 49714, 49716, + 49736, 49744, 49745, 49748, 49752, 49760, 49765, 49772, 49773, 49776, + 49780, 49788, 49789, 49791, 49793, 49800, 49801, 49808, 49816, 49819, + 49821, 49828, 49829, 49832, 49836, 49837, 49844, 49845, 49847, 49849, + 49884, 49885, 49888, 49891, 49892, 49899, 49900, 49901, 49903, 49905, + 49910, 49912, 49913, 49915, 49916, 49920, 49928, 49929, 49932, 49933, + 49939, 49940, 49941, 49944, 49948, 49956, 49957, 49960, 49961, 49989, + 50024, 50025, 50028, 50032, 50034, 50040, 50041, 50044, 50045, 50052, + 50056, 50060, 50112, 50136, 50137, 50140, 50143, 50144, 50146, 50152, + 50153, 50157, 50164, 50165, 50168, 50184, 50192, 50212, 50220, 50224, + 54328, 54329, 54330, 54331, 54332, 54333, 54334, 54335, 54337, 54338, + 54339, 54341, 54342, 54343, 54344, 54345, 54346, 54347, 54348, 54349, + 54350, 54351, 54352, 54353, 54354, 54355, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54356, 54357, 54358, 54359, 54360, 54361, 54362, 54363, + 54365, 54366, 54367, 54369, 54370, 54371, 54373, 54374, 54375, 54376, + 54377, 54378, 54379, 54380, 54382, 54384, 54385, 54386, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54387, 54388, 54389, 54390, 54391, 54394, + 54395, 54397, 54398, 54401, 54403, 54404, 54405, 54406, 54407, 54410, + 54412, 54414, 54415, 54416, 54417, 54418, 54419, 54421, 54422, 54423, + 54424, 54425, 54426, 54427, 54428, 54429, 50228, 50236, 50237, 50248, + 50276, 50277, 50280, 50284, 50292, 50293, 50297, 50304, 50324, 50332, + 50360, 50364, 50409, 50416, 50417, 50420, 50424, 50426, 50431, 50432, + 50433, 50444, 50448, 50452, 50460, 50472, 50473, 50476, 50480, 50488, + 50489, 50491, 50493, 50500, 50501, 50504, 50505, 50506, 50508, 50509, + 50510, 50515, 50516, 50517, 50519, 50520, 50521, 50525, 50526, 50528, + 50529, 50532, 50536, 50544, 50545, 50547, 50548, 50549, 50556, 50557, + 50560, 50564, 50567, 50572, 50573, 50575, 50577, 50581, 50583, 50584, + 50588, 50592, 50601, 50612, 50613, 50616, 50617, 50619, 50620, 50621, + 50622, 50628, 50629, 50630, 50631, 50632, 50633, 50634, 50636, 50638, + 54430, 54431, 54432, 54433, 54434, 54435, 54436, 54437, 54438, 54439, + 54440, 54442, 54443, 54444, 54445, 54446, 54447, 54448, 54449, 54450, + 54451, 54452, 54453, 54454, 54455, 54456, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54457, 54458, 54459, 54460, 54461, 54462, 54463, 54464, + 54465, 54466, 54467, 54468, 54469, 54470, 54471, 54472, 54473, 54474, + 54475, 54477, 54478, 54479, 54481, 54482, 54483, 54485, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54486, 54487, 54488, 54489, 54490, 54491, + 54493, 54494, 54496, 54497, 54498, 54499, 54500, 54501, 54502, 54503, + 54505, 54506, 54507, 54509, 54510, 54511, 54513, 54514, 54515, 54516, + 54517, 54518, 54519, 54521, 54522, 54524, 50640, 50641, 50644, 50648, + 50656, 50657, 50659, 50661, 50668, 50669, 50670, 50672, 50676, 50678, + 50679, 50684, 50685, 50686, 50687, 50688, 50689, 50693, 50694, 50695, + 50696, 50700, 50704, 50712, 50713, 50715, 50716, 50724, 50725, 50728, + 50732, 50733, 50734, 50736, 50739, 50740, 50741, 50743, 50745, 50747, + 50752, 50753, 50756, 50760, 50768, 50769, 50771, 50772, 50773, 50780, + 50781, 50784, 50796, 50799, 50801, 50808, 50809, 50812, 50816, 50824, + 50825, 50827, 50829, 50836, 50837, 50840, 50844, 50852, 50853, 50855, + 50857, 50864, 50865, 50868, 50872, 50873, 50874, 50880, 50881, 50883, + 50885, 50892, 50893, 50896, 50900, 50908, 50909, 50912, 50913, 50920, + 54526, 54527, 54528, 54529, 54530, 54531, 54533, 54534, 54535, 54537, + 54538, 54539, 54541, 54542, 54543, 54544, 54545, 54546, 54547, 54550, + 54552, 54553, 54554, 54555, 54556, 54557, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, + 54566, 54567, 54568, 54569, 54570, 54571, 54572, 54573, 54574, 54575, + 54576, 54577, 54578, 54579, 54580, 54581, 54582, 54583, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54584, 54585, 54586, 54587, 54590, 54591, + 54593, 54594, 54595, 54597, 54598, 54599, 54600, 54601, 54602, 54603, + 54606, 54608, 54610, 54611, 54612, 54613, 54614, 54615, 54618, 54619, + 54621, 54622, 54623, 54625, 54626, 54627, 50921, 50924, 50928, 50936, + 50937, 50941, 50948, 50949, 50952, 50956, 50964, 50965, 50967, 50969, + 50976, 50977, 50980, 50984, 50992, 50993, 50995, 50997, 50999, 51004, + 51005, 51008, 51012, 51018, 51020, 51021, 51023, 51025, 51026, 51027, + 51028, 51029, 51030, 51031, 51032, 51036, 51040, 51048, 51051, 51060, + 51061, 51064, 51068, 51069, 51070, 51075, 51076, 51077, 51079, 51080, + 51081, 51082, 51086, 51088, 51089, 51092, 51094, 51095, 51096, 51098, + 51104, 51105, 51107, 51108, 51109, 51110, 51116, 51117, 51120, 51124, + 51132, 51133, 51135, 51136, 51137, 51144, 51145, 51148, 51150, 51152, + 51160, 51165, 51172, 51176, 51180, 51200, 51201, 51204, 51208, 51210, + 54628, 54630, 54631, 54634, 54636, 54638, 54639, 54640, 54641, 54642, + 54643, 54646, 54647, 54649, 54650, 54651, 54653, 54654, 54655, 54656, + 54657, 54658, 54659, 54662, 54666, 54667, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54668, 54669, 54670, 54671, 54673, 54674, 54675, 54676, + 54677, 54678, 54679, 54680, 54681, 54682, 54683, 54684, 54685, 54686, + 54687, 54688, 54689, 54690, 54691, 54692, 54694, 54695, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54696, 54697, 54698, 54699, 54700, 54701, + 54702, 54703, 54704, 54705, 54706, 54707, 54708, 54709, 54710, 54711, + 54712, 54713, 54714, 54715, 54716, 54717, 54718, 54719, 54720, 54721, + 54722, 54723, 54724, 54725, 54726, 54727, 51216, 51217, 51219, 51221, + 51222, 51228, 51229, 51232, 51236, 51244, 51245, 51247, 51249, 51256, + 51260, 51264, 51272, 51273, 51276, 51277, 51284, 51312, 51313, 51316, + 51320, 51322, 51328, 51329, 51331, 51333, 51334, 51335, 51339, 51340, + 51341, 51348, 51357, 51359, 51361, 51368, 51388, 51389, 51396, 51400, + 51404, 51412, 51413, 51415, 51417, 51424, 51425, 51428, 51445, 51452, + 51453, 51456, 51460, 51461, 51462, 51468, 51469, 51471, 51473, 51480, + 51500, 51508, 51536, 51537, 51540, 51544, 51552, 51553, 51555, 51564, + 51568, 51572, 51580, 51592, 51593, 51596, 51600, 51608, 51609, 51611, + 51613, 51648, 51649, 51652, 51655, 51656, 51658, 51664, 51665, 51667, + 54730, 54731, 54733, 54734, 54735, 54737, 54739, 54740, 54741, 54742, + 54743, 54746, 54748, 54750, 54751, 54752, 54753, 54754, 54755, 54758, + 54759, 54761, 54762, 54763, 54765, 54766, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54767, 54768, 54769, 54770, 54771, 54774, 54776, 54778, + 54779, 54780, 54781, 54782, 54783, 54786, 54787, 54789, 54790, 54791, + 54793, 54794, 54795, 54796, 54797, 54798, 54799, 54802, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54806, 54807, 54808, 54809, 54810, 54811, + 54813, 54814, 54815, 54817, 54818, 54819, 54821, 54822, 54823, 54824, + 54825, 54826, 54827, 54828, 54830, 54831, 54832, 54833, 54834, 54835, + 54836, 54837, 54838, 54839, 54842, 54843, 51669, 51670, 51673, 51674, + 51676, 51677, 51680, 51682, 51684, 51687, 51692, 51693, 51695, 51696, + 51697, 51704, 51705, 51708, 51712, 51720, 51721, 51723, 51724, 51725, + 51732, 51736, 51753, 51788, 51789, 51792, 51796, 51804, 51805, 51807, + 51808, 51809, 51816, 51837, 51844, 51864, 51900, 51901, 51904, 51908, + 51916, 51917, 51919, 51921, 51923, 51928, 51929, 51936, 51948, 51956, + 51976, 51984, 51988, 51992, 52000, 52001, 52033, 52040, 52041, 52044, + 52048, 52056, 52057, 52061, 52068, 52088, 52089, 52124, 52152, 52180, + 52196, 52199, 52201, 52236, 52237, 52240, 52244, 52252, 52253, 52257, + 52258, 52263, 52264, 52265, 52268, 52270, 52272, 52280, 52281, 52283, + 54845, 54846, 54847, 54849, 54850, 54851, 54852, 54854, 54855, 54858, + 54860, 54862, 54863, 54864, 54866, 54867, 54870, 54871, 54873, 54874, + 54875, 54877, 54878, 54879, 54880, 54881, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54882, 54883, 54884, 54885, 54886, 54888, 54890, 54891, + 54892, 54893, 54894, 54895, 54898, 54899, 54901, 54902, 54903, 54904, + 54905, 54906, 54907, 54908, 54909, 54910, 54911, 54912, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54913, 54914, 54916, 54918, 54919, 54920, + 54921, 54922, 54923, 54926, 54927, 54929, 54930, 54931, 54933, 54934, + 54935, 54936, 54937, 54938, 54939, 54940, 54942, 54944, 54946, 54947, + 54948, 54949, 54950, 54951, 54953, 54954, 52284, 52285, 52286, 52292, + 52293, 52296, 52300, 52308, 52309, 52311, 52312, 52313, 52320, 52324, + 52326, 52328, 52336, 52341, 52376, 52377, 52380, 52384, 52392, 52393, + 52395, 52396, 52397, 52404, 52405, 52408, 52412, 52420, 52421, 52423, + 52425, 52432, 52436, 52452, 52460, 52464, 52481, 52488, 52489, 52492, + 52496, 52504, 52505, 52507, 52509, 52516, 52520, 52524, 52537, 52572, + 52576, 52580, 52588, 52589, 52591, 52593, 52600, 52616, 52628, 52629, + 52632, 52636, 52644, 52645, 52647, 52649, 52656, 52676, 52684, 52688, + 52712, 52716, 52720, 52728, 52729, 52731, 52733, 52740, 52744, 52748, + 52756, 52761, 52768, 52769, 52772, 52776, 52784, 52785, 52787, 52789, + 54955, 54957, 54958, 54959, 54961, 54962, 54963, 54964, 54965, 54966, + 54967, 54968, 54970, 54972, 54973, 54974, 54975, 54976, 54977, 54978, + 54979, 54982, 54983, 54985, 54986, 54987, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54989, 54990, 54991, 54992, 54994, 54995, 54997, 54998, + 55000, 55002, 55003, 55004, 55005, 55006, 55007, 55009, 55010, 55011, + 55013, 55014, 55015, 55017, 55018, 55019, 55020, 55021, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55022, 55023, 55025, 55026, 55027, 55028, + 55030, 55031, 55032, 55033, 55034, 55035, 55038, 55039, 55041, 55042, + 55043, 55045, 55046, 55047, 55048, 55049, 55050, 55051, 55052, 55053, + 55054, 55055, 55056, 55058, 55059, 55060, 52824, 52825, 52828, 52831, + 52832, 52833, 52840, 52841, 52843, 52845, 52852, 52853, 52856, 52860, + 52868, 52869, 52871, 52873, 52880, 52881, 52884, 52888, 52896, 52897, + 52899, 52900, 52901, 52908, 52909, 52929, 52964, 52965, 52968, 52971, + 52972, 52980, 52981, 52983, 52984, 52985, 52992, 52993, 52996, 53000, + 53008, 53009, 53011, 53013, 53020, 53024, 53028, 53036, 53037, 53039, + 53040, 53041, 53048, 53076, 53077, 53080, 53084, 53092, 53093, 53095, + 53097, 53104, 53105, 53108, 53112, 53120, 53125, 53132, 53153, 53160, + 53168, 53188, 53216, 53217, 53220, 53224, 53232, 53233, 53235, 53237, + 53244, 53248, 53252, 53265, 53272, 53293, 53300, 53301, 53304, 53308, + 55061, 55062, 55063, 55066, 55067, 55069, 55070, 55071, 55073, 55074, + 55075, 55076, 55077, 55078, 55079, 55082, 55084, 55086, 55087, 55088, + 55089, 55090, 55091, 55094, 55095, 55097, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 55098, 55099, 55101, 55102, 55103, 55104, 55105, 55106, + 55107, 55109, 55110, 55112, 55114, 55115, 55116, 55117, 55118, 55119, + 55122, 55123, 55125, 55130, 55131, 55132, 55133, 55134, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55135, 55138, 55140, 55142, 55143, 55144, + 55146, 55147, 55149, 55150, 55151, 55153, 55154, 55155, 55157, 55158, + 55159, 55160, 55161, 55162, 55163, 55166, 55167, 55168, 55170, 55171, + 55172, 55173, 55174, 55175, 55178, 55179, 53316, 53317, 53319, 53321, + 53328, 53332, 53336, 53344, 53356, 53357, 53360, 53364, 53372, 53373, + 53377, 53412, 53413, 53416, 53420, 53428, 53429, 53431, 53433, 53440, + 53441, 53444, 53448, 53449, 53456, 53457, 53459, 53460, 53461, 53468, + 53469, 53472, 53476, 53484, 53485, 53487, 53488, 53489, 53496, 53517, + 53552, 53553, 53556, 53560, 53562, 53568, 53569, 53571, 53572, 53573, + 53580, 53581, 53584, 53588, 53596, 53597, 53599, 53601, 53608, 53612, + 53628, 53636, 53640, 53664, 53665, 53668, 53672, 53680, 53681, 53683, + 53685, 53690, 53692, 53696, 53720, 53748, 53752, 53767, 53769, 53776, + 53804, 53805, 53808, 53812, 53820, 53821, 53823, 53825, 53832, 53852, + 55181, 55182, 55183, 55185, 55186, 55187, 55188, 55189, 55190, 55191, + 55194, 55196, 55198, 55199, 55200, 55201, 55202, 55203, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 53860, 53888, 53889, 53892, + 53896, 53904, 53905, 53909, 53916, 53920, 53924, 53932, 53937, 53944, + 53945, 53948, 53951, 53952, 53954, 53960, 53961, 53963, 53972, 53976, + 53980, 53988, 53989, 54000, 54001, 54004, 54008, 54016, 54017, 54019, + 54021, 54028, 54029, 54030, 54032, 54036, 54038, 54044, 54045, 54047, + 54048, 54049, 54053, 54056, 54057, 54060, 54064, 54072, 54073, 54075, + 54076, 54077, 54084, 54085, 54140, 54141, 54144, 54148, 54156, 54157, + 54159, 54160, 54161, 54168, 54169, 54172, 54176, 54184, 54185, 54187, + 54189, 54196, 54200, 54204, 54212, 54213, 54216, 54217, 54224, 54232, + 54241, 54243, 54252, 54253, 54256, 54260, 54268, 54269, 54271, 54273, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54280, 54301, 54336, 54340, + 54364, 54368, 54372, 54381, 54383, 54392, 54393, 54396, 54399, 54400, + 54402, 54408, 54409, 54411, 54413, 54420, 54441, 54476, 54480, 54484, + 54492, 54495, 54504, 54508, 54512, 54520, 54523, 54525, 54532, 54536, + 54540, 54548, 54549, 54551, 54588, 54589, 54592, 54596, 54604, 54605, + 54607, 54609, 54616, 54617, 54620, 54624, 54629, 54632, 54633, 54635, + 54637, 54644, 54645, 54648, 54652, 54660, 54661, 54663, 54664, 54665, + 54672, 54693, 54728, 54729, 54732, 54736, 54738, 54744, 54745, 54747, + 54749, 54756, 54757, 54760, 54764, 54772, 54773, 54775, 54777, 54784, + 54785, 54788, 54792, 54800, 54801, 54803, 54804, 54805, 54812, 54816, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54820, 54829, 54840, 54841, + 54844, 54848, 54853, 54856, 54857, 54859, 54861, 54865, 54868, 54869, + 54872, 54876, 54887, 54889, 54896, 54897, 54900, 54915, 54917, 54924, + 54925, 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, + 54971, 54980, 54981, 54984, 54988, 54993, 54996, 54999, 55001, 55008, + 55012, 55016, 55024, 55029, 55036, 55037, 55040, 55044, 55057, 55064, + 55065, 55068, 55072, 55080, 55081, 55083, 55085, 55092, 55093, 55096, + 55100, 55108, 55111, 55113, 55120, 55121, 55124, 55126, 55127, 55128, + 55129, 55136, 55137, 55139, 55141, 55145, 55148, 55152, 55156, 55164, + 55165, 55169, 55176, 55177, 55180, 55184, 55192, 55193, 55195, 55197, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20285, 20339, 20551, 20729, + 21152, 21487, 21621, 21733, 22025, 23233, 23478, 26247, 26550, 26551, + 26607, 27468, 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, + 36040, 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, + 27580, 29647, 33050, 35258, 35282, 38307, 20355, 21002, 22718, 22904, + 23014, 24178, 24185, 25031, 25536, 26438, 26604, 26751, 28567, 30286, + 30475, 30965, 31240, 31487, 31777, 32925, 33390, 33393, 35563, 38291, + 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, 34638, 38824, + 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, 26577, 27204, + 28187, 29976, 30131, 30435, 30640, 32058, 37039, 37969, 37970, 40853, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21283, 23724, 30002, 32987, + 37440, 38296, 21083, 22536, 23004, 23713, 23831, 24247, 24378, 24394, + 24951, 27743, 30074, 30086, 31968, 32115, 32177, 32652, 33108, 33313, + 34193, 35137, 35611, 37628, 38477, 40007, 20171, 20215, 20491, 20977, + 22607, 24887, 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, + 31623, 33445, 33995, 63744, 37799, 38283, 21888, 23458, 22353, 63745, + 31923, 32697, 37301, 20520, 21435, 23621, 24040, 25298, 25454, 25818, + 25831, 28192, 28844, 31067, 36317, 36382, 63746, 36989, 37445, 37624, + 20094, 20214, 20581, 24062, 24314, 24838, 26967, 33137, 34388, 36423, + 37749, 39467, 20062, 20625, 26480, 26688, 20745, 21133, 21138, 27298, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30652, 37392, 40660, 21163, + 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, + 35233, 38548, 22533, 29309, 29356, 29956, 32121, 32365, 32937, 35211, + 35700, 36963, 40273, 25225, 27770, 28500, 32080, 32570, 35363, 20860, + 24906, 31645, 35609, 37463, 37772, 20140, 20435, 20510, 20670, 20742, + 21185, 21197, 21375, 22384, 22659, 24218, 24465, 24950, 25004, 25806, + 25964, 26223, 26299, 26356, 26775, 28039, 28805, 28913, 29855, 29861, + 29898, 30169, 30828, 30956, 31455, 31478, 32069, 32147, 32789, 32831, + 33051, 33686, 35686, 36629, 36885, 37857, 38915, 38968, 39514, 39912, + 20418, 21843, 22586, 22865, 23395, 23622, 24760, 25106, 26690, 26800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26856, 28330, 30028, 30328, + 30926, 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, + 21476, 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, + 25911, 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, + 31295, 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, + 34996, 35493, 63747, 36764, 37678, 38599, 39015, 39640, 40723, 21741, + 26011, 26354, 26767, 31296, 35895, 40288, 22256, 22372, 23825, 26118, + 26801, 26829, 28414, 29736, 34974, 39908, 27752, 63748, 39592, 20379, + 20844, 20849, 21151, 23380, 24037, 24656, 24685, 25329, 25511, 25915, + 29657, 31354, 34467, 36002, 38799, 20018, 23521, 25096, 26524, 29916, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31185, 33747, 35463, 35506, + 36328, 36942, 37707, 38982, 24275, 27112, 34303, 37101, 63749, 20896, + 23448, 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, + 33733, 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, + 20809, 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, + 33009, 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, + 24871, 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, + 21676, 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, + 30350, 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, + 39171, 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21312, 21475, 21477, 21646, + 22036, 22389, 22434, 23495, 23943, 24272, 25084, 25304, 25937, 26552, + 26601, 27083, 27472, 27590, 27628, 27714, 28317, 28792, 29399, 29590, + 29699, 30655, 30697, 31350, 32127, 32777, 33276, 33285, 33290, 33503, + 34914, 35635, 36092, 36544, 36881, 37041, 37476, 37558, 39378, 39493, + 40169, 40407, 40860, 22283, 23616, 33738, 38816, 38827, 40628, 21531, + 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, 23470, + 24339, 31353, 31406, 33422, 36524, 20518, 21048, 21240, 21367, 22280, + 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, 36470, 38357, + 26426, 27331, 28528, 35437, 36556, 39243, 63750, 26231, 27512, 36020, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 39740, 63751, 21483, 22317, + 22862, 25542, 27131, 29674, 30789, 31418, 31429, 31998, 33909, 35215, + 36211, 36917, 38312, 21243, 22343, 30023, 31584, 33740, 37406, 63752, + 27224, 20811, 21067, 21127, 25119, 26840, 26997, 38553, 20677, 21156, + 21220, 25027, 26020, 26681, 27135, 29822, 31563, 33465, 33771, 35250, + 35641, 36817, 39241, 63753, 20170, 22935, 25810, 26129, 27278, 29748, + 31105, 31165, 33449, 34942, 34943, 35167, 63754, 37670, 20235, 21450, + 24613, 25201, 27762, 32026, 32102, 20120, 20834, 30684, 32943, 20225, + 20238, 20854, 20864, 21980, 22120, 22331, 22522, 22524, 22804, 22855, + 22931, 23492, 23696, 23822, 24049, 24190, 24524, 25216, 26071, 26083, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26398, 26399, 26462, 26827, + 26820, 27231, 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, + 29826, 29859, 30072, 30079, 30849, 30959, 31041, 31047, 31048, 31098, + 31637, 32000, 32186, 32648, 32774, 32813, 32908, 35352, 35663, 35912, + 36215, 37665, 37668, 39138, 39249, 39438, 39439, 39525, 40594, 32202, + 20342, 21513, 25326, 26708, 37329, 21931, 20794, 63755, 63756, 23068, + 25062, 63757, 25295, 25343, 63758, 63759, 63760, 63761, 63762, 63763, + 37027, 63764, 63765, 63766, 63767, 63768, 35582, 63769, 63770, 63771, + 63772, 26262, 63773, 29014, 63774, 63775, 38627, 63776, 25423, 25466, + 21335, 63777, 26511, 26976, 28275, 63778, 30007, 63779, 63780, 63781, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32013, 63782, 63783, 34930, + 22218, 23064, 63784, 63785, 63786, 63787, 63788, 20035, 63789, 20839, + 22856, 26608, 32784, 63790, 22899, 24180, 25754, 31178, 24565, 24684, + 25288, 25467, 23527, 23511, 21162, 63791, 22900, 24361, 24594, 63792, + 63793, 63794, 29785, 63795, 63796, 63797, 63798, 63799, 63800, 39377, + 63801, 63802, 63803, 63804, 63805, 63806, 63807, 63808, 63809, 63810, + 63811, 28611, 63812, 63813, 33215, 36786, 24817, 63814, 63815, 33126, + 63816, 63817, 23615, 63818, 63819, 63820, 63821, 63822, 63823, 63824, + 63825, 23273, 35365, 26491, 32016, 63826, 63827, 63828, 63829, 63830, + 63831, 33021, 63832, 63833, 23612, 27877, 21311, 28346, 22810, 33590, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20025, 20150, 20294, 21934, + 22296, 22727, 24406, 26039, 26086, 27264, 27573, 28237, 30701, 31471, + 31774, 32222, 34507, 34962, 37170, 37723, 25787, 28606, 29562, 30136, + 36948, 21846, 22349, 25018, 25812, 26311, 28129, 28251, 28525, 28601, + 30192, 32835, 33213, 34113, 35203, 35527, 35674, 37663, 27795, 30035, + 31572, 36367, 36957, 21776, 22530, 22616, 24162, 25095, 25758, 26848, + 30070, 31958, 34739, 40680, 20195, 22408, 22382, 22823, 23565, 23729, + 24118, 24453, 25140, 25825, 29619, 33274, 34955, 36024, 38538, 40667, + 23429, 24503, 24755, 20498, 20992, 21040, 22294, 22581, 22615, 23566, + 23648, 23798, 23947, 24230, 24466, 24764, 25361, 25481, 25623, 26691, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26873, 27330, 28120, 28193, + 28372, 28644, 29182, 30428, 30585, 31153, 31291, 33796, 35241, 36077, + 36339, 36424, 36867, 36884, 36947, 37117, 37709, 38518, 38876, 27602, + 28678, 29272, 29346, 29544, 30563, 31167, 31716, 32411, 35712, 22697, + 24775, 25958, 26109, 26302, 27788, 28958, 29129, 35930, 38931, 20077, + 31361, 20189, 20908, 20941, 21205, 21516, 24999, 26481, 26704, 26847, + 27934, 28540, 30140, 30643, 31461, 33012, 33891, 37509, 20828, 26007, + 26460, 26515, 30168, 31431, 33651, 63834, 35910, 36887, 38957, 23663, + 33216, 33434, 36929, 36975, 37389, 24471, 23965, 27225, 29128, 30331, + 31561, 34276, 35588, 37159, 39472, 21895, 25078, 63835, 30313, 32645, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34367, 34746, 35064, 37007, + 63836, 27931, 28889, 29662, 32097, 33853, 63837, 37226, 39409, 63838, + 20098, 21365, 27396, 27410, 28734, 29211, 34349, 40478, 21068, 36771, + 23888, 25829, 25900, 27414, 28651, 31811, 32412, 34253, 35172, 35261, + 25289, 33240, 34847, 24266, 26391, 28010, 29436, 29701, 29807, 34690, + 37086, 20358, 23821, 24480, 33802, 20919, 25504, 30053, 20142, 20486, + 20841, 20937, 26753, 27153, 31918, 31921, 31975, 33391, 35538, 36635, + 37327, 20406, 20791, 21237, 21570, 24300, 24942, 25150, 26053, 27354, + 28670, 31018, 34268, 34851, 38317, 39522, 39530, 40599, 40654, 21147, + 26310, 27511, 28701, 31019, 36706, 38722, 24976, 25088, 25891, 28451, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29001, 29833, 32244, 32879, + 34030, 36646, 36899, 37706, 20925, 21015, 21155, 27916, 28872, 35010, + 24265, 25986, 27566, 28610, 31806, 29557, 20196, 20278, 22265, 63839, + 23738, 23994, 24604, 29618, 31533, 32666, 32718, 32838, 36894, 37428, + 38646, 38728, 38936, 40801, 20363, 28583, 31150, 37300, 38583, 21214, + 63840, 25736, 25796, 27347, 28510, 28696, 29200, 30439, 32769, 34310, + 34396, 36335, 36613, 38706, 39791, 40442, 40565, 30860, 31103, 32160, + 33737, 37636, 40575, 40595, 35542, 22751, 24324, 26407, 28711, 29903, + 31840, 32894, 20769, 28712, 29282, 30922, 36034, 36058, 36084, 38647, + 20102, 20698, 23534, 24278, 26009, 29134, 30274, 30637, 32842, 34044, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36988, 39719, 40845, 22744, + 23105, 23650, 27155, 28122, 28431, 30267, 32047, 32311, 34078, 35128, + 37860, 38475, 21129, 26066, 26611, 27060, 27969, 28316, 28687, 29705, + 29792, 30041, 30244, 30827, 35628, 39006, 20845, 25134, 38520, 20374, + 20523, 23833, 28138, 32184, 36650, 24459, 24900, 26647, 63841, 38534, + 21202, 32907, 20956, 20940, 26974, 31260, 32190, 33777, 38517, 20442, + 21033, 21400, 21519, 21774, 23653, 24743, 26446, 26792, 28012, 29313, + 29432, 29702, 29827, 63842, 30178, 31852, 32633, 32696, 33673, 35023, + 35041, 37324, 37328, 38626, 39881, 21533, 28542, 29136, 29848, 34298, + 36522, 38563, 40023, 40607, 26519, 28107, 29747, 33256, 38678, 30764, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31435, 31520, 31890, 25705, + 29802, 30194, 30908, 30952, 39340, 39764, 40635, 23518, 24149, 28448, + 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, 24930, 25405, + 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, 34875, 36627, + 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, 38778, 20129, + 22916, 24536, 24537, 26395, 32178, 32596, 33426, 33579, 33725, 36638, + 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, 27599, 29028, + 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, 39488, 40613, + 23391, 27667, 29467, 30450, 30431, 33804, 20906, 35219, 20813, 20885, + 21193, 26825, 27796, 30468, 30496, 32191, 32236, 38754, 40629, 28357, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34065, 20901, 21517, 21629, + 26126, 26269, 26919, 28319, 30399, 30609, 33559, 33986, 34719, 37225, + 37528, 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, 25720, + 25721, 26286, 26576, 27169, 27597, 27611, 29279, 29281, 29761, 30520, + 30683, 32791, 33468, 33541, 35584, 35624, 35980, 26408, 27792, 29287, + 30446, 30566, 31302, 40361, 27519, 27794, 22818, 26406, 33945, 21359, + 22675, 22937, 24287, 25551, 26164, 26483, 28218, 29483, 31447, 33495, + 37672, 21209, 24043, 25006, 25035, 25098, 25287, 25771, 26080, 26969, + 27494, 27595, 28961, 29687, 30045, 32326, 33310, 33538, 34154, 35491, + 36031, 38695, 40289, 22696, 40664, 20497, 21006, 21563, 21839, 25991, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27766, 32010, 32011, 32862, + 34442, 38272, 38639, 21247, 27797, 29289, 21619, 23194, 23614, 23883, + 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, 31859, 32654, + 34183, 35598, 36855, 38753, 40692, 23735, 24758, 24845, 25003, 25935, + 26107, 26108, 27665, 27887, 29599, 29641, 32225, 38292, 23494, 34588, + 35600, 21085, 21338, 25293, 25615, 25778, 26420, 27192, 27850, 29632, + 29854, 31636, 31893, 32283, 33162, 33334, 34180, 36843, 38649, 39361, + 20276, 21322, 21453, 21467, 25292, 25644, 25856, 26001, 27075, 27886, + 28504, 29677, 30036, 30242, 30436, 30460, 30928, 30971, 31020, 32070, + 33324, 34784, 36820, 38930, 39151, 21187, 25300, 25765, 28196, 28497, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30332, 36299, 37297, 37474, + 39662, 39747, 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, + 25918, 26041, 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, + 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, + 20493, 20467, 63843, 22521, 24472, 25308, 25490, 26479, 28227, 28953, + 30403, 32972, 32986, 35060, 35061, 35097, 36064, 36649, 37197, 38506, + 20271, 20336, 24091, 26575, 26658, 30333, 30334, 39748, 24161, 27146, + 29033, 29140, 30058, 63844, 32321, 34115, 34281, 39132, 20240, 31567, + 32624, 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, + 33539, 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30887, 34327, 38370, 38713, + 63845, 21342, 24321, 35722, 36776, 36783, 37002, 21029, 30629, 40009, + 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, 26564, 26821, + 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, 20445, 22561, + 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, 29995, 33769, + 35036, 35091, 35676, 36628, 20239, 20693, 21264, 21340, 23443, 24489, + 26381, 31119, 33145, 33583, 34068, 35079, 35206, 36665, 36667, 39333, + 39954, 26412, 20086, 20472, 22857, 23553, 23791, 23792, 25447, 26834, + 28925, 29090, 29739, 32299, 34028, 34562, 36898, 37586, 40179, 19981, + 20184, 20463, 20613, 21078, 21103, 21542, 21648, 22496, 22827, 23142, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23386, 23413, 23500, 24220, + 63846, 25206, 25975, 26023, 28014, 28325, 29238, 31526, 31807, 32566, + 33104, 33105, 33178, 33344, 33433, 33705, 35331, 36000, 36070, 36091, + 36212, 36282, 37096, 37340, 38428, 38468, 39385, 40167, 21271, 20998, + 21545, 22132, 22707, 22868, 22894, 24575, 24996, 25198, 26128, 27774, + 28954, 30406, 31881, 31966, 32027, 33452, 36033, 38640, 63847, 20315, + 24343, 24447, 25282, 23849, 26379, 26842, 30844, 32323, 40300, 19989, + 20633, 21269, 21290, 21329, 22915, 23138, 24199, 24754, 24970, 25161, + 25209, 26000, 26503, 27047, 27604, 27606, 27607, 27608, 27832, 63848, + 29749, 30202, 30738, 30865, 31189, 31192, 31875, 32203, 32737, 32933, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 33086, 33218, 33778, 34586, + 35048, 35513, 35692, 36027, 37145, 38750, 39131, 40763, 22188, 23338, + 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, + 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, + 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, + 22763, 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, 24605, + 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, 28195, + 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, 32114, + 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, 36060, + 36198, 36781, 37034, 39164, 39391, 40605, 21066, 63849, 26388, 63850, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20632, 21034, 23665, 25955, + 27733, 29642, 29987, 30109, 31639, 33948, 37240, 38704, 20087, 25746, + 27578, 29022, 34217, 19977, 63851, 26441, 26862, 28183, 33439, 34072, + 34923, 25591, 28545, 37394, 39087, 19978, 20663, 20687, 20767, 21830, + 21930, 22039, 23360, 23577, 23776, 24120, 24202, 24224, 24258, 24819, + 26705, 27233, 28248, 29245, 29248, 29376, 30456, 31077, 31665, 32724, + 35059, 35316, 35443, 35937, 36062, 38684, 22622, 29885, 36093, 21959, + 63852, 31329, 32034, 33394, 29298, 29983, 29989, 63853, 31513, 22661, + 22779, 23996, 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, + 26329, 26360, 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32997, 33298, 34223, 35199, + 35475, 36893, 37604, 40653, 40736, 22805, 22893, 24109, 24796, 26132, + 26227, 26512, 27728, 28101, 28511, 30707, 30889, 33990, 37323, 37675, + 20185, 20682, 20808, 21892, 23307, 23459, 25159, 25982, 26059, 28210, + 29053, 29697, 29764, 29831, 29887, 30316, 31146, 32218, 32341, 32680, + 33146, 33203, 33337, 34330, 34796, 35445, 36323, 36984, 37521, 37925, + 39245, 39854, 21352, 23633, 26964, 27844, 27945, 28203, 33292, 34203, + 35131, 35373, 35498, 38634, 40807, 21089, 26297, 27570, 32406, 34814, + 36109, 38275, 38493, 25885, 28041, 29166, 63854, 22478, 22995, 23468, + 24615, 24826, 25104, 26143, 26207, 29481, 29689, 30427, 30465, 31596, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32854, 32882, 33125, 35488, + 37266, 19990, 21218, 27506, 27927, 31237, 31545, 32048, 63855, 36016, + 21484, 22063, 22609, 23477, 23567, 23569, 24034, 25152, 25475, 25620, + 26157, 26803, 27836, 28040, 28335, 28703, 28836, 29138, 29990, 30095, + 30094, 30233, 31505, 31712, 31787, 32032, 32057, 34092, 34157, 34311, + 35380, 36877, 36961, 37045, 37559, 38902, 39479, 20439, 23660, 26463, + 28049, 31903, 32396, 35606, 36118, 36895, 23403, 24061, 25613, 33984, + 36956, 39137, 29575, 23435, 24730, 26494, 28126, 35359, 35494, 36865, + 38924, 21047, 63856, 28753, 30862, 37782, 34928, 37335, 20462, 21463, + 22013, 22234, 22402, 22781, 23234, 23432, 23723, 23744, 24101, 24833, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 25101, 25163, 25480, 25628, + 25910, 25976, 27193, 27530, 27700, 27929, 28465, 29159, 29417, 29560, + 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, 32143, 32172, + 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, 35504, 35728, + 36664, 36930, 36995, 37228, 37526, 37561, 38539, 38567, 38568, 38614, + 38656, 38920, 39318, 39635, 39706, 21460, 22654, 22809, 23408, 23487, + 28113, 28506, 29087, 29729, 29881, 32901, 33789, 24033, 24455, 24490, + 24642, 26092, 26642, 26991, 27219, 27529, 27957, 28147, 29667, 30462, + 30636, 31565, 32020, 33059, 33308, 33600, 34036, 34147, 35426, 35524, + 37255, 37662, 38918, 39348, 25100, 34899, 36848, 37477, 23815, 23847, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23913, 29791, 33181, 34664, + 28629, 25342, 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, + 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, + 23608, 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, 26558, + 26612, 29468, 30690, 31034, 32709, 33940, 33997, 35222, 35430, 35433, + 35553, 35925, 35962, 22516, 23508, 24335, 24687, 25325, 26893, 27542, + 28252, 29060, 31698, 34645, 35672, 36606, 39135, 39166, 20280, 20353, + 20449, 21627, 23072, 23480, 24892, 26032, 26216, 29180, 30003, 31070, + 32051, 33102, 33251, 33688, 34218, 34254, 34563, 35338, 36523, 36763, + 63857, 36805, 22833, 23460, 23526, 24713, 23529, 23563, 24515, 27777, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63858, 28145, 28683, 29978, + 33455, 35574, 20160, 21313, 63859, 38617, 27663, 20126, 20420, 20818, + 21854, 23077, 23784, 25105, 29273, 33469, 33706, 34558, 34905, 35357, + 38463, 38597, 39187, 40201, 40285, 22538, 23731, 23997, 24132, 24801, + 24853, 25569, 27138, 28197, 37122, 37716, 38990, 39952, 40823, 23433, + 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, 26017, + 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, 33780, + 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, 27523, + 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, 30861, + 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, 38989, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27387, 32588, 40367, 40474, + 20063, 20539, 20918, 22812, 24825, 25590, 26928, 29242, 32822, 63860, + 37326, 24369, 63861, 63862, 32004, 33509, 33903, 33979, 34277, 36493, + 63863, 20335, 63864, 63865, 22756, 23363, 24665, 25562, 25880, 25965, + 26264, 63866, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, + 31344, 63867, 32650, 63868, 35140, 63869, 35731, 37312, 38525, 63870, + 39178, 22276, 24481, 26044, 28417, 30208, 31142, 35486, 39341, 39770, + 40812, 20740, 25014, 25233, 27277, 33222, 20547, 22576, 24422, 28937, + 35328, 35578, 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, + 23978, 26989, 20870, 20104, 20313, 63871, 63872, 63873, 22914, 63874, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63875, 27487, 27741, 63876, + 29877, 30998, 63877, 33287, 33349, 33593, 36671, 36701, 63878, 39192, + 63879, 63880, 63881, 20134, 63882, 22495, 24441, 26131, 63883, 63884, + 30123, 32377, 35695, 63885, 36870, 39515, 22181, 22567, 23032, 23071, + 23476, 63886, 24310, 63887, 63888, 25424, 25403, 63889, 26941, 27783, + 27839, 28046, 28051, 28149, 28436, 63890, 28895, 28982, 29017, 63891, + 29123, 29141, 63892, 30799, 30831, 63893, 31605, 32227, 63894, 32303, + 63895, 34893, 36575, 63896, 63897, 63898, 37467, 63899, 40182, 63900, + 63901, 63902, 24709, 28037, 63903, 29105, 63904, 63905, 38321, 21421, + 63906, 63907, 63908, 26579, 63909, 28814, 28976, 29744, 33398, 33490, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63910, 38331, 39653, 40573, + 26308, 63911, 29121, 33865, 63912, 63913, 22603, 63914, 63915, 23992, + 24433, 63916, 26144, 26254, 27001, 27054, 27704, 27891, 28214, 28481, + 28634, 28699, 28719, 29008, 29151, 29552, 63917, 29787, 63918, 29908, + 30408, 31310, 32403, 63919, 63920, 33521, 35424, 36814, 63921, 37704, + 63922, 38681, 63923, 63924, 20034, 20522, 63925, 21000, 21473, 26355, + 27757, 28618, 29450, 30591, 31330, 33454, 34269, 34306, 63926, 35028, + 35427, 35709, 35947, 63927, 37555, 63928, 38675, 38928, 20116, 20237, + 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, 23067, + 23524, 24735, 63929, 25034, 25942, 26111, 26212, 26791, 27738, 28595, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28879, 29100, 29522, 31613, + 34568, 35492, 39986, 40711, 23627, 27779, 29508, 29577, 37434, 28331, + 29797, 30239, 31337, 32277, 34314, 20800, 22725, 25793, 29934, 29973, + 30320, 32705, 37013, 38605, 39252, 28198, 29926, 31401, 31402, 33253, + 34521, 34680, 35355, 23113, 23436, 23451, 26785, 26880, 28003, 29609, + 29715, 29740, 30871, 32233, 32747, 33048, 33109, 33694, 35916, 38446, + 38929, 26352, 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, + 30702, 22806, 23916, 24013, 29477, 30031, 63930, 63931, 20709, 20985, + 22575, 22829, 22934, 23002, 23525, 63932, 63933, 23970, 25303, 25622, + 25747, 25854, 63934, 26332, 63935, 27208, 63936, 29183, 29796, 63937, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31368, 31407, 32327, 32350, + 32768, 33136, 63938, 34799, 35201, 35616, 36953, 63939, 36992, 39250, + 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, 20887, 21191, + 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, 28342, 29076, + 29794, 29992, 29996, 32883, 33592, 33993, 36362, 37780, 37854, 63940, + 20110, 20305, 20598, 20778, 21448, 21451, 21491, 23431, 23507, 23588, + 24858, 24962, 26100, 29275, 29591, 29760, 30402, 31056, 31121, 31161, + 32006, 32701, 33419, 34261, 34398, 36802, 36935, 37109, 37354, 38533, + 38632, 38633, 21206, 24423, 26093, 26161, 26671, 29020, 31286, 37057, + 38922, 20113, 63941, 27218, 27550, 28560, 29065, 32792, 33464, 34131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36939, 38549, 38642, 38907, + 34074, 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, + 22435, 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, + 28304, 29232, 29503, 29783, 33489, 34945, 36677, 36960, 63942, 38498, + 39000, 40219, 26376, 36234, 37470, 20301, 20553, 20702, 21361, 22285, + 22996, 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, + 33806, 33894, 34111, 34655, 34907, 35096, 35586, 36949, 38859, 39759, + 20083, 20369, 20754, 20842, 63943, 21807, 21929, 23418, 23461, 24188, + 24189, 24254, 24736, 24799, 24840, 24841, 25540, 25912, 26377, 63944, + 26580, 26586, 63945, 26977, 26978, 27833, 27943, 63946, 28216, 63947, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28641, 29494, 29495, 63948, + 29788, 30001, 63949, 30290, 63950, 63951, 32173, 33278, 33848, 35029, + 35480, 35547, 35565, 36400, 36418, 36938, 36926, 36986, 37193, 37321, + 37742, 63952, 63953, 22537, 63954, 27603, 32905, 32946, 63955, 63956, + 20801, 22891, 23609, 63957, 63958, 28516, 29607, 32996, 36103, 63959, + 37399, 38287, 63960, 63961, 63962, 63963, 32895, 25102, 28700, 32104, + 34701, 63964, 22432, 24681, 24903, 27575, 35518, 37504, 38577, 20057, + 21535, 28139, 34093, 38512, 38899, 39150, 25558, 27875, 37009, 20957, + 25033, 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, + 26885, 27589, 30097, 30691, 32681, 33380, 34191, 34811, 34915, 35516, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 35696, 37291, 20108, 20197, + 20234, 63965, 63966, 22839, 23016, 63967, 24050, 24347, 24411, 24609, + 63968, 63969, 63970, 63971, 29246, 29669, 63972, 30064, 30157, 63973, + 31227, 63974, 32780, 32819, 32900, 33505, 33617, 63975, 63976, 36029, + 36019, 36999, 63977, 63978, 39156, 39180, 63979, 63980, 28727, 30410, + 32714, 32716, 32764, 35610, 20154, 20161, 20995, 21360, 63981, 21693, + 22240, 23035, 23493, 24341, 24525, 28270, 63982, 63983, 32106, 33589, + 63984, 34451, 35469, 63985, 38765, 38775, 63986, 63987, 19968, 20314, + 20350, 22777, 26085, 28322, 36920, 37808, 39353, 20219, 22764, 22922, + 23001, 24641, 63988, 63989, 31252, 63990, 33615, 36035, 20837, 21316, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63991, 63992, 63993, 20173, + 21097, 23381, 33471, 20180, 21050, 21672, 22985, 23039, 23376, 23383, + 23388, 24675, 24904, 28363, 28825, 29038, 29574, 29943, 30133, 30913, + 32043, 32773, 33258, 33576, 34071, 34249, 35566, 36039, 38604, 20316, + 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, 33421, 37196, + 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, 26283, 28507, + 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, 22715, 22767, + 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, 27167, 27299, + 27404, 28479, 29254, 63994, 29520, 29835, 31456, 31911, 33144, 33247, + 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, 38263, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38556, 20877, 21705, 22312, + 23472, 25165, 26448, 26685, 26771, 28221, 28371, 28797, 32289, 35009, + 36001, 36617, 40779, 40782, 29229, 31631, 35533, 37658, 20295, 20302, + 20786, 21632, 22992, 24213, 25269, 26485, 26990, 27159, 27822, 28186, + 29401, 29482, 30141, 31672, 32053, 33511, 33785, 33879, 34295, 35419, + 36015, 36487, 36889, 37048, 38606, 40799, 21219, 21514, 23265, 23490, + 25688, 25973, 28404, 29380, 63995, 30340, 31309, 31515, 31821, 32318, + 32735, 33659, 35627, 36042, 36196, 36321, 36447, 36842, 36857, 36969, + 37841, 20291, 20346, 20659, 20840, 20856, 21069, 21098, 22625, 22652, + 22880, 23560, 23637, 24283, 24731, 25136, 26643, 27583, 27656, 28593, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29006, 29728, 30000, 30008, + 30033, 30322, 31564, 31627, 31661, 31686, 32399, 35438, 36670, 36681, + 37439, 37523, 37666, 37931, 38651, 39002, 39019, 39198, 20999, 25130, + 25240, 27993, 30308, 31434, 31680, 32118, 21344, 23742, 24215, 28472, + 28857, 31896, 38673, 39822, 40670, 25509, 25722, 34678, 19969, 20117, + 20141, 20572, 20597, 21576, 22979, 23450, 24128, 24237, 24311, 24449, + 24773, 25402, 25919, 25972, 26060, 26230, 26232, 26622, 26984, 27273, + 27491, 27712, 28096, 28136, 28191, 28254, 28702, 28833, 29582, 29693, + 30010, 30555, 30855, 31118, 31243, 31357, 31934, 32142, 33351, 35330, + 35562, 35998, 37165, 37194, 37336, 37478, 37580, 37664, 38662, 38742, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38748, 38914, 40718, 21046, + 21137, 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, + 31532, 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, + 38988, 40778, 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, + 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, + 28526, 29031, 29157, 29226, 29866, 30522, 31062, 31066, 31199, 31264, + 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, 35519, + 36249, 36481, 36896, 36973, 37347, 38459, 38613, 40165, 26063, 31751, + 36275, 37827, 23384, 23562, 21330, 25305, 29469, 20519, 23447, 24478, + 24752, 24939, 26837, 28121, 29742, 31278, 32066, 32156, 32305, 33131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36394, 36405, 37758, 37912, + 20304, 22352, 24038, 24231, 25387, 32618, 20027, 20303, 20367, 20570, + 23005, 32964, 21610, 21608, 22014, 22863, 23449, 24030, 24282, 26205, + 26417, 26609, 26666, 27880, 27954, 28234, 28557, 28855, 29664, 30087, + 31820, 32002, 32044, 32162, 33311, 34523, 35387, 35461, 36208, 36490, + 36659, 36913, 37198, 37202, 37956, 39376, 31481, 31909, 20426, 20737, + 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, + 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, + 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, + 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21675, 22320, 22336, 24535, + 25345, 25351, 25711, 25903, 26088, 26234, 26525, 26547, 27490, 27744, + 27802, 28460, 30693, 30757, 31049, 31063, 32025, 32930, 33026, 33267, + 33437, 33463, 34584, 35468, 63996, 36100, 36286, 36978, 30452, 31257, + 31287, 32340, 32887, 21767, 21972, 22645, 25391, 25634, 26185, 26187, + 26733, 27035, 27524, 27941, 28337, 29645, 29800, 29857, 30043, 30137, + 30433, 30494, 30603, 31206, 32265, 32285, 33275, 34095, 34967, 35386, + 36049, 36587, 36784, 36914, 37805, 38499, 38515, 38663, 20356, 21489, + 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, + 36074, 36300, 36845, 26015, 26389, 63997, 22519, 28503, 32221, 36655, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37878, 38598, 24501, 25074, + 28548, 19988, 20376, 20511, 21449, 21983, 23919, 24046, 27425, 27492, + 30923, 31642, 63998, 36425, 36554, 36974, 25417, 25662, 30528, 31364, + 37679, 38015, 40810, 25776, 28591, 29158, 29864, 29914, 31428, 31762, + 32386, 31922, 32408, 35738, 36106, 38013, 39184, 39244, 21049, 23519, + 25830, 26413, 32046, 20717, 21443, 22649, 24920, 24921, 25082, 26028, + 31449, 35730, 35734, 20489, 20513, 21109, 21809, 23100, 24288, 24432, + 24884, 25950, 26124, 26166, 26274, 27085, 28356, 28466, 29462, 30241, + 31379, 33081, 33369, 33750, 33980, 20661, 22512, 23488, 23528, 24425, + 25505, 30758, 32181, 33756, 34081, 37319, 37365, 20874, 26613, 31574, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36012, 20932, 22971, 24765, + 34389, 20508, 63999, 21076, 23610, 24957, 25114, 25299, 25842, 26021, + 28364, 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, + 24029, 25797, 27849, 28154, 29588, 31359, 33307, 34214, 36068, 36368, + 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, + 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, + 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, + 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, + 35531, 38737, 39894, 64000, 21059, 26367, 28053, 28399, 32224, 35558, + 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26898, 26970, 27189, 28818, + 28966, 30813, 30977, 30990, 31186, 31245, 32918, 33400, 33493, 33609, + 34121, 35970, 36229, 37218, 37259, 37294, 20419, 22225, 29165, 30679, + 34560, 35320, 23544, 24534, 26449, 37032, 21474, 22618, 23541, 24740, + 24961, 25696, 32317, 32880, 34085, 37507, 25774, 20652, 23828, 26368, + 22684, 25277, 25512, 26894, 27000, 27166, 28267, 30394, 31179, 33467, + 33833, 35535, 36264, 36861, 37138, 37195, 37276, 37648, 37656, 37786, + 38619, 39478, 39949, 19985, 30044, 31069, 31482, 31569, 31689, 32302, + 33988, 36441, 36468, 36600, 36880, 26149, 26943, 29763, 20986, 26414, + 40668, 20805, 24544, 27798, 34802, 34909, 34935, 24756, 33205, 33795, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36101, 21462, 21561, 22068, + 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, + 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, + 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, + 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, + 40786, 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, 23522, + 26517, 27784, 28024, 29723, 30759, 37341, 37756, 34756, 31204, 31281, + 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, 25302, 26422, + 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, 22396, 64001, + 25176, 64002, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37944, 21585, 22022, 22374, + 24392, 24986, 27470, 28760, 28845, 32187, 35477, 22890, 33067, 25506, + 30472, 32829, 36010, 22612, 25645, 27067, 23445, 24081, 28271, 64003, + 34153, 20812, 21488, 22826, 24608, 24907, 27526, 27760, 27888, 31518, + 32974, 33492, 36294, 37040, 39089, 64004, 25799, 28580, 25745, 25860, + 20814, 21520, 22303, 35342, 24927, 26742, 64005, 30171, 31570, 32113, + 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, 22871, 22956, + 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, 24052, 25226, + 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, 32631, 33453, + 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, 36774, 37393, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38442, 20843, 21485, 25420, + 20329, 21764, 24726, 25943, 27803, 28031, 29260, 29437, 31255, 35207, + 35997, 24429, 28558, 28921, 33192, 24846, 20415, 20559, 25153, 29255, + 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, + 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, + 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, + 24598, 25243, 25265, 25429, 64006, 27873, 28006, 30129, 30770, 32990, + 33071, 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, + 24133, 26292, 26333, 28689, 29190, 64007, 20469, 21117, 24426, 24915, + 26451, 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21697, 31263, 26963, 35575, + 35914, 39080, 39342, 24444, 25259, 30130, 30382, 34987, 36991, 38466, + 21305, 24380, 24517, 27852, 29644, 30050, 30091, 31558, 33534, 39325, + 20047, 36924, 19979, 20309, 21414, 22799, 24264, 26160, 27827, 29781, + 33655, 34662, 36032, 36944, 38686, 39957, 22737, 23416, 34384, 35604, + 40372, 23506, 24680, 24717, 26097, 27735, 28450, 28579, 28698, 32597, + 32752, 38289, 38290, 38480, 38867, 21106, 36676, 20989, 21547, 21688, + 21859, 21898, 27323, 28085, 32216, 33382, 37532, 38519, 40569, 21512, + 21704, 30418, 34532, 38308, 38356, 38492, 20130, 20233, 23022, 23270, + 24055, 24658, 25239, 26477, 26689, 27782, 28207, 32568, 32923, 33322, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 64008, 64009, 38917, 20133, + 20565, 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, + 34809, 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, + 24184, 26447, 33607, 34892, 20139, 21521, 22190, 29670, 37141, 38911, + 39177, 39255, 39321, 22099, 22687, 34395, 35377, 25010, 27382, 29563, + 36562, 27463, 38570, 39511, 22869, 29184, 36203, 38761, 20436, 23796, + 24358, 25080, 26203, 27883, 28843, 29572, 29625, 29694, 30505, 30541, + 32067, 32098, 32291, 33335, 34898, 64010, 36066, 37449, 39023, 23377, + 31348, 34880, 38913, 23244, 20448, 21332, 22846, 23805, 25406, 28025, + 29433, 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24418, 27842, 28366, 28677, + 28752, 28847, 29074, 29673, 29801, 33610, 34722, 34913, 36872, 37026, + 37795, 39336, 20846, 24407, 24800, 24935, 26291, 34137, 36426, 37295, + 38795, 20046, 20114, 21628, 22741, 22778, 22909, 23733, 24359, 25142, + 25160, 26122, 26215, 27627, 28009, 28111, 28246, 28408, 28564, 28640, + 28649, 28765, 29392, 29733, 29786, 29920, 30355, 31068, 31946, 32286, + 32993, 33446, 33899, 33983, 34382, 34399, 34676, 35703, 35946, 37804, + 38912, 39013, 24785, 25110, 37239, 23130, 26127, 28151, 28222, 29759, + 39746, 24573, 24794, 31503, 21700, 24344, 27742, 27859, 27946, 28888, + 32005, 34425, 35340, 40251, 21270, 21644, 23301, 27194, 28779, 30069, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31117, 31166, 33457, 33775, + 35441, 35649, 36008, 38772, 64011, 25844, 25899, 30906, 30907, 31339, + 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, + 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, 28369, 29502, + 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, 26179, + 26180, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, 31681, + 31783, 33618, 34647, 36945, 38541, 40643, 21295, 22238, 24315, 24458, + 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, 28784, 29546, + 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, 23446, 27243, + 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, 28045, 28102, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29243, 32948, 37237, 39501, + 20399, 20505, 21402, 21518, 21564, 21897, 21957, 24127, 24460, 26429, + 29030, 29661, 36869, 21211, 21235, 22628, 22734, 28932, 29071, 29179, + 34224, 35347, 26248, 34216, 21927, 26244, 29002, 33841, 21321, 21913, + 27585, 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, + 25658, 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, + 27958, 33016, 40657, 26133, 27427, 28824, 30165, 21507, 23673, 32007, + 35350, 27424, 27453, 27462, 21560, 24688, 27965, 32725, 33288, 20694, + 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, 25137, + 26206, 26342, 29081, 29113, 29114, 29351, 31143, 31232, 32690, 35440, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myencoding_map_gb18030[] = { + 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, + 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, + 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, + 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, + 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, + 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, + 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, + 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, + 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, + 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, + 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, + 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, + 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, + 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, + 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, + 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, + 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, + 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, + 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, + 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, + 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, + 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, + 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, + 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, + 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, + 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, + 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, + 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, + 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, + 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, + 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, + 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, + 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, + 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, + 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, + 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, + 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, + 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, + 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, + 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, + 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, + 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, + 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, + 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, + 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, + 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, + 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, + 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, + 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, + 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, + 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, + 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, + 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, + 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, + 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, + 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, + 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, + 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, + 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, + 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, + 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, + 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, + 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, + 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, + 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, + 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, + 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, + 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, + 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, + 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, + 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, + 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, + 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, + 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, + 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, + 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, + 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, + 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, + 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, + 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, + 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, + 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, + 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, + 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, + 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, + 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, + 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, + 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, + 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, + 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, + 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, + 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, + 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, + 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, + 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, + 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, + 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, + 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, + 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, + 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, + 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, + 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, + 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, + 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, + 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, + 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, + 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, + 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, + 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, + 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, + 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, + 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, + 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, + 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, + 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, + 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, + 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, + 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, + 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, + 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, + 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, + 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, + 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, + 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, + 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, + 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, + 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, + 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, + 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, + 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, + 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, + 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, + 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, + 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, + 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, + 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, + 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, + 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, + 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, + 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, + 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, + 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, + 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, + 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, + 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, + 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, + 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, + 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, + 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, + 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, + 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, + 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, + 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, + 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, + 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, + 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, + 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, + 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, + 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, + 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, + 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, + 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, + 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, + 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, + 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, + 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, + 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, + 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, + 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, + 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, + 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, + 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, + 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, + 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, + 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, + 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, + 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, + 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, + 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, + 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, + 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, + 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, + 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, + 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, + 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, + 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, + 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, + 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, + 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, + 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, + 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, + 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, + 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, + 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, + 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, + 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, + 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, + 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, + 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, + 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, + 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, + 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, + 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, + 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, + 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, + 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, + 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, + 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, + 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, + 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, + 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, + 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, + 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, + 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, + 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, + 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, + 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, + 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, + 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, + 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, + 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, + 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, + 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, + 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, + 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, + 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, + 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, + 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, + 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, + 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, + 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, + 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, + 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, + 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, + 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, + 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, + 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, + 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, + 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, + 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, + 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, + 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, + 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, + 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, + 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, + 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, + 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, + 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, + 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, + 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, + 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, + 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, + 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, + 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, + 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, + 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, + 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, + 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, + 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, + 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, + 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, + 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, + 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, + 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, + 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, + 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, + 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, + 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, + 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, + 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, + 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, + 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, + 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, + 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, + 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, + 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, + 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, + 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, + 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, + 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, + 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, + 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, + 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, + 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, + 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, + 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, + 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, + 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, + 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, + 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, + 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, + 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, + 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, + 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, + 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, + 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, + 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, + 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, + 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, + 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, + 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, + 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, + 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, + 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, + 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, + 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, + 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, + 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, + 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, + 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, + 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, + 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, + 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, + 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, + 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, + 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, + 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, + 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, + 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, + 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, + 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, + 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, + 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, + 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, + 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, + 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, + 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, + 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, + 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, + 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, + 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, + 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, + 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, + 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, + 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, + 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, + 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, + 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, + 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, + 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, + 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, + 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, + 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, + 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, + 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, + 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, + 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, + 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, + 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, + 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, + 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, + 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, + 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, + 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, + 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, + 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, + 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, + 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, + 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, + 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, + 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, + 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, + 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, + 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, + 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, + 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, + 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, + 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, + 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, + 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, + 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, + 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, + 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, + 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, + 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, + 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, + 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, + 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, + 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, + 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, + 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, + 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, + 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, + 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, + 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, + 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, + 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, + 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, + 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, + 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, + 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, + 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, + 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, + 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, + 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, + 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, + 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, + 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, + 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, + 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, + 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, + 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, + 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, + 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, + 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, + 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, + 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, + 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, + 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, + 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, + 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, + 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, + 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, + 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, + 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, + 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, + 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, + 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, + 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, + 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, + 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, + 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, + 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, + 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, + 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, + 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, + 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, + 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, + 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, + 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, + 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, + 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, + 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, + 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, + 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, + 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, + 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, + 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, + 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, + 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, + 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, + 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, + 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, + 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, + 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, + 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, + 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, + 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, + 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, + 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, + 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, + 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, + 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, + 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, + 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, + 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, + 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, + 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, + 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, + 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, + 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, + 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, + 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, + 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, + 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, + 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, + 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, + 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, + 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, + 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, + 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, + 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, + 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, + 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, + 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, + 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, + 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, + 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, + 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, + 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, + 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, + 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, + 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, + 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, + 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, + 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, + 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, + 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, + 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, + 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, + 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, + 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, + 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, + 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, + 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, + 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, + 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, + 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, + 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, + 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, + 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, + 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, + 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, + 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, + 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, + 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, + 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, + 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, + 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, + 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, + 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, + 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, + 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, + 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, + 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, + 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, + 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, + 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, + 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, + 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, + 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, + 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, + 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, + 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, + 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, + 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, + 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, + 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, + 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, + 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, + 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, + 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, + 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, + 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, + 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, + 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, + 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, + 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, + 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, + 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, + 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, + 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, + 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, + 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, + 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, + 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, + 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, + 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, + 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, + 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, + 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, + 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, + 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, + 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, + 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, + 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, + 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, + 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, + 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, + 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, + 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, + 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, + 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, + 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, + 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, + 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, + 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, + 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, + 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, + 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, + 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, + 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, + 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, + 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, + 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, + 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, + 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, + 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, + 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, + 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, + 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, + 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, + 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, + 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, + 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, + 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, + 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, + 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, + 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, + 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, + 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, + 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, + 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, + 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, + 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, + 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, + 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, + 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, + 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, + 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, + 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, + 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, + 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, + 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, + 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, + 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, + 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, + 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, + 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, + 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, + 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, + 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, + 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, + 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, + 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58633, 58634, 58635, + 58636, 58637, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, + 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, + 58656, 58657, 58658, 58659, 58660, 58661, 12288, 12289, 12290, 183, + 713, 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12310, 12311, 12304, 12305, 177, 215, 247, + 8758, 8743, 8744, 8721, 8719, 8746, 8745, 8712, 8759, 8730, + 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, 8780, 8776, + 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, 8756, + 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, + 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, + 9633, 9632, 9651, 9650, 8251, 8594, 8592, 8593, 8595, 12307, + 58662, 58663, 58664, 58665, 58666, 58667, 58668, 58669, 58670, 58671, + 58672, 58673, 58674, 58675, 58676, 58677, 58678, 58679, 58680, 58681, + 58682, 58683, 58684, 58685, 58686, 58687, 58688, 58689, 58690, 58691, + 58692, 58693, 58694, 58695, 58696, 58697, 58698, 58699, 58700, 58701, + 58702, 58703, 58704, 58705, 58706, 58707, 58708, 58709, 58710, 58711, + 58712, 58713, 58714, 58715, 58716, 58717, 58718, 58719, 58720, 58721, + 58722, 58723, 58724, 58725, 58726, 58727, 58728, 58729, 58730, 58731, + 58732, 58733, 58734, 58735, 58736, 58737, 58738, 58739, 58740, 58741, + 58742, 58743, 58744, 58745, 58746, 58747, 58748, 58749, 58750, 58751, + 58752, 58753, 58754, 58755, 58756, 58757, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 59238, 59239, 59240, 59241, + 59242, 59243, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, + 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, + 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, + 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, + 9350, 9351, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, + 9320, 9321, 8364, 59245, 12832, 12833, 12834, 12835, 12836, 12837, + 12838, 12839, 12840, 12841, 59246, 59247, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 59248, 59249, + 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, 58766, 58767, + 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, 58776, 58777, + 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, 58786, 58787, + 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, 58796, 58797, + 58798, 58799, 58800, 58801, 58802, 58803, 58804, 58805, 58806, 58807, + 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, 58816, 58817, + 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, 58826, 58827, + 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, 58836, 58837, + 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, 58846, 58847, + 58848, 58849, 58850, 58851, 58852, 12288, 65281, 65282, 65283, 65509, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, 58862, 58863, + 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58871, 58872, 58873, + 58874, 58875, 58876, 58877, 58878, 58879, 58880, 58881, 58882, 58883, + 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, 58892, 58893, + 58894, 58895, 58896, 58897, 58898, 58899, 58900, 58901, 58902, 58903, + 58904, 58905, 58906, 58907, 58908, 58909, 58910, 58911, 58912, 58913, + 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, 58922, 58923, + 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, 58932, 58933, + 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, 58942, 58943, + 58944, 58945, 58946, 58947, 58948, 58949, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 59250, + 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, + 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, 58958, 58959, + 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, 58968, 58969, + 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, 58978, 58979, + 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, 58988, 58989, + 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, 58998, 58999, + 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, 59008, 59009, + 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, 59018, 59019, + 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, 59028, 59029, + 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, + 59040, 59041, 59042, 59043, 59044, 59045, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 59261, 59262, 59263, 59264, 59265, 59266, 59267, 59268, + 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, 59054, 59055, + 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, 59064, 59065, + 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, + 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, 59084, 59085, + 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, 59094, 59095, + 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, 59104, 59105, + 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, 59114, 59115, + 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, 59124, 59125, + 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, 59134, 59135, + 59136, 59137, 59138, 59139, 59140, 59141, 913, 914, 915, 916, + 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 59269, 59270, 59271, 59272, 59273, 59274, 59275, 59276, 945, 946, + 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, + 968, 969, 59277, 59278, 59279, 59280, 59281, 59282, 59283, 65077, + 65078, 65081, 65082, 65087, 65088, 65085, 65086, 65089, 65090, 65091, + 65092, 59284, 59285, 65083, 65084, 65079, 65080, 65073, 59286, 65075, + 65076, 59287, 59288, 59289, 59290, 59291, 59292, 59293, 59294, 59295, + 59142, 59143, 59144, 59145, 59146, 59147, 59148, 59149, 59150, 59151, + 59152, 59153, 59154, 59155, 59156, 59157, 59158, 59159, 59160, 59161, + 59162, 59163, 59164, 59165, 59166, 59167, 59168, 59169, 59170, 59171, + 59172, 59173, 59174, 59175, 59176, 59177, 59178, 59179, 59180, 59181, + 59182, 59183, 59184, 59185, 59186, 59187, 59188, 59189, 59190, 59191, + 59192, 59193, 59194, 59195, 59196, 59197, 59198, 59199, 59200, 59201, + 59202, 59203, 59204, 59205, 59206, 59207, 59208, 59209, 59210, 59211, + 59212, 59213, 59214, 59215, 59216, 59217, 59218, 59219, 59220, 59221, + 59222, 59223, 59224, 59225, 59226, 59227, 59228, 59229, 59230, 59231, + 59232, 59233, 59234, 59235, 59236, 59237, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 59296, + 59297, 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, + 59307, 59308, 59309, 59310, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 59311, 59312, 59313, + 59314, 59315, 59316, 59317, 59318, 59319, 59320, 59321, 59322, 59323, + 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, 8598, + 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, + 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, + 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, + 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, + 9582, 9583, 9584, 9585, 9586, 9587, 9601, 9602, 9603, 9604, + 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, + 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, + 9737, 8853, 12306, 12317, 12318, 59324, 59325, 59326, 59327, 59328, + 59329, 59330, 59331, 59332, 59333, 59334, 257, 225, 462, 224, + 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, + 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, + 252, 234, 593, 7743, 324, 328, 505, 609, 59337, 59338, + 59339, 59340, 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, + 12557, 12558, 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, + 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, + 12577, 12578, 12579, 12580, 12581, 12582, 12583, 12584, 12585, 59341, + 59342, 59343, 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, + 59352, 59353, 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, + 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, + 13198, 13199, 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, + 13269, 65072, 65506, 65508, 59362, 8481, 12849, 59363, 8208, 59364, + 59365, 59366, 12540, 12443, 12444, 12541, 12542, 12294, 12445, 12446, + 65097, 65098, 65099, 65100, 65101, 65102, 65103, 65104, 65105, 65106, + 65108, 65109, 65110, 65111, 65113, 65114, 65115, 65116, 65117, 65118, + 65119, 65120, 65121, 65122, 65123, 65124, 65125, 65126, 65128, 65129, + 65130, 65131, 12350, 12272, 12273, 12274, 12275, 12276, 12277, 12278, + 12279, 12280, 12281, 12282, 12283, 12295, 59380, 59381, 59382, 59383, + 59384, 59385, 59386, 59387, 59388, 59389, 59390, 59391, 59392, 9472, + 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, + 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, + 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, + 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, + 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, + 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, + 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 9547, 59393, 59394, 59395, 59396, 59397, + 59398, 59399, 59400, 59401, 59402, 59403, 59404, 59405, 59406, 59407, + 29404, 29405, 29407, 29410, 29411, 29412, 29413, 29414, 29415, 29418, + 29419, 29429, 29430, 29433, 29437, 29438, 29439, 29440, 29442, 29444, + 29445, 29446, 29447, 29448, 29449, 29451, 29452, 29453, 29455, 29456, + 29457, 29458, 29460, 29464, 29465, 29466, 29471, 29472, 29475, 29476, + 29478, 29479, 29480, 29485, 29487, 29488, 29490, 29491, 29493, 29494, + 29498, 29499, 29500, 29501, 29504, 29505, 29506, 29507, 29508, 29509, + 29510, 29511, 29512, 29513, 29514, 29515, 29516, 29518, 29519, 29521, + 29523, 29524, 29525, 29526, 29528, 29529, 29530, 29531, 29532, 29533, + 29534, 29535, 29537, 29538, 29539, 29540, 29541, 29542, 29543, 29544, + 29545, 29546, 29547, 29550, 29552, 29553, 57344, 57345, 57346, 57347, + 57348, 57349, 57350, 57351, 57352, 57353, 57354, 57355, 57356, 57357, + 57358, 57359, 57360, 57361, 57362, 57363, 57364, 57365, 57366, 57367, + 57368, 57369, 57370, 57371, 57372, 57373, 57374, 57375, 57376, 57377, + 57378, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57387, + 57388, 57389, 57390, 57391, 57392, 57393, 57394, 57395, 57396, 57397, + 57398, 57399, 57400, 57401, 57402, 57403, 57404, 57405, 57406, 57407, + 57408, 57409, 57410, 57411, 57412, 57413, 57414, 57415, 57416, 57417, + 57418, 57419, 57420, 57421, 57422, 57423, 57424, 57425, 57426, 57427, + 57428, 57429, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 57437, + 29554, 29555, 29556, 29557, 29558, 29559, 29560, 29561, 29562, 29563, + 29564, 29565, 29567, 29568, 29569, 29570, 29571, 29573, 29574, 29576, + 29578, 29580, 29581, 29583, 29584, 29586, 29587, 29588, 29589, 29591, + 29592, 29593, 29594, 29596, 29597, 29598, 29600, 29601, 29603, 29604, + 29605, 29606, 29607, 29608, 29610, 29612, 29613, 29617, 29620, 29621, + 29622, 29624, 29625, 29628, 29629, 29630, 29631, 29633, 29635, 29636, + 29637, 29638, 29639, 29643, 29644, 29646, 29650, 29651, 29652, 29653, + 29654, 29655, 29656, 29658, 29659, 29660, 29661, 29663, 29665, 29666, + 29667, 29668, 29670, 29672, 29674, 29675, 29676, 29678, 29679, 29680, + 29681, 29683, 29684, 29685, 29686, 29687, 57438, 57439, 57440, 57441, + 57442, 57443, 57444, 57445, 57446, 57447, 57448, 57449, 57450, 57451, + 57452, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 57460, 57461, + 57462, 57463, 57464, 57465, 57466, 57467, 57468, 57469, 57470, 57471, + 57472, 57473, 57474, 57475, 57476, 57477, 57478, 57479, 57480, 57481, + 57482, 57483, 57484, 57485, 57486, 57487, 57488, 57489, 57490, 57491, + 57492, 57493, 57494, 57495, 57496, 57497, 57498, 57499, 57500, 57501, + 57502, 57503, 57504, 57505, 57506, 57507, 57508, 57509, 57510, 57511, + 57512, 57513, 57514, 57515, 57516, 57517, 57518, 57519, 57520, 57521, + 57522, 57523, 57524, 57525, 57526, 57527, 57528, 57529, 57530, 57531, + 29688, 29689, 29690, 29691, 29692, 29693, 29694, 29695, 29696, 29697, + 29698, 29700, 29703, 29704, 29707, 29708, 29709, 29710, 29713, 29714, + 29715, 29716, 29717, 29718, 29719, 29720, 29721, 29724, 29725, 29726, + 29727, 29728, 29729, 29731, 29732, 29735, 29737, 29739, 29741, 29743, + 29745, 29746, 29751, 29752, 29753, 29754, 29755, 29757, 29758, 29759, + 29760, 29762, 29763, 29764, 29765, 29766, 29767, 29768, 29769, 29770, + 29771, 29772, 29773, 29774, 29775, 29776, 29777, 29778, 29779, 29780, + 29782, 29784, 29789, 29792, 29793, 29794, 29795, 29796, 29797, 29798, + 29799, 29800, 29801, 29802, 29803, 29804, 29806, 29807, 29809, 29810, + 29811, 29812, 29813, 29816, 29817, 29818, 57532, 57533, 57534, 57535, + 57536, 57537, 57538, 57539, 57540, 57541, 57542, 57543, 57544, 57545, + 57546, 57547, 57548, 57549, 57550, 57551, 57552, 57553, 57554, 57555, + 57556, 57557, 57558, 57559, 57560, 57561, 57562, 57563, 57564, 57565, + 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57573, 57574, 57575, + 57576, 57577, 57578, 57579, 57580, 57581, 57582, 57583, 57584, 57585, + 57586, 57587, 57588, 57589, 57590, 57591, 57592, 57593, 57594, 57595, + 57596, 57597, 57598, 57599, 57600, 57601, 57602, 57603, 57604, 57605, + 57606, 57607, 57608, 57609, 57610, 57611, 57612, 57613, 57614, 57615, + 57616, 57617, 57618, 57619, 57620, 57621, 57622, 57623, 57624, 57625, + 29819, 29820, 29821, 29823, 29826, 29828, 29829, 29830, 29832, 29833, + 29834, 29836, 29837, 29839, 29841, 29842, 29843, 29844, 29845, 29846, + 29847, 29848, 29849, 29850, 29851, 29853, 29855, 29856, 29857, 29858, + 29859, 29860, 29861, 29862, 29866, 29867, 29868, 29869, 29870, 29871, + 29872, 29873, 29874, 29875, 29876, 29877, 29878, 29879, 29880, 29881, + 29883, 29884, 29885, 29886, 29887, 29888, 29889, 29890, 29891, 29892, + 29893, 29894, 29895, 29896, 29897, 29898, 29899, 29900, 29901, 29902, + 29903, 29904, 29905, 29907, 29908, 29909, 29910, 29911, 29912, 29913, + 29914, 29915, 29917, 29919, 29921, 29925, 29927, 29928, 29929, 29930, + 29931, 29932, 29933, 29936, 29937, 29938, 57626, 57627, 57628, 57629, + 57630, 57631, 57632, 57633, 57634, 57635, 57636, 57637, 57638, 57639, + 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, + 57650, 57651, 57652, 57653, 57654, 57655, 57656, 57657, 57658, 57659, + 57660, 57661, 57662, 57663, 57664, 57665, 57666, 57667, 57668, 57669, + 57670, 57671, 57672, 57673, 57674, 57675, 57676, 57677, 57678, 57679, + 57680, 57681, 57682, 57683, 57684, 57685, 57686, 57687, 57688, 57689, + 57690, 57691, 57692, 57693, 57694, 57695, 57696, 57697, 57698, 57699, + 57700, 57701, 57702, 57703, 57704, 57705, 57706, 57707, 57708, 57709, + 57710, 57711, 57712, 57713, 57714, 57715, 57716, 57717, 57718, 57719, + 29939, 29941, 29944, 29945, 29946, 29947, 29948, 29949, 29950, 29952, + 29953, 29954, 29955, 29957, 29958, 29959, 29960, 29961, 29962, 29963, + 29964, 29966, 29968, 29970, 29972, 29973, 29974, 29975, 29979, 29981, + 29982, 29984, 29985, 29986, 29987, 29988, 29990, 29991, 29994, 29998, + 30004, 30006, 30009, 30012, 30013, 30015, 30017, 30018, 30019, 30020, + 30022, 30023, 30025, 30026, 30029, 30032, 30033, 30034, 30035, 30037, + 30038, 30039, 30040, 30045, 30046, 30047, 30048, 30049, 30050, 30051, + 30052, 30055, 30056, 30057, 30059, 30060, 30061, 30062, 30063, 30064, + 30065, 30067, 30069, 30070, 30071, 30074, 30075, 30076, 30077, 30078, + 30080, 30081, 30082, 30084, 30085, 30087, 57720, 57721, 57722, 57723, + 57724, 57725, 57726, 57727, 57728, 57729, 57730, 57731, 57732, 57733, + 57734, 57735, 57736, 57737, 57738, 57739, 57740, 57741, 57742, 57743, + 57744, 57745, 57746, 57747, 57748, 57749, 57750, 57751, 57752, 57753, + 57754, 57755, 57756, 57757, 57758, 57759, 57760, 57761, 57762, 57763, + 57764, 57765, 57766, 57767, 57768, 57769, 57770, 57771, 57772, 57773, + 57774, 57775, 57776, 57777, 57778, 57779, 57780, 57781, 57782, 57783, + 57784, 57785, 57786, 57787, 57788, 57789, 57790, 57791, 57792, 57793, + 57794, 57795, 57796, 57797, 57798, 57799, 57800, 57801, 57802, 57803, + 57804, 57805, 57806, 57807, 57808, 57809, 57810, 57811, 57812, 57813, + 30088, 30089, 30090, 30092, 30093, 30094, 30096, 30099, 30101, 30104, + 30107, 30108, 30110, 30114, 30118, 30119, 30120, 30121, 30122, 30125, + 30134, 30135, 30138, 30139, 30143, 30144, 30145, 30150, 30155, 30156, + 30158, 30159, 30160, 30161, 30163, 30167, 30169, 30170, 30172, 30173, + 30175, 30176, 30177, 30181, 30185, 30188, 30189, 30190, 30191, 30194, + 30195, 30197, 30198, 30199, 30200, 30202, 30203, 30205, 30206, 30210, + 30212, 30214, 30215, 30216, 30217, 30219, 30221, 30222, 30223, 30225, + 30226, 30227, 30228, 30230, 30234, 30236, 30237, 30238, 30241, 30243, + 30247, 30248, 30252, 30254, 30255, 30257, 30258, 30262, 30263, 30265, + 30266, 30267, 30269, 30273, 30274, 30276, 57814, 57815, 57816, 57817, + 57818, 57819, 57820, 57821, 57822, 57823, 57824, 57825, 57826, 57827, + 57828, 57829, 57830, 57831, 57832, 57833, 57834, 57835, 57836, 57837, + 57838, 57839, 57840, 57841, 57842, 57843, 57844, 57845, 57846, 57847, + 57848, 57849, 57850, 57851, 57852, 57853, 57854, 57855, 57856, 57857, + 57858, 57859, 57860, 57861, 57862, 57863, 57864, 57865, 57866, 57867, + 57868, 57869, 57870, 57871, 57872, 57873, 57874, 57875, 57876, 57877, + 57878, 57879, 57880, 57881, 57882, 57883, 57884, 57885, 57886, 57887, + 57888, 57889, 57890, 57891, 57892, 57893, 57894, 57895, 57896, 57897, + 57898, 57899, 57900, 57901, 57902, 57903, 57904, 57905, 57906, 57907, + 30277, 30278, 30279, 30280, 30281, 30282, 30283, 30286, 30287, 30288, + 30289, 30290, 30291, 30293, 30295, 30296, 30297, 30298, 30299, 30301, + 30303, 30304, 30305, 30306, 30308, 30309, 30310, 30311, 30312, 30313, + 30314, 30316, 30317, 30318, 30320, 30321, 30322, 30323, 30324, 30325, + 30326, 30327, 30329, 30330, 30332, 30335, 30336, 30337, 30339, 30341, + 30345, 30346, 30348, 30349, 30351, 30352, 30354, 30356, 30357, 30359, + 30360, 30362, 30363, 30364, 30365, 30366, 30367, 30368, 30369, 30370, + 30371, 30373, 30374, 30375, 30376, 30377, 30378, 30379, 30380, 30381, + 30383, 30384, 30387, 30389, 30390, 30391, 30392, 30393, 30394, 30395, + 30396, 30397, 30398, 30400, 30401, 30403, 21834, 38463, 22467, 25384, + 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, 29233, + 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, 26696, + 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, 22885, + 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, 20843, 30116, + 24052, 25300, 36299, 38774, 25226, 32793, 22365, 38712, 32610, 29240, + 30333, 26575, 30334, 25670, 20336, 36133, 25308, 31255, 26001, 29677, + 25644, 25203, 33324, 39041, 26495, 29256, 25198, 25292, 20276, 29923, + 21322, 21150, 32458, 37030, 24110, 26758, 27036, 33152, 32465, 26834, + 30917, 34444, 38225, 20621, 35876, 33502, 32990, 21253, 35090, 21093, + 30404, 30407, 30409, 30411, 30412, 30419, 30421, 30425, 30426, 30428, + 30429, 30430, 30432, 30433, 30434, 30435, 30436, 30438, 30439, 30440, + 30441, 30442, 30443, 30444, 30445, 30448, 30451, 30453, 30454, 30455, + 30458, 30459, 30461, 30463, 30464, 30466, 30467, 30469, 30470, 30474, + 30476, 30478, 30479, 30480, 30481, 30482, 30483, 30484, 30485, 30486, + 30487, 30488, 30491, 30492, 30493, 30494, 30497, 30499, 30500, 30501, + 30503, 30506, 30507, 30508, 30510, 30512, 30513, 30514, 30515, 30516, + 30521, 30523, 30525, 30526, 30527, 30530, 30532, 30533, 30534, 30536, + 30537, 30538, 30539, 30540, 30541, 30542, 30543, 30546, 30547, 30548, + 30549, 30550, 30551, 30552, 30553, 30556, 34180, 38649, 20445, 22561, + 39281, 23453, 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, + 24754, 21329, 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, + 24811, 28953, 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, + 27893, 36454, 36856, 36924, 40763, 27604, 37145, 31508, 24444, 30887, + 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, + 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, + 36140, 25153, 20415, 21464, 21342, 36776, 36777, 36779, 36941, 26631, + 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, + 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, + 30557, 30558, 30559, 30560, 30564, 30567, 30569, 30570, 30573, 30574, + 30575, 30576, 30577, 30578, 30579, 30580, 30581, 30582, 30583, 30584, + 30586, 30587, 30588, 30593, 30594, 30595, 30598, 30599, 30600, 30601, + 30602, 30603, 30607, 30608, 30611, 30612, 30613, 30614, 30615, 30616, + 30617, 30618, 30619, 30620, 30621, 30622, 30625, 30627, 30628, 30630, + 30632, 30635, 30637, 30638, 30639, 30641, 30642, 30644, 30646, 30647, + 30648, 30649, 30650, 30652, 30654, 30656, 30657, 30658, 30659, 30660, + 30661, 30662, 30663, 30664, 30665, 30666, 30667, 30668, 30670, 30671, + 30672, 30673, 30674, 30675, 30676, 30677, 30678, 30680, 30681, 30682, + 30685, 30686, 30687, 30688, 30689, 30692, 30149, 24182, 29627, 33760, + 25773, 25320, 38069, 27874, 21338, 21187, 25615, 38082, 31636, 20271, + 24091, 33334, 33046, 33162, 28196, 27850, 39539, 25429, 21340, 21754, + 34917, 22496, 19981, 24067, 27493, 31807, 37096, 24598, 25830, 29468, + 35009, 26448, 25165, 36130, 30572, 36393, 37319, 24425, 33756, 34081, + 39184, 21442, 34453, 27531, 24813, 24808, 28799, 33485, 33329, 20179, + 27815, 34255, 25805, 31961, 27133, 26361, 33609, 21397, 31574, 20391, + 20876, 27979, 23618, 36461, 25554, 21449, 33580, 33590, 26597, 30900, + 25661, 23519, 23700, 24046, 35815, 25286, 26612, 35962, 25600, 25530, + 34633, 39307, 35863, 32544, 38130, 20135, 38416, 39076, 26124, 29462, + 30694, 30696, 30698, 30703, 30704, 30705, 30706, 30708, 30709, 30711, + 30713, 30714, 30715, 30716, 30723, 30724, 30725, 30726, 30727, 30728, + 30730, 30731, 30734, 30735, 30736, 30739, 30741, 30745, 30747, 30750, + 30752, 30753, 30754, 30756, 30760, 30762, 30763, 30766, 30767, 30769, + 30770, 30771, 30773, 30774, 30781, 30783, 30785, 30786, 30787, 30788, + 30790, 30792, 30793, 30794, 30795, 30797, 30799, 30801, 30803, 30804, + 30808, 30809, 30810, 30811, 30812, 30814, 30815, 30816, 30817, 30818, + 30819, 30820, 30821, 30822, 30823, 30824, 30825, 30831, 30832, 30833, + 30834, 30835, 30836, 30837, 30838, 30840, 30841, 30842, 30843, 30845, + 30846, 30847, 30848, 30849, 30850, 30851, 22330, 23581, 24120, 38271, + 20607, 32928, 21378, 25950, 30021, 21809, 20513, 36229, 25220, 38046, + 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, + 24443, 28552, 37108, 33251, 36784, 23576, 26216, 24561, 27785, 38472, + 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, 20056, 31243, + 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, 30196, 25345, + 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, 23610, 36196, + 32709, 26021, 28861, 20805, 20914, 34411, 23815, 23456, 25277, 37228, + 30068, 36364, 31264, 24833, 31609, 20167, 32504, 30597, 19985, 33261, + 21021, 20986, 27249, 21416, 36487, 38148, 38607, 28353, 38500, 26970, + 30852, 30853, 30854, 30856, 30858, 30859, 30863, 30864, 30866, 30868, + 30869, 30870, 30873, 30877, 30878, 30880, 30882, 30884, 30886, 30888, + 30889, 30890, 30891, 30892, 30893, 30894, 30895, 30901, 30902, 30903, + 30904, 30906, 30907, 30908, 30909, 30911, 30912, 30914, 30915, 30916, + 30918, 30919, 30920, 30924, 30925, 30926, 30927, 30929, 30930, 30931, + 30934, 30935, 30936, 30938, 30939, 30940, 30941, 30942, 30943, 30944, + 30945, 30946, 30947, 30948, 30949, 30950, 30951, 30953, 30954, 30955, + 30957, 30958, 30959, 30960, 30961, 30963, 30965, 30966, 30968, 30969, + 30971, 30972, 30973, 30974, 30975, 30976, 30978, 30979, 30980, 30982, + 30983, 30984, 30985, 30986, 30987, 30988, 30784, 20648, 30679, 25616, + 35302, 22788, 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, + 30126, 31383, 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, + 22402, 26149, 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, + 30133, 33576, 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, + 36176, 27425, 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, + 37259, 31751, 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, + 30209, 31929, 28140, 32736, 26449, 23384, 23544, 30923, 25774, 25619, + 25514, 25387, 38169, 25645, 36798, 31572, 30249, 25171, 22823, 21574, + 27513, 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, 36910, + 30989, 30990, 30991, 30992, 30993, 30994, 30996, 30997, 30998, 30999, + 31000, 31001, 31002, 31003, 31004, 31005, 31007, 31008, 31009, 31010, + 31011, 31013, 31014, 31015, 31016, 31017, 31018, 31019, 31020, 31021, + 31022, 31023, 31024, 31025, 31026, 31027, 31029, 31030, 31031, 31032, + 31033, 31037, 31039, 31042, 31043, 31044, 31045, 31047, 31050, 31051, + 31052, 31053, 31054, 31055, 31056, 31057, 31058, 31060, 31061, 31064, + 31065, 31073, 31075, 31076, 31078, 31081, 31082, 31083, 31084, 31086, + 31088, 31089, 31090, 31091, 31092, 31093, 31094, 31097, 31099, 31100, + 31101, 31102, 31103, 31106, 31107, 31110, 31111, 31112, 31113, 31115, + 31116, 31117, 31118, 31120, 31121, 31122, 24608, 32829, 25285, 20025, + 21333, 37112, 25528, 32966, 26086, 27694, 20294, 24814, 28129, 35806, + 24377, 34507, 24403, 25377, 20826, 33633, 26723, 20992, 25443, 36424, + 20498, 23707, 31095, 23548, 21040, 31291, 24764, 36947, 30423, 24503, + 24471, 30340, 36460, 28783, 30331, 31561, 30634, 20979, 37011, 22564, + 20302, 28404, 36842, 25932, 31515, 29380, 28068, 32735, 23265, 25269, + 24213, 22320, 33922, 31532, 24093, 24351, 36882, 32532, 39072, 25474, + 28359, 30872, 28857, 20856, 38747, 22443, 30005, 20291, 30008, 24215, + 24806, 22880, 28096, 27583, 30857, 21500, 38613, 20939, 20993, 25481, + 21514, 38035, 35843, 36300, 29241, 30879, 34678, 36845, 35853, 21472, + 31123, 31124, 31125, 31126, 31127, 31128, 31129, 31131, 31132, 31133, + 31134, 31135, 31136, 31137, 31138, 31139, 31140, 31141, 31142, 31144, + 31145, 31146, 31147, 31148, 31149, 31150, 31151, 31152, 31153, 31154, + 31156, 31157, 31158, 31159, 31160, 31164, 31167, 31170, 31172, 31173, + 31175, 31176, 31178, 31180, 31182, 31183, 31184, 31187, 31188, 31190, + 31191, 31193, 31194, 31195, 31196, 31197, 31198, 31200, 31201, 31202, + 31205, 31208, 31210, 31212, 31214, 31217, 31218, 31219, 31220, 31221, + 31222, 31223, 31225, 31226, 31228, 31230, 31231, 31233, 31236, 31237, + 31239, 31240, 31241, 31242, 31244, 31247, 31248, 31249, 31250, 31251, + 31253, 31254, 31256, 31257, 31259, 31260, 19969, 30447, 21486, 38025, + 39030, 40718, 38189, 23450, 35746, 20002, 19996, 20908, 33891, 25026, + 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, 26007, 38497, + 35910, 36887, 30168, 37117, 30563, 27602, 29322, 29420, 35835, 22581, + 30585, 36172, 26460, 38208, 32922, 24230, 28193, 22930, 31471, 30701, + 38203, 27573, 26029, 32526, 22534, 20817, 38431, 23545, 22697, 21544, + 36466, 25958, 39039, 22244, 38045, 30462, 36929, 25479, 21702, 22810, + 22842, 22427, 36530, 26421, 36346, 33333, 21057, 24816, 22549, 34558, + 23784, 40517, 20420, 39069, 35769, 23077, 24694, 21380, 25212, 36943, + 37122, 39295, 24681, 32780, 20799, 32819, 23572, 39285, 27953, 20108, + 31261, 31263, 31265, 31266, 31268, 31269, 31270, 31271, 31272, 31273, + 31274, 31275, 31276, 31277, 31278, 31279, 31280, 31281, 31282, 31284, + 31285, 31286, 31288, 31290, 31294, 31296, 31297, 31298, 31299, 31300, + 31301, 31303, 31304, 31305, 31306, 31307, 31308, 31309, 31310, 31311, + 31312, 31314, 31315, 31316, 31317, 31318, 31320, 31321, 31322, 31323, + 31324, 31325, 31326, 31327, 31328, 31329, 31330, 31331, 31332, 31333, + 31334, 31335, 31336, 31337, 31338, 31339, 31340, 31341, 31342, 31343, + 31345, 31346, 31347, 31349, 31355, 31356, 31357, 31358, 31362, 31365, + 31367, 31369, 31370, 31371, 31372, 31374, 31375, 31376, 31379, 31380, + 31385, 31386, 31387, 31390, 31393, 31394, 36144, 21457, 32602, 31567, + 20240, 20047, 38400, 27861, 29648, 34281, 24070, 30058, 32763, 27146, + 30718, 38034, 32321, 20961, 28902, 21453, 36820, 33539, 36137, 29359, + 39277, 27867, 22346, 33459, 26041, 32938, 25151, 38450, 22952, 20223, + 35775, 32442, 25918, 33778, 38750, 21857, 39134, 32933, 21290, 35837, + 21536, 32954, 24223, 27832, 36153, 33452, 37210, 21545, 27675, 20998, + 32439, 22367, 28954, 27774, 31881, 22859, 20221, 24575, 24868, 31914, + 20016, 23553, 26539, 34562, 23792, 38155, 39118, 30127, 28925, 36898, + 20911, 32541, 35773, 22857, 20964, 20315, 21542, 22827, 25975, 32932, + 23413, 25206, 25282, 36752, 24133, 27679, 31526, 20239, 20440, 26381, + 31395, 31396, 31399, 31401, 31402, 31403, 31406, 31407, 31408, 31409, + 31410, 31412, 31413, 31414, 31415, 31416, 31417, 31418, 31419, 31420, + 31421, 31422, 31424, 31425, 31426, 31427, 31428, 31429, 31430, 31431, + 31432, 31433, 31434, 31436, 31437, 31438, 31439, 31440, 31441, 31442, + 31443, 31444, 31445, 31447, 31448, 31450, 31451, 31452, 31453, 31457, + 31458, 31460, 31463, 31464, 31465, 31466, 31467, 31468, 31470, 31472, + 31473, 31474, 31475, 31476, 31477, 31478, 31479, 31480, 31483, 31484, + 31486, 31488, 31489, 31490, 31493, 31495, 31497, 31500, 31501, 31502, + 31504, 31506, 31507, 31510, 31511, 31512, 31514, 31516, 31517, 31519, + 31521, 31522, 31523, 31527, 31529, 31533, 28014, 28074, 31119, 34993, + 24343, 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, + 33104, 36212, 21103, 35206, 36171, 22797, 20613, 20184, 38428, 29238, + 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, 22134, 22030, + 35813, 25913, 27010, 38041, 30422, 28297, 24178, 29976, 26438, 26577, + 31487, 32925, 36214, 24863, 31174, 25954, 36195, 20872, 21018, 38050, + 32568, 32923, 32434, 23703, 28207, 26464, 31705, 30347, 39640, 33167, + 32660, 31957, 25630, 38224, 31295, 21578, 21733, 27468, 25601, 25096, + 40509, 33011, 30105, 21106, 38761, 33883, 26684, 34532, 38401, 38548, + 38124, 20010, 21508, 32473, 26681, 36319, 32789, 26356, 24218, 32697, + 31535, 31536, 31538, 31540, 31541, 31542, 31543, 31545, 31547, 31549, + 31551, 31552, 31553, 31554, 31555, 31556, 31558, 31560, 31562, 31565, + 31566, 31571, 31573, 31575, 31577, 31580, 31582, 31583, 31585, 31587, + 31588, 31589, 31590, 31591, 31592, 31593, 31594, 31595, 31596, 31597, + 31599, 31600, 31603, 31604, 31606, 31608, 31610, 31612, 31613, 31615, + 31617, 31618, 31619, 31620, 31622, 31623, 31624, 31625, 31626, 31627, + 31628, 31630, 31631, 31633, 31634, 31635, 31638, 31640, 31641, 31642, + 31643, 31646, 31647, 31648, 31651, 31652, 31653, 31662, 31663, 31664, + 31666, 31667, 31669, 31670, 31671, 31673, 31674, 31675, 31676, 31677, + 31678, 31679, 31680, 31682, 31683, 31684, 22466, 32831, 26775, 24037, + 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, 24339, 24041, + 27742, 25329, 36129, 20849, 38057, 21246, 27807, 33503, 29399, 22434, + 26500, 36141, 22815, 36764, 33735, 21653, 31629, 20272, 27837, 23396, + 22993, 40723, 21476, 34506, 39592, 35895, 32929, 25925, 39038, 22266, + 38599, 21038, 29916, 21072, 23521, 25346, 35074, 20054, 25296, 24618, + 26874, 20851, 23448, 20896, 35266, 31649, 39302, 32592, 24815, 28748, + 36143, 20809, 24191, 36891, 29808, 35268, 22317, 30789, 24402, 40863, + 38394, 36712, 39740, 35809, 30328, 26690, 26588, 36330, 36149, 21053, + 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, + 31685, 31688, 31689, 31690, 31691, 31693, 31694, 31695, 31696, 31698, + 31700, 31701, 31702, 31703, 31704, 31707, 31708, 31710, 31711, 31712, + 31714, 31715, 31716, 31719, 31720, 31721, 31723, 31724, 31725, 31727, + 31728, 31730, 31731, 31732, 31733, 31734, 31736, 31737, 31738, 31739, + 31741, 31743, 31744, 31745, 31746, 31747, 31748, 31749, 31750, 31752, + 31753, 31754, 31757, 31758, 31760, 31761, 31762, 31763, 31764, 31765, + 31767, 31768, 31769, 31770, 31771, 31772, 31773, 31774, 31776, 31777, + 31778, 31779, 31780, 31781, 31784, 31785, 31787, 31788, 31789, 31790, + 31791, 31792, 31793, 31794, 31795, 31796, 31797, 31798, 31799, 31801, + 31802, 31803, 31804, 31805, 31806, 31810, 39608, 23401, 28023, 27686, + 20133, 23475, 39559, 37219, 25000, 37039, 38889, 21547, 28085, 23506, + 20989, 21898, 32597, 32752, 25788, 25421, 26097, 25022, 24717, 28938, + 27735, 27721, 22831, 26477, 33322, 22741, 22158, 35946, 27627, 37085, + 22909, 32791, 21495, 28009, 21621, 21917, 33655, 33743, 26680, 31166, + 21644, 20309, 21512, 30418, 35977, 38402, 27827, 28088, 36203, 35088, + 40548, 36154, 22079, 40657, 30165, 24456, 29408, 24680, 21756, 20136, + 27178, 34913, 24658, 36720, 21700, 28888, 34425, 40511, 27946, 23439, + 24344, 32418, 21897, 20399, 29492, 21564, 21402, 20505, 21518, 21628, + 20046, 24573, 29786, 22774, 33899, 32993, 34676, 29392, 31946, 28246, + 31811, 31812, 31813, 31814, 31815, 31816, 31817, 31818, 31819, 31820, + 31822, 31823, 31824, 31825, 31826, 31827, 31828, 31829, 31830, 31831, + 31832, 31833, 31834, 31835, 31836, 31837, 31838, 31839, 31840, 31841, + 31842, 31843, 31844, 31845, 31846, 31847, 31848, 31849, 31850, 31851, + 31852, 31853, 31854, 31855, 31856, 31857, 31858, 31861, 31862, 31863, + 31864, 31865, 31866, 31870, 31871, 31872, 31873, 31874, 31875, 31876, + 31877, 31878, 31879, 31880, 31882, 31883, 31884, 31885, 31886, 31887, + 31888, 31891, 31892, 31894, 31897, 31898, 31899, 31904, 31905, 31907, + 31910, 31911, 31912, 31913, 31915, 31916, 31917, 31919, 31920, 31924, + 31925, 31926, 31927, 31928, 31930, 31931, 24359, 34382, 21804, 25252, + 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, + 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, + 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, + 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, + 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, + 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, + 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, + 27985, 28151, 35905, 27963, 20249, 28779, 33719, 25110, 24785, 38669, + 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, 31637, + 31935, 31936, 31938, 31939, 31940, 31942, 31945, 31947, 31950, 31951, + 31952, 31953, 31954, 31955, 31956, 31960, 31962, 31963, 31965, 31966, + 31969, 31970, 31971, 31972, 31973, 31974, 31975, 31977, 31978, 31979, + 31980, 31981, 31982, 31984, 31985, 31986, 31987, 31988, 31989, 31990, + 31991, 31993, 31994, 31996, 31997, 31998, 31999, 32000, 32001, 32002, + 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32011, 32012, 32013, + 32014, 32015, 32016, 32017, 32018, 32019, 32020, 32021, 32022, 32023, + 32024, 32025, 32026, 32027, 32028, 32029, 32030, 32031, 32033, 32035, + 32036, 32037, 32038, 32040, 32041, 32042, 32044, 32045, 32046, 32048, + 32049, 32050, 32051, 32052, 32053, 32054, 32908, 39269, 36857, 28608, + 35749, 40481, 23020, 32489, 32521, 21513, 26497, 26840, 36753, 31821, + 38598, 21450, 24613, 30142, 27762, 21363, 23241, 32423, 25380, 20960, + 33034, 24049, 34015, 25216, 20864, 23395, 20238, 31085, 21058, 24760, + 27982, 23492, 23490, 35745, 35760, 26082, 24524, 38469, 22931, 32487, + 32426, 22025, 26551, 22841, 20339, 23478, 21152, 33626, 39050, 36158, + 30002, 38078, 20551, 31292, 20215, 26550, 39550, 23233, 27516, 30417, + 22362, 23574, 31546, 38388, 29006, 20860, 32937, 33392, 22904, 32516, + 33575, 26816, 26604, 30897, 30839, 25315, 25441, 31616, 20461, 21098, + 20943, 33616, 27099, 37492, 36341, 36145, 35265, 38190, 31661, 20214, + 32055, 32056, 32057, 32058, 32059, 32060, 32061, 32062, 32063, 32064, + 32065, 32066, 32067, 32068, 32069, 32070, 32071, 32072, 32073, 32074, + 32075, 32076, 32077, 32078, 32079, 32080, 32081, 32082, 32083, 32084, + 32085, 32086, 32087, 32088, 32089, 32090, 32091, 32092, 32093, 32094, + 32095, 32096, 32097, 32098, 32099, 32100, 32101, 32102, 32103, 32104, + 32105, 32106, 32107, 32108, 32109, 32111, 32112, 32113, 32114, 32115, + 32116, 32117, 32118, 32120, 32121, 32122, 32123, 32124, 32125, 32126, + 32127, 32128, 32129, 32130, 32131, 32132, 32133, 32134, 32135, 32136, + 32137, 32138, 32139, 32140, 32141, 32142, 32143, 32144, 32145, 32146, + 32147, 32148, 32149, 32150, 32151, 32152, 20581, 33328, 21073, 39279, + 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, 30086, + 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, 30977, + 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, 38128, + 30699, 20389, 33050, 29409, 35282, 39290, 32564, 32478, 21119, 25945, + 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, 31224, 34903, + 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, 31469, 27905, + 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, 20171, 30117, + 35819, 23626, 24062, 31563, 26020, 37329, 20170, 27941, 35167, 32039, + 38182, 20165, 35880, 36827, 38771, 26187, 31105, 36817, 28908, 28024, + 32153, 32154, 32155, 32156, 32157, 32158, 32159, 32160, 32161, 32162, + 32163, 32164, 32165, 32167, 32168, 32169, 32170, 32171, 32172, 32173, + 32175, 32176, 32177, 32178, 32179, 32180, 32181, 32182, 32183, 32184, + 32185, 32186, 32187, 32188, 32189, 32190, 32191, 32192, 32193, 32194, + 32195, 32196, 32197, 32198, 32199, 32200, 32201, 32202, 32203, 32204, + 32205, 32206, 32207, 32208, 32209, 32210, 32211, 32212, 32213, 32214, + 32215, 32216, 32217, 32218, 32219, 32220, 32221, 32222, 32223, 32224, + 32225, 32226, 32227, 32228, 32229, 32230, 32231, 32232, 32233, 32234, + 32235, 32236, 32237, 32238, 32239, 32240, 32241, 32242, 32243, 32244, + 32245, 32246, 32247, 32248, 32249, 32250, 23613, 21170, 33606, 20834, + 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, + 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, + 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, 38893, + 20037, 28792, 20061, 37202, 21417, 25937, 26087, 33276, 33285, 21646, + 23601, 30106, 38816, 25304, 29401, 30141, 23621, 39545, 33738, 23616, + 21632, 30697, 20030, 27822, 32858, 25298, 25454, 24040, 20855, 36317, + 36382, 38191, 20465, 21477, 24807, 28844, 21095, 25424, 40515, 23071, + 20518, 30519, 21367, 32482, 25733, 25899, 25225, 25496, 20500, 29237, + 35273, 20915, 35776, 32477, 22343, 33740, 38055, 20891, 21531, 23803, + 32251, 32252, 32253, 32254, 32255, 32256, 32257, 32258, 32259, 32260, + 32261, 32262, 32263, 32264, 32265, 32266, 32267, 32268, 32269, 32270, + 32271, 32272, 32273, 32274, 32275, 32276, 32277, 32278, 32279, 32280, + 32281, 32282, 32283, 32284, 32285, 32286, 32287, 32288, 32289, 32290, + 32291, 32292, 32293, 32294, 32295, 32296, 32297, 32298, 32299, 32300, + 32301, 32302, 32303, 32304, 32305, 32306, 32307, 32308, 32309, 32310, + 32311, 32312, 32313, 32314, 32316, 32317, 32318, 32319, 32320, 32322, + 32323, 32324, 32325, 32326, 32328, 32329, 32330, 32331, 32332, 32333, + 32334, 32335, 32336, 32337, 32338, 32339, 32340, 32341, 32342, 32343, + 32344, 32345, 32346, 32347, 32348, 32349, 20426, 31459, 27994, 37089, + 39567, 21888, 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, + 21002, 22570, 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, + 25239, 20130, 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, + 26869, 30933, 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, + 23458, 35838, 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, + 23380, 25511, 25248, 21475, 25187, 23495, 26543, 21741, 31391, 33510, + 37239, 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, + 20393, 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, + 26103, 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, + 32350, 32351, 32352, 32353, 32354, 32355, 32356, 32357, 32358, 32359, + 32360, 32361, 32362, 32363, 32364, 32365, 32366, 32367, 32368, 32369, + 32370, 32371, 32372, 32373, 32374, 32375, 32376, 32377, 32378, 32379, + 32380, 32381, 32382, 32383, 32384, 32385, 32387, 32388, 32389, 32390, + 32391, 32392, 32393, 32394, 32395, 32396, 32397, 32398, 32399, 32400, + 32401, 32402, 32403, 32404, 32405, 32406, 32407, 32408, 32409, 32410, + 32412, 32413, 32414, 32430, 32436, 32443, 32444, 32470, 32484, 32492, + 32505, 32522, 32528, 32542, 32567, 32569, 32571, 32572, 32573, 32574, + 32575, 32576, 32577, 32579, 32582, 32583, 32584, 32585, 32586, 32587, + 32588, 32589, 32590, 32591, 32594, 32595, 39304, 24871, 28291, 22372, + 26118, 25414, 22256, 25324, 25193, 24275, 38420, 22403, 25289, 21895, + 34593, 33098, 36771, 21862, 33713, 26469, 36182, 34013, 23146, 26639, + 25318, 31726, 38417, 20848, 28572, 35888, 25597, 35272, 25042, 32518, + 28866, 28389, 29701, 27028, 29436, 24266, 37070, 26391, 28010, 25438, + 21171, 29282, 32769, 20332, 23013, 37226, 28889, 28061, 21202, 20048, + 38647, 38253, 34174, 30922, 32047, 20769, 22418, 25794, 32907, 31867, + 27882, 26865, 26974, 20919, 21400, 26792, 29313, 40654, 31729, 29432, + 31163, 28435, 29702, 26446, 37324, 40100, 31036, 33673, 33620, 21519, + 26647, 20029, 21385, 21169, 30782, 21382, 21033, 20616, 20363, 20432, + 32598, 32601, 32603, 32604, 32605, 32606, 32608, 32611, 32612, 32613, + 32614, 32615, 32619, 32620, 32621, 32623, 32624, 32627, 32629, 32630, + 32631, 32632, 32634, 32635, 32636, 32637, 32639, 32640, 32642, 32643, + 32644, 32645, 32646, 32647, 32648, 32649, 32651, 32653, 32655, 32656, + 32657, 32658, 32659, 32661, 32662, 32663, 32664, 32665, 32667, 32668, + 32672, 32674, 32675, 32677, 32678, 32680, 32681, 32682, 32683, 32684, + 32685, 32686, 32689, 32691, 32692, 32693, 32694, 32695, 32698, 32699, + 32702, 32704, 32706, 32707, 32708, 32710, 32711, 32712, 32713, 32715, + 32717, 32719, 32720, 32721, 32722, 32723, 32726, 32727, 32729, 32730, + 32731, 32732, 32733, 32734, 32738, 32739, 30178, 31435, 31890, 27813, + 38582, 21147, 29827, 21737, 20457, 32852, 33714, 36830, 38256, 24265, + 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, 32451, 31918, + 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, 20142, 35845, + 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, 20102, 25730, + 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, 29747, 26519, + 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, 21533, 25294, + 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, 28789, 38517, + 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, 39311, 30041, + 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, 31548, 31423, + 32740, 32743, 32744, 32746, 32747, 32748, 32749, 32751, 32754, 32756, + 32757, 32758, 32759, 32760, 32761, 32762, 32765, 32766, 32767, 32770, + 32775, 32776, 32777, 32778, 32782, 32783, 32785, 32787, 32794, 32795, + 32797, 32798, 32799, 32801, 32803, 32804, 32811, 32812, 32813, 32814, + 32815, 32816, 32818, 32820, 32825, 32826, 32828, 32830, 32832, 32833, + 32836, 32837, 32839, 32840, 32841, 32846, 32847, 32848, 32849, 32851, + 32853, 32854, 32855, 32857, 32859, 32860, 32861, 32862, 32863, 32864, + 32865, 32866, 32867, 32868, 32869, 32870, 32871, 32872, 32875, 32876, + 32877, 32878, 32879, 32880, 32882, 32883, 32884, 32885, 32886, 32887, + 32888, 32889, 32890, 32891, 32892, 32893, 38534, 22404, 25314, 38471, + 27004, 23044, 25602, 31699, 28431, 38475, 33446, 21346, 39045, 24208, + 28809, 25523, 21348, 34383, 40065, 40595, 30860, 38706, 36335, 36162, + 40575, 28510, 31108, 24405, 38470, 25134, 39540, 21525, 38109, 20387, + 26053, 23653, 23649, 32533, 34385, 27695, 24459, 29575, 28388, 32511, + 23782, 25371, 23402, 28390, 21365, 20081, 25504, 30053, 25249, 36718, + 20262, 20177, 27814, 32438, 35770, 33821, 34746, 32599, 36923, 38179, + 31657, 39585, 35064, 33853, 27931, 39558, 32476, 22920, 40635, 29595, + 30721, 34434, 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, + 36808, 33033, 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, + 32894, 32897, 32898, 32901, 32904, 32906, 32909, 32910, 32911, 32912, + 32913, 32914, 32916, 32917, 32919, 32921, 32926, 32931, 32934, 32935, + 32936, 32940, 32944, 32947, 32949, 32950, 32952, 32953, 32955, 32965, + 32967, 32968, 32969, 32970, 32971, 32975, 32976, 32977, 32978, 32979, + 32980, 32981, 32984, 32991, 32992, 32994, 32995, 32998, 33006, 33013, + 33015, 33017, 33019, 33022, 33023, 33024, 33025, 33027, 33028, 33029, + 33031, 33032, 33035, 33036, 33045, 33047, 33049, 33051, 33052, 33053, + 33055, 33056, 33057, 33058, 33059, 33060, 33061, 33062, 33063, 33064, + 33065, 33066, 33067, 33069, 33070, 33072, 33075, 33076, 33077, 33079, + 33081, 33082, 33083, 33084, 33085, 33087, 35881, 33426, 33579, 30450, + 27667, 24537, 33725, 29483, 33541, 38170, 27611, 30683, 38086, 21359, + 33538, 20882, 24125, 35980, 36152, 20040, 29611, 26522, 26757, 37238, + 38665, 29028, 27809, 30473, 23186, 38209, 27599, 32654, 26151, 23504, + 22969, 23194, 38376, 38391, 20204, 33804, 33945, 27308, 30431, 38192, + 29467, 26790, 23391, 30511, 37274, 38753, 31964, 36855, 35868, 24357, + 31859, 31192, 35269, 27852, 34588, 23494, 24130, 26825, 30496, 32501, + 20885, 20813, 21193, 23081, 32517, 38754, 33495, 25551, 30596, 34256, + 31186, 28218, 24217, 22937, 34065, 28781, 27665, 25279, 30399, 25935, + 24751, 38397, 26126, 34719, 40483, 38125, 21517, 21629, 35884, 25720, + 33088, 33089, 33090, 33091, 33092, 33093, 33095, 33097, 33101, 33102, + 33103, 33106, 33110, 33111, 33112, 33115, 33116, 33117, 33118, 33119, + 33121, 33122, 33123, 33124, 33126, 33128, 33130, 33131, 33132, 33135, + 33138, 33139, 33141, 33142, 33143, 33144, 33153, 33155, 33156, 33157, + 33158, 33159, 33161, 33163, 33164, 33165, 33166, 33168, 33170, 33171, + 33172, 33173, 33174, 33175, 33177, 33178, 33182, 33183, 33184, 33185, + 33186, 33188, 33189, 33191, 33193, 33195, 33196, 33197, 33198, 33199, + 33200, 33201, 33202, 33204, 33205, 33206, 33207, 33208, 33209, 33212, + 33213, 33214, 33215, 33220, 33221, 33223, 33224, 33225, 33227, 33229, + 33230, 33231, 33232, 33233, 33234, 33235, 25721, 34321, 27169, 33180, + 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, 28448, + 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, 27597, + 22675, 26286, 24149, 21215, 24917, 26408, 30446, 30566, 29287, 31302, + 25343, 21738, 21584, 38048, 37027, 23068, 32435, 27670, 20035, 22902, + 32784, 22856, 21335, 30007, 38590, 22218, 25376, 33041, 24700, 38393, + 28118, 21602, 39297, 20869, 23273, 33021, 22958, 38675, 20522, 27877, + 23612, 25311, 20320, 21311, 33147, 36870, 28346, 34091, 25288, 24180, + 30910, 25781, 25467, 24565, 23064, 37247, 40479, 23615, 25423, 32834, + 23421, 21870, 38218, 38221, 28037, 24744, 26592, 29406, 20957, 23425, + 33236, 33237, 33238, 33239, 33240, 33241, 33242, 33243, 33244, 33245, + 33246, 33247, 33248, 33249, 33250, 33252, 33253, 33254, 33256, 33257, + 33259, 33262, 33263, 33264, 33265, 33266, 33269, 33270, 33271, 33272, + 33273, 33274, 33277, 33279, 33283, 33287, 33288, 33289, 33290, 33291, + 33294, 33295, 33297, 33299, 33301, 33302, 33303, 33304, 33305, 33306, + 33309, 33312, 33316, 33317, 33318, 33319, 33321, 33326, 33330, 33338, + 33340, 33341, 33343, 33344, 33345, 33346, 33347, 33349, 33350, 33352, + 33354, 33356, 33357, 33358, 33360, 33361, 33362, 33363, 33364, 33365, + 33366, 33367, 33369, 33371, 33372, 33373, 33374, 33376, 33377, 33378, + 33379, 33380, 33381, 33382, 33383, 33385, 25319, 27870, 29275, 25197, + 38062, 32445, 33043, 27987, 20892, 24324, 22900, 21162, 24594, 22899, + 26262, 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, + 27572, 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, + 29750, 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, + 30928, 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, + 25243, 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, + 35060, 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, + 28921, 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, + 25447, 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, + 33386, 33387, 33388, 33389, 33393, 33397, 33398, 33399, 33400, 33403, + 33404, 33408, 33409, 33411, 33413, 33414, 33415, 33417, 33420, 33424, + 33427, 33428, 33429, 33430, 33434, 33435, 33438, 33440, 33442, 33443, + 33447, 33458, 33461, 33462, 33466, 33467, 33468, 33471, 33472, 33474, + 33475, 33477, 33478, 33481, 33488, 33494, 33497, 33498, 33501, 33506, + 33511, 33512, 33513, 33514, 33516, 33517, 33518, 33520, 33522, 33523, + 33525, 33526, 33528, 33530, 33532, 33533, 33534, 33535, 33536, 33546, + 33547, 33549, 33552, 33554, 33555, 33558, 33560, 33561, 33565, 33566, + 33567, 33568, 33569, 33570, 33571, 33572, 33573, 33574, 33577, 33578, + 33582, 33584, 33586, 33591, 33595, 33597, 21860, 33086, 30130, 30382, + 21305, 30174, 20731, 23617, 35692, 31687, 20559, 29255, 39575, 39128, + 28418, 29922, 31080, 25735, 30629, 25340, 39057, 36139, 21697, 32856, + 20050, 22378, 33529, 33805, 24179, 20973, 29942, 35780, 23631, 22369, + 27900, 39047, 23110, 30772, 39748, 36843, 31893, 21078, 25169, 38138, + 20166, 33670, 33889, 33769, 33970, 22484, 26420, 22275, 26222, 28006, + 35889, 26333, 28689, 26399, 27450, 26646, 25114, 22971, 19971, 20932, + 28422, 26578, 27791, 20854, 26827, 22855, 27495, 30054, 23822, 33040, + 40784, 26071, 31048, 31041, 39569, 36215, 23682, 20062, 20225, 21551, + 22865, 30732, 22120, 27668, 36804, 24323, 27773, 27875, 35755, 25488, + 33598, 33599, 33601, 33602, 33604, 33605, 33608, 33610, 33611, 33612, + 33613, 33614, 33619, 33621, 33622, 33623, 33624, 33625, 33629, 33634, + 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33657, 33658, 33662, + 33663, 33664, 33665, 33666, 33667, 33668, 33671, 33672, 33674, 33675, + 33676, 33677, 33679, 33680, 33681, 33684, 33685, 33686, 33687, 33689, + 33690, 33693, 33695, 33697, 33698, 33699, 33700, 33701, 33702, 33703, + 33708, 33709, 33710, 33711, 33717, 33723, 33726, 33727, 33730, 33731, + 33732, 33734, 33736, 33737, 33739, 33741, 33742, 33744, 33745, 33746, + 33747, 33749, 33751, 33753, 33754, 33755, 33758, 33762, 33763, 33764, + 33766, 33767, 33768, 33771, 33772, 33773, 24688, 27965, 29301, 25190, + 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, + 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, 27424, 27465, + 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, 38201, + 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, 32728, + 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, 20405, + 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, 38738, + 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, 39031, + 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, 22234, + 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, 28192, + 33774, 33775, 33779, 33780, 33781, 33782, 33783, 33786, 33787, 33788, + 33790, 33791, 33792, 33794, 33797, 33799, 33800, 33801, 33802, 33808, + 33810, 33811, 33812, 33813, 33814, 33815, 33817, 33818, 33819, 33822, + 33823, 33824, 33825, 33826, 33827, 33833, 33834, 33835, 33836, 33837, + 33838, 33839, 33840, 33842, 33843, 33844, 33845, 33846, 33847, 33849, + 33850, 33851, 33854, 33855, 33856, 33857, 33858, 33859, 33860, 33861, + 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872, + 33874, 33875, 33876, 33877, 33878, 33880, 33885, 33886, 33887, 33888, + 33890, 33892, 33893, 33894, 33895, 33896, 33898, 33902, 33903, 33904, + 33906, 33908, 33911, 33913, 33915, 33916, 21462, 23094, 40843, 36259, + 21435, 22280, 39079, 26435, 37275, 27849, 20840, 30154, 25331, 29356, + 21048, 21149, 32570, 28820, 30264, 21364, 40522, 27063, 30830, 38592, + 35033, 32676, 28982, 29123, 20873, 26579, 29924, 22756, 25880, 22199, + 35753, 39286, 25200, 32469, 24825, 28909, 22764, 20161, 20154, 24525, + 38887, 20219, 35748, 20995, 22922, 32427, 25172, 20173, 26085, 25102, + 33592, 33993, 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, + 26580, 32905, 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, + 20837, 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, 33509, + 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, 21441, + 33917, 33918, 33919, 33920, 33921, 33923, 33924, 33925, 33926, 33930, + 33933, 33935, 33936, 33937, 33938, 33939, 33940, 33941, 33942, 33944, + 33946, 33947, 33949, 33950, 33951, 33952, 33954, 33955, 33956, 33957, + 33958, 33959, 33960, 33961, 33962, 33963, 33964, 33965, 33966, 33968, + 33969, 33971, 33973, 33974, 33975, 33979, 33980, 33982, 33984, 33986, + 33987, 33989, 33990, 33991, 33992, 33995, 33996, 33998, 33999, 34002, + 34004, 34005, 34007, 34008, 34009, 34010, 34011, 34012, 34014, 34017, + 34018, 34020, 34023, 34024, 34025, 34026, 34027, 34029, 34030, 34031, + 34033, 34034, 34035, 34036, 34037, 34038, 34039, 34040, 34041, 34042, + 34043, 34045, 34046, 34048, 34049, 34050, 20254, 25955, 26705, 21971, + 20007, 25620, 39578, 25195, 23234, 29791, 33394, 28073, 26862, 20711, + 33678, 30722, 26432, 21049, 27801, 32433, 20667, 21861, 29022, 31579, + 26194, 29642, 33515, 26441, 23665, 21024, 29053, 34923, 38378, 38485, + 25797, 36193, 33203, 21892, 27733, 25159, 32558, 22674, 20260, 21830, + 36175, 26188, 19978, 23578, 35059, 26786, 25422, 31245, 28903, 33421, + 21242, 38902, 23569, 21736, 37045, 32461, 22882, 36170, 34503, 33292, + 33293, 36198, 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, + 21627, 20280, 36523, 28145, 23072, 32453, 31070, 27784, 23457, 23158, + 29978, 32958, 24910, 28183, 22768, 29983, 29989, 29298, 21319, 32499, + 34051, 34052, 34053, 34054, 34055, 34056, 34057, 34058, 34059, 34061, + 34062, 34063, 34064, 34066, 34068, 34069, 34070, 34072, 34073, 34075, + 34076, 34077, 34078, 34080, 34082, 34083, 34084, 34085, 34086, 34087, + 34088, 34089, 34090, 34093, 34094, 34095, 34096, 34097, 34098, 34099, + 34100, 34101, 34102, 34110, 34111, 34112, 34113, 34114, 34116, 34117, + 34118, 34119, 34123, 34124, 34125, 34126, 34127, 34128, 34129, 34130, + 34131, 34132, 34133, 34135, 34136, 34138, 34139, 34140, 34141, 34143, + 34144, 34145, 34146, 34147, 34149, 34150, 34151, 34153, 34154, 34155, + 34156, 34157, 34158, 34159, 34160, 34161, 34163, 34165, 34166, 34167, + 34168, 34172, 34173, 34175, 34176, 34177, 30465, 30427, 21097, 32988, + 22307, 24072, 22833, 29422, 26045, 28287, 35799, 23608, 34417, 21313, + 30707, 25342, 26102, 20160, 39135, 34432, 23454, 35782, 21490, 30690, + 20351, 23630, 39542, 22987, 24335, 31034, 22763, 19990, 26623, 20107, + 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, 20365, + 37322, 39280, 27663, 24066, 24643, 23460, 35270, 35797, 25910, 25163, + 39318, 23432, 23551, 25480, 21806, 21463, 30246, 20861, 34092, 26530, + 26803, 27530, 25234, 36755, 21460, 33298, 28113, 30095, 20070, 36174, + 23408, 29087, 34223, 26257, 26329, 32626, 34560, 40653, 40736, 23646, + 26415, 36848, 26641, 26463, 25101, 31446, 22661, 24246, 25968, 28465, + 34178, 34179, 34182, 34184, 34185, 34186, 34187, 34188, 34189, 34190, + 34192, 34193, 34194, 34195, 34196, 34197, 34198, 34199, 34200, 34201, + 34202, 34205, 34206, 34207, 34208, 34209, 34210, 34211, 34213, 34214, + 34215, 34217, 34219, 34220, 34221, 34225, 34226, 34227, 34228, 34229, + 34230, 34232, 34234, 34235, 34236, 34237, 34238, 34239, 34240, 34242, + 34243, 34244, 34245, 34246, 34247, 34248, 34250, 34251, 34252, 34253, + 34254, 34257, 34258, 34260, 34262, 34263, 34264, 34265, 34266, 34267, + 34269, 34270, 34271, 34272, 34273, 34274, 34275, 34277, 34278, 34279, + 34280, 34282, 34283, 34284, 34285, 34286, 34287, 34288, 34289, 34290, + 34291, 34292, 34293, 34294, 34295, 34296, 24661, 21047, 32781, 25684, + 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, 27700, + 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, 26388, 28865, + 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, 32902, 23546, + 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, 24578, 39042, + 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, 33487, 37221, + 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, 35785, 32899, + 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, 30862, 23681, + 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, 26797, 21766, + 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, 22905, 22612, + 34297, 34298, 34300, 34301, 34302, 34304, 34305, 34306, 34307, 34308, + 34310, 34311, 34312, 34313, 34314, 34315, 34316, 34317, 34318, 34319, + 34320, 34322, 34323, 34324, 34325, 34327, 34328, 34329, 34330, 34331, + 34332, 34333, 34334, 34335, 34336, 34337, 34338, 34339, 34340, 34341, + 34342, 34344, 34346, 34347, 34348, 34349, 34350, 34351, 34352, 34353, + 34354, 34355, 34356, 34357, 34358, 34359, 34361, 34362, 34363, 34365, + 34366, 34367, 34368, 34369, 34370, 34371, 34372, 34373, 34374, 34375, + 34376, 34377, 34378, 34379, 34380, 34386, 34387, 34389, 34390, 34391, + 34392, 34393, 34395, 34396, 34397, 34399, 34400, 34401, 34403, 34404, + 34405, 34406, 34407, 34408, 34409, 34410, 29549, 25374, 36427, 36367, + 32974, 33492, 25260, 21488, 27888, 37214, 22826, 24577, 27760, 22349, + 25674, 36138, 30251, 28393, 22363, 27264, 30192, 28525, 35885, 35848, + 22374, 27631, 34962, 30899, 25506, 21497, 28845, 27748, 22616, 25642, + 22530, 26848, 33179, 21776, 31958, 20504, 36538, 28108, 36255, 28907, + 25487, 28059, 28372, 32486, 33796, 26691, 36867, 28120, 38518, 35752, + 22871, 29305, 34276, 33150, 30140, 35466, 26799, 21076, 36386, 38161, + 25552, 39064, 36420, 21884, 20307, 26367, 22159, 24789, 28053, 21059, + 23625, 22825, 28155, 22635, 30000, 29980, 24684, 33300, 33094, 25361, + 26465, 36834, 30522, 36339, 36148, 38081, 24086, 21381, 21548, 28867, + 34413, 34415, 34416, 34418, 34419, 34420, 34421, 34422, 34423, 34424, + 34435, 34436, 34437, 34438, 34439, 34440, 34441, 34446, 34447, 34448, + 34449, 34450, 34452, 34454, 34455, 34456, 34457, 34458, 34459, 34462, + 34463, 34464, 34465, 34466, 34469, 34470, 34475, 34477, 34478, 34482, + 34483, 34487, 34488, 34489, 34491, 34492, 34493, 34494, 34495, 34497, + 34498, 34499, 34501, 34504, 34508, 34509, 34514, 34515, 34517, 34518, + 34519, 34522, 34524, 34525, 34528, 34529, 34530, 34531, 34533, 34534, + 34535, 34536, 34538, 34539, 34540, 34543, 34549, 34550, 34551, 34554, + 34555, 34556, 34557, 34559, 34561, 34564, 34565, 34566, 34571, 34572, + 34574, 34575, 34576, 34577, 34580, 34582, 27712, 24311, 20572, 20141, + 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, 24420, + 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, 36879, + 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, 22303, 21520, + 20820, 28237, 22242, 25512, 39059, 33151, 34581, 35114, 36864, 21534, + 23663, 33216, 25302, 25176, 33073, 40501, 38464, 39534, 39548, 26925, + 22949, 25299, 21822, 25366, 21703, 34521, 27964, 23043, 29926, 34972, + 27498, 22806, 35916, 24367, 28286, 29609, 39037, 20024, 28919, 23436, + 30871, 25405, 26202, 30358, 24779, 23451, 23113, 19975, 33109, 27754, + 29579, 20129, 26505, 32593, 24448, 26106, 26395, 24536, 22916, 23041, + 34585, 34587, 34589, 34591, 34592, 34596, 34598, 34599, 34600, 34602, + 34603, 34604, 34605, 34607, 34608, 34610, 34611, 34613, 34614, 34616, + 34617, 34618, 34620, 34621, 34624, 34625, 34626, 34627, 34628, 34629, + 34630, 34634, 34635, 34637, 34639, 34640, 34641, 34642, 34644, 34645, + 34646, 34648, 34650, 34651, 34652, 34653, 34654, 34655, 34657, 34658, + 34662, 34663, 34664, 34665, 34666, 34667, 34668, 34669, 34671, 34673, + 34674, 34675, 34677, 34679, 34680, 34681, 34682, 34687, 34688, 34689, + 34692, 34694, 34695, 34697, 34698, 34700, 34702, 34703, 34704, 34705, + 34706, 34708, 34709, 34710, 34712, 34713, 34714, 34715, 34716, 34717, + 34718, 34720, 34721, 34722, 34723, 34724, 24013, 24494, 21361, 38886, + 36829, 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, + 22996, 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, + 21890, 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, + 34442, 25991, 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, + 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, + 24043, 21596, 38056, 20044, 27745, 35820, 23627, 26080, 33436, 26791, + 21566, 21556, 27595, 27494, 20116, 25410, 21320, 33310, 20237, 20398, + 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, 35823, 26132, + 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, 38177, 29306, + 34725, 34726, 34727, 34729, 34730, 34734, 34736, 34737, 34738, 34740, + 34742, 34743, 34744, 34745, 34747, 34748, 34750, 34751, 34753, 34754, + 34755, 34756, 34757, 34759, 34760, 34761, 34764, 34765, 34766, 34767, + 34768, 34772, 34773, 34774, 34775, 34776, 34777, 34778, 34780, 34781, + 34782, 34783, 34785, 34786, 34787, 34788, 34790, 34791, 34792, 34793, + 34795, 34796, 34797, 34799, 34800, 34801, 34802, 34803, 34804, 34805, + 34806, 34807, 34808, 34810, 34811, 34812, 34813, 34815, 34816, 34817, + 34818, 34820, 34821, 34822, 34823, 34824, 34825, 34827, 34828, 34829, + 34830, 34831, 34832, 34833, 34834, 34836, 34839, 34840, 34841, 34842, + 34844, 34845, 34846, 34847, 34848, 34851, 31232, 24687, 24076, 24713, + 33181, 22805, 24796, 29060, 28911, 28330, 27728, 29312, 27268, 34989, + 24109, 20064, 23219, 21916, 38115, 27927, 31995, 38553, 25103, 32454, + 30606, 34430, 21283, 38686, 36758, 26247, 23777, 20384, 29421, 19979, + 21414, 22799, 21523, 25472, 38184, 20808, 20185, 40092, 32420, 21688, + 36132, 34900, 33335, 38386, 28046, 24358, 23244, 26174, 38505, 29616, + 29486, 21439, 33146, 39301, 32673, 23466, 38519, 38480, 32447, 30456, + 21410, 38262, 39321, 31665, 35140, 28248, 20065, 32724, 31077, 35814, + 24819, 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, + 30813, 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, + 34852, 34853, 34854, 34855, 34856, 34857, 34858, 34859, 34860, 34861, + 34862, 34863, 34864, 34865, 34867, 34868, 34869, 34870, 34871, 34872, + 34874, 34875, 34877, 34878, 34879, 34881, 34882, 34883, 34886, 34887, + 34888, 34889, 34890, 34891, 34894, 34895, 34896, 34897, 34898, 34899, + 34901, 34902, 34904, 34906, 34907, 34908, 34909, 34910, 34911, 34912, + 34918, 34919, 34922, 34925, 34927, 34929, 34931, 34932, 34933, 34934, + 34936, 34937, 34938, 34939, 34940, 34944, 34947, 34950, 34951, 34953, + 34954, 34956, 34958, 34959, 34960, 34961, 34963, 34964, 34965, 34967, + 34968, 34969, 34970, 34971, 34973, 34974, 34975, 34976, 34977, 34979, + 34981, 34982, 34983, 34984, 34985, 34986, 23567, 23389, 26657, 32918, + 21880, 31505, 25928, 26964, 20123, 27463, 34638, 38795, 21327, 25375, + 25658, 37034, 26012, 32961, 35856, 20889, 26800, 21368, 34809, 25032, + 27844, 27899, 35874, 23633, 34218, 33455, 38156, 27427, 36763, 26032, + 24571, 24515, 20449, 34885, 26143, 33125, 29481, 24826, 20852, 21009, + 22411, 24418, 37026, 34892, 37266, 24184, 26447, 24615, 22995, 20804, + 20982, 33016, 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, + 21957, 38152, 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, + 39035, 24464, 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, + 32110, 23167, 32490, 32493, 36713, 21927, 23459, 24748, 26059, 29572, + 34988, 34990, 34991, 34992, 34994, 34995, 34996, 34997, 34998, 35000, + 35001, 35002, 35003, 35005, 35006, 35007, 35008, 35011, 35012, 35015, + 35016, 35018, 35019, 35020, 35021, 35023, 35024, 35025, 35027, 35030, + 35031, 35034, 35035, 35036, 35037, 35038, 35040, 35041, 35046, 35047, + 35049, 35050, 35051, 35052, 35053, 35054, 35055, 35058, 35061, 35062, + 35063, 35066, 35067, 35069, 35071, 35072, 35073, 35075, 35076, 35077, + 35078, 35079, 35080, 35081, 35083, 35084, 35085, 35086, 35087, 35089, + 35092, 35093, 35094, 35095, 35096, 35100, 35101, 35102, 35103, 35104, + 35106, 35107, 35108, 35110, 35111, 35112, 35113, 35116, 35117, 35118, + 35119, 35121, 35122, 35123, 35125, 35127, 36873, 30307, 30505, 32474, + 38772, 34203, 23398, 31348, 38634, 34880, 21195, 29071, 24490, 26092, + 35810, 23547, 39535, 24033, 27529, 27739, 35757, 35759, 36874, 36805, + 21387, 25276, 40486, 40493, 21568, 20011, 33469, 29273, 34460, 23830, + 34905, 28079, 38597, 21713, 20122, 35766, 28937, 21693, 38409, 28895, + 28153, 30416, 20005, 30740, 34578, 23721, 24310, 35328, 39068, 38414, + 28814, 27839, 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, + 21388, 30746, 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, + 22830, 40495, 31207, 26472, 25196, 20335, 30113, 32650, 27915, 38451, + 27687, 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, + 35128, 35129, 35130, 35131, 35132, 35133, 35134, 35135, 35136, 35138, + 35139, 35141, 35142, 35143, 35144, 35145, 35146, 35147, 35148, 35149, + 35150, 35151, 35152, 35153, 35154, 35155, 35156, 35157, 35158, 35159, + 35160, 35161, 35162, 35163, 35164, 35165, 35168, 35169, 35170, 35171, + 35172, 35173, 35175, 35176, 35177, 35178, 35179, 35180, 35181, 35182, + 35183, 35184, 35185, 35186, 35187, 35188, 35189, 35190, 35191, 35192, + 35193, 35194, 35196, 35197, 35198, 35200, 35202, 35204, 35205, 35207, + 35208, 35209, 35210, 35211, 35212, 35213, 35214, 35215, 35216, 35217, + 35218, 35219, 35220, 35221, 35222, 35223, 35224, 35225, 35226, 35227, + 35228, 35229, 35230, 35231, 35232, 35233, 25671, 23591, 36965, 31377, + 35875, 23002, 21676, 33280, 33647, 35201, 32768, 26928, 22094, 32822, + 29239, 37326, 20918, 20063, 39029, 25494, 19994, 21494, 26355, 33099, + 22812, 28082, 19968, 22777, 21307, 25558, 38129, 20381, 20234, 34915, + 39056, 22839, 36951, 31227, 20202, 33008, 30097, 27778, 23452, 23016, + 24413, 26885, 34433, 20506, 24050, 20057, 30691, 20197, 33402, 25233, + 26131, 37009, 23673, 20159, 24441, 33222, 36920, 32900, 30123, 20134, + 35028, 24847, 27589, 24518, 20041, 30410, 28322, 35811, 35758, 35850, + 35793, 24322, 32764, 32716, 32462, 33589, 33643, 22240, 27575, 38899, + 38452, 23035, 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, + 35234, 35235, 35236, 35237, 35238, 35239, 35240, 35241, 35242, 35243, + 35244, 35245, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, + 35254, 35255, 35256, 35257, 35258, 35259, 35260, 35261, 35262, 35263, + 35264, 35267, 35277, 35283, 35284, 35285, 35287, 35288, 35289, 35291, + 35293, 35295, 35296, 35297, 35298, 35300, 35303, 35304, 35305, 35306, + 35308, 35309, 35310, 35312, 35313, 35314, 35316, 35317, 35318, 35319, + 35320, 35321, 35322, 35323, 35324, 35325, 35326, 35327, 35329, 35330, + 35331, 35332, 35333, 35334, 35336, 35337, 35338, 35339, 35340, 35341, + 35342, 35343, 35344, 35345, 35346, 35347, 35348, 35349, 35350, 35351, + 35352, 35353, 35354, 35355, 35356, 35357, 21360, 33521, 27185, 23156, + 40560, 24212, 32552, 33721, 33828, 33829, 33639, 34631, 36814, 36194, + 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, 33219, 30152, + 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, 24703, 21191, + 29992, 24189, 20248, 24736, 24551, 23588, 30001, 37038, 38080, 29369, + 27833, 28216, 37193, 26377, 21451, 21491, 20305, 37321, 35825, 21448, + 24188, 36802, 28132, 20110, 30402, 27014, 34398, 24858, 33286, 20313, + 20446, 36926, 40060, 24841, 28189, 28180, 38533, 20104, 23089, 38632, + 19982, 23679, 31161, 23431, 35821, 32701, 29577, 22495, 33419, 37057, + 21505, 36935, 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, + 35358, 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366, 35367, + 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377, + 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385, 35386, 35387, + 35388, 35389, 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, + 35399, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, + 35410, 35411, 35412, 35413, 35414, 35415, 35416, 35417, 35418, 35419, + 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427, 35428, 35429, + 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, + 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35450, + 35451, 35452, 35453, 35454, 35455, 35456, 28020, 23507, 35029, 39044, + 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, 21407, 25588, + 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, 33489, 24895, + 24616, 38498, 26352, 32422, 36234, 36291, 38053, 23731, 31908, 26376, + 24742, 38405, 32792, 20113, 37095, 21248, 38504, 20801, 36816, 34164, + 37213, 26197, 38901, 23381, 21277, 30776, 26434, 26685, 21705, 28798, + 23472, 36733, 20877, 22312, 21681, 25874, 26242, 36190, 36163, 33039, + 33900, 36973, 31967, 20991, 34299, 26531, 26089, 28577, 34468, 36481, + 22122, 36896, 30338, 28790, 29157, 36131, 25321, 21017, 27901, 36156, + 24590, 22686, 24974, 26366, 36192, 25166, 21939, 28195, 26413, 36711, + 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35467, 35468, + 35469, 35470, 35471, 35472, 35473, 35474, 35476, 35477, 35478, 35479, + 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487, 35488, 35489, + 35490, 35491, 35492, 35493, 35494, 35495, 35496, 35497, 35498, 35499, + 35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, + 35510, 35511, 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519, + 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527, 35528, 35529, + 35530, 35531, 35532, 35533, 35534, 35535, 35536, 35537, 35538, 35539, + 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548, 35549, + 35550, 35551, 35552, 35553, 35554, 35555, 38113, 38392, 30504, 26629, + 27048, 21643, 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, + 23528, 30651, 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, + 23637, 34360, 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, + 24432, 28467, 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, + 32960, 30260, 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, + 20806, 32903, 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, + 34071, 36825, 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, + 38024, 20390, 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, + 25379, 30529, 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, + 35556, 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564, 35565, + 35566, 35567, 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575, + 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583, 35584, 35585, + 35586, 35587, 35588, 35589, 35590, 35592, 35593, 35594, 35595, 35596, + 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604, 35605, 35606, + 35607, 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, + 35617, 35618, 35619, 35620, 35621, 35623, 35624, 35625, 35626, 35627, + 35628, 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, 35637, + 35638, 35639, 35640, 35641, 35642, 35643, 35644, 35645, 35646, 35647, + 35648, 35649, 35650, 35651, 35652, 35653, 24103, 30151, 37073, 35777, + 33437, 26525, 25903, 21553, 34584, 30693, 32930, 33026, 27713, 20043, + 32455, 32844, 30452, 26893, 27542, 25191, 20540, 20356, 22336, 25351, + 27490, 36286, 21482, 26088, 32440, 24535, 25370, 25527, 33267, 33268, + 32622, 24092, 23769, 21046, 26234, 31209, 31258, 36136, 28825, 30164, + 28382, 27835, 31378, 20013, 30405, 24544, 38047, 34935, 32456, 31181, + 32959, 37325, 20210, 20247, 33311, 21608, 24030, 27954, 35788, 31909, + 36724, 32920, 24090, 21650, 30385, 23449, 26172, 39588, 29664, 26666, + 34523, 26417, 29482, 35832, 35803, 36880, 31481, 28891, 29038, 25284, + 30633, 22065, 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, + 35654, 35655, 35656, 35657, 35658, 35659, 35660, 35661, 35662, 35663, + 35664, 35665, 35666, 35667, 35668, 35669, 35670, 35671, 35672, 35673, + 35674, 35675, 35676, 35677, 35678, 35679, 35680, 35681, 35682, 35683, + 35684, 35685, 35687, 35688, 35689, 35690, 35691, 35693, 35694, 35695, + 35696, 35697, 35698, 35699, 35700, 35701, 35702, 35703, 35704, 35705, + 35706, 35707, 35708, 35709, 35710, 35711, 35712, 35713, 35714, 35715, + 35716, 35717, 35718, 35719, 35720, 35721, 35722, 35723, 35724, 35725, + 35726, 35727, 35728, 35729, 35730, 35731, 35732, 35733, 35734, 35735, + 35736, 35737, 35738, 35739, 35740, 35741, 35742, 35743, 35756, 35761, + 35771, 35783, 35792, 35818, 35849, 35870, 20303, 27880, 31069, 39547, + 25235, 29226, 25341, 19987, 30742, 36716, 25776, 36186, 31686, 26729, + 24196, 35013, 22918, 25758, 22766, 29366, 26894, 38181, 36861, 36184, + 22368, 32512, 35846, 20934, 25417, 25305, 21331, 26700, 29730, 33537, + 37196, 21828, 30528, 28796, 27978, 20857, 21672, 36164, 23039, 28363, + 28100, 23388, 32043, 20180, 31869, 28371, 23376, 33258, 28173, 23383, + 39683, 26837, 36394, 23447, 32508, 24635, 32437, 37049, 36208, 22863, + 25549, 31199, 36275, 21330, 26063, 31062, 35781, 38459, 32452, 38075, + 32386, 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, + 26590, 20570, 20316, 22352, 24231, 59408, 59409, 59410, 59411, 59412, + 35896, 35897, 35898, 35899, 35900, 35901, 35902, 35903, 35904, 35906, + 35907, 35908, 35909, 35912, 35914, 35915, 35917, 35918, 35919, 35920, + 35921, 35922, 35923, 35924, 35926, 35927, 35928, 35929, 35931, 35932, + 35933, 35934, 35935, 35936, 35939, 35940, 35941, 35942, 35943, 35944, + 35945, 35948, 35949, 35950, 35951, 35952, 35953, 35954, 35956, 35957, + 35958, 35959, 35963, 35964, 35965, 35966, 35967, 35968, 35969, 35971, + 35972, 35974, 35975, 35976, 35979, 35981, 35982, 35983, 35984, 35985, + 35986, 35987, 35989, 35990, 35991, 35993, 35994, 35995, 35996, 35997, + 35998, 35999, 36000, 36001, 36002, 36003, 36004, 36005, 36006, 36007, + 36008, 36009, 36010, 36011, 36012, 36013, 20109, 19980, 20800, 19984, + 24319, 21317, 19989, 20120, 19998, 39730, 23404, 22121, 20008, 31162, + 20031, 21269, 20039, 22829, 29243, 21358, 27664, 22239, 32996, 39319, + 27603, 30590, 40727, 20022, 20127, 40720, 20060, 20073, 20115, 33416, + 23387, 21868, 22031, 20164, 21389, 21405, 21411, 21413, 21422, 38757, + 36189, 21274, 21493, 21286, 21294, 21310, 36188, 21350, 21347, 20994, + 21000, 21006, 21037, 21043, 21055, 21056, 21068, 21086, 21089, 21084, + 33967, 21117, 21122, 21121, 21136, 21139, 20866, 32596, 20155, 20163, + 20169, 20162, 20200, 20193, 20203, 20190, 20251, 20211, 20258, 20324, + 20213, 20261, 20263, 20233, 20267, 20318, 20327, 25912, 20314, 20317, + 36014, 36015, 36016, 36017, 36018, 36019, 36020, 36021, 36022, 36023, + 36024, 36025, 36026, 36027, 36028, 36029, 36030, 36031, 36032, 36033, + 36034, 36035, 36036, 36037, 36038, 36039, 36040, 36041, 36042, 36043, + 36044, 36045, 36046, 36047, 36048, 36049, 36050, 36051, 36052, 36053, + 36054, 36055, 36056, 36057, 36058, 36059, 36060, 36061, 36062, 36063, + 36064, 36065, 36066, 36067, 36068, 36069, 36070, 36071, 36072, 36073, + 36074, 36075, 36076, 36077, 36078, 36079, 36080, 36081, 36082, 36083, + 36084, 36085, 36086, 36087, 36088, 36089, 36090, 36091, 36092, 36093, + 36094, 36095, 36096, 36097, 36098, 36099, 36100, 36101, 36102, 36103, + 36104, 36105, 36106, 36107, 36108, 36109, 20319, 20311, 20274, 20285, + 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, 20348, + 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, 20433, + 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, 20478, + 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, 20588, + 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, 20710, + 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, 40864, 27718, + 31860, 20846, 24061, 40649, 39320, 20865, 22804, 21241, 21261, 35335, + 21264, 20971, 22809, 20821, 20128, 20822, 20147, 34926, 34980, 20149, + 33044, 35026, 31104, 23348, 34819, 32696, 20907, 20913, 20925, 20924, + 36110, 36111, 36112, 36113, 36114, 36115, 36116, 36117, 36118, 36119, + 36120, 36121, 36122, 36123, 36124, 36128, 36177, 36178, 36183, 36191, + 36197, 36200, 36201, 36202, 36204, 36206, 36207, 36209, 36210, 36216, + 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224, 36226, 36227, + 36230, 36231, 36232, 36233, 36236, 36237, 36238, 36239, 36240, 36242, + 36243, 36245, 36246, 36247, 36248, 36249, 36250, 36251, 36252, 36253, + 36254, 36256, 36257, 36258, 36260, 36261, 36262, 36263, 36264, 36265, + 36266, 36267, 36268, 36269, 36270, 36271, 36272, 36274, 36278, 36279, + 36281, 36283, 36285, 36288, 36289, 36290, 36293, 36295, 36296, 36297, + 36298, 36301, 36304, 36306, 36307, 36308, 20935, 20886, 20898, 20901, + 35744, 35750, 35751, 35754, 35764, 35765, 35767, 35778, 35779, 35787, + 35791, 35790, 35794, 35795, 35796, 35798, 35800, 35801, 35804, 35807, + 35808, 35812, 35816, 35817, 35822, 35824, 35827, 35830, 35833, 35836, + 35839, 35840, 35842, 35844, 35847, 35852, 35855, 35857, 35858, 35860, + 35861, 35862, 35865, 35867, 35864, 35869, 35871, 35872, 35873, 35877, + 35879, 35882, 35883, 35886, 35887, 35890, 35891, 35893, 35894, 21353, + 21370, 38429, 38434, 38433, 38449, 38442, 38461, 38460, 38466, 38473, + 38484, 38495, 38503, 38508, 38514, 38516, 38536, 38541, 38551, 38576, + 37015, 37019, 37021, 37017, 37036, 37025, 37044, 37043, 37046, 37050, + 36309, 36312, 36313, 36316, 36320, 36321, 36322, 36325, 36326, 36327, + 36329, 36333, 36334, 36336, 36337, 36338, 36340, 36342, 36348, 36350, + 36351, 36352, 36353, 36354, 36355, 36356, 36358, 36359, 36360, 36363, + 36365, 36366, 36368, 36369, 36370, 36371, 36373, 36374, 36375, 36376, + 36377, 36378, 36379, 36380, 36384, 36385, 36388, 36389, 36390, 36391, + 36392, 36395, 36397, 36400, 36402, 36403, 36404, 36406, 36407, 36408, + 36411, 36412, 36414, 36415, 36419, 36421, 36422, 36428, 36429, 36430, + 36431, 36432, 36435, 36436, 36437, 36438, 36439, 36440, 36442, 36443, + 36444, 36445, 36446, 36447, 36448, 36449, 36450, 36451, 36452, 36453, + 36455, 36456, 36458, 36459, 36462, 36465, 37048, 37040, 37071, 37061, + 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, 37083, + 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, 37177, + 37187, 37190, 21005, 22850, 21154, 21164, 21165, 21182, 21759, 21200, + 21206, 21232, 21471, 29166, 30669, 24308, 20981, 20988, 39727, 21430, + 24321, 30042, 24047, 22348, 22441, 22433, 22654, 22716, 22725, 22737, + 22313, 22316, 22314, 22323, 22329, 22318, 22319, 22364, 22331, 22338, + 22377, 22405, 22379, 22406, 22396, 22395, 22376, 22381, 22390, 22387, + 22445, 22436, 22412, 22450, 22479, 22439, 22452, 22419, 22432, 22485, + 22488, 22490, 22489, 22482, 22456, 22516, 22511, 22520, 22500, 22493, + 36467, 36469, 36471, 36472, 36473, 36474, 36475, 36477, 36478, 36480, + 36482, 36483, 36484, 36486, 36488, 36489, 36490, 36491, 36492, 36493, + 36494, 36497, 36498, 36499, 36501, 36502, 36503, 36504, 36505, 36506, + 36507, 36509, 36511, 36512, 36513, 36514, 36515, 36516, 36517, 36518, + 36519, 36520, 36521, 36522, 36525, 36526, 36528, 36529, 36531, 36532, + 36533, 36534, 36535, 36536, 36537, 36539, 36540, 36541, 36542, 36543, + 36544, 36545, 36546, 36547, 36548, 36549, 36550, 36551, 36552, 36553, + 36554, 36555, 36556, 36557, 36559, 36560, 36561, 36562, 36563, 36564, + 36565, 36566, 36567, 36568, 36569, 36570, 36571, 36572, 36573, 36574, + 36575, 36576, 36577, 36578, 36579, 36580, 22539, 22541, 22525, 22509, + 22528, 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, + 22656, 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, + 33412, 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, + 33482, 33507, 33432, 33463, 33454, 33483, 33484, 33473, 33449, 33460, + 33441, 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, + 33551, 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, + 33562, 33542, 33556, 33557, 33504, 33493, 33564, 33617, 33627, 33628, + 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, + 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, + 36581, 36582, 36583, 36584, 36585, 36586, 36587, 36588, 36589, 36590, + 36591, 36592, 36593, 36594, 36595, 36596, 36597, 36598, 36599, 36600, + 36601, 36602, 36603, 36604, 36605, 36606, 36607, 36608, 36609, 36610, + 36611, 36612, 36613, 36614, 36615, 36616, 36617, 36618, 36619, 36620, + 36621, 36622, 36623, 36624, 36625, 36626, 36627, 36628, 36629, 36630, + 36631, 36632, 36633, 36634, 36635, 36636, 36637, 36638, 36639, 36640, + 36641, 36642, 36643, 36644, 36645, 36646, 36647, 36648, 36649, 36650, + 36651, 36652, 36653, 36654, 36655, 36656, 36657, 36658, 36659, 36660, + 36661, 36662, 36663, 36664, 36665, 36666, 36667, 36668, 36669, 36670, + 36671, 36672, 36673, 36674, 36675, 36676, 33640, 33563, 33641, 33644, + 33642, 33645, 33646, 33712, 33656, 33715, 33716, 33696, 33706, 33683, + 33692, 33669, 33660, 33718, 33705, 33661, 33720, 33659, 33688, 33694, + 33704, 33722, 33724, 33729, 33793, 33765, 33752, 22535, 33816, 33803, + 33757, 33789, 33750, 33820, 33848, 33809, 33798, 33748, 33759, 33807, + 33795, 33784, 33785, 33770, 33733, 33728, 33830, 33776, 33761, 33884, + 33873, 33882, 33881, 33907, 33927, 33928, 33914, 33929, 33912, 33852, + 33862, 33897, 33910, 33932, 33934, 33841, 33901, 33985, 33997, 34000, + 34022, 33981, 34003, 33994, 33983, 33978, 34016, 33953, 33977, 33972, + 33943, 34021, 34019, 34060, 29965, 34104, 34032, 34105, 34079, 34106, + 36677, 36678, 36679, 36680, 36681, 36682, 36683, 36684, 36685, 36686, + 36687, 36688, 36689, 36690, 36691, 36692, 36693, 36694, 36695, 36696, + 36697, 36698, 36699, 36700, 36701, 36702, 36703, 36704, 36705, 36706, + 36707, 36708, 36709, 36714, 36736, 36748, 36754, 36765, 36768, 36769, + 36770, 36772, 36773, 36774, 36775, 36778, 36780, 36781, 36782, 36783, + 36786, 36787, 36788, 36789, 36791, 36792, 36794, 36795, 36796, 36799, + 36800, 36803, 36806, 36809, 36810, 36811, 36812, 36813, 36815, 36818, + 36822, 36823, 36826, 36832, 36833, 36835, 36839, 36844, 36847, 36849, + 36850, 36852, 36853, 36854, 36858, 36859, 36860, 36862, 36863, 36871, + 36872, 36876, 36878, 36883, 36885, 36888, 34134, 34107, 34047, 34044, + 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, + 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, + 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, + 24318, 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, 23586, + 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, 25306, 25303, + 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, 25457, 25466, + 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, 25586, 25592, + 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, 25669, 25665, + 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, 25709, 25750, + 36889, 36892, 36899, 36900, 36901, 36903, 36904, 36905, 36906, 36907, + 36908, 36912, 36913, 36914, 36915, 36916, 36919, 36921, 36922, 36925, + 36927, 36928, 36931, 36933, 36934, 36936, 36937, 36938, 36939, 36940, + 36942, 36948, 36949, 36950, 36953, 36954, 36956, 36957, 36958, 36959, + 36960, 36961, 36964, 36966, 36967, 36969, 36970, 36971, 36972, 36975, + 36976, 36977, 36978, 36979, 36982, 36983, 36984, 36985, 36986, 36987, + 36988, 36990, 36993, 36996, 36997, 36998, 36999, 37001, 37002, 37004, + 37005, 37006, 37007, 37008, 37010, 37012, 37014, 37016, 37018, 37020, + 37022, 37023, 37024, 37028, 37029, 37031, 37032, 37033, 37035, 37037, + 37042, 37047, 37052, 37053, 37055, 37056, 25722, 25783, 25784, 25753, + 25786, 25792, 25808, 25815, 25828, 25826, 25865, 25893, 25902, 24331, + 24530, 29977, 24337, 21343, 21489, 21501, 21481, 21480, 21499, 21522, + 21526, 21510, 21579, 21586, 21587, 21588, 21590, 21571, 21537, 21591, + 21593, 21539, 21554, 21634, 21652, 21623, 21617, 21604, 21658, 21659, + 21636, 21622, 21606, 21661, 21712, 21677, 21698, 21684, 21714, 21671, + 21670, 21715, 21716, 21618, 21667, 21717, 21691, 21695, 21708, 21721, + 21722, 21724, 21673, 21674, 21668, 21725, 21711, 21726, 21787, 21735, + 21792, 21757, 21780, 21747, 21794, 21795, 21775, 21777, 21799, 21802, + 21863, 21903, 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, + 37058, 37059, 37062, 37064, 37065, 37067, 37068, 37069, 37074, 37076, + 37077, 37078, 37080, 37081, 37082, 37086, 37087, 37088, 37091, 37092, + 37093, 37097, 37098, 37100, 37102, 37104, 37105, 37106, 37107, 37109, + 37110, 37111, 37113, 37114, 37115, 37116, 37119, 37120, 37121, 37123, + 37125, 37126, 37127, 37128, 37129, 37130, 37131, 37132, 37133, 37134, + 37135, 37136, 37137, 37138, 37139, 37140, 37141, 37142, 37143, 37144, + 37146, 37147, 37148, 37149, 37151, 37152, 37153, 37156, 37157, 37158, + 37159, 37160, 37161, 37162, 37163, 37164, 37165, 37166, 37168, 37170, + 37171, 37172, 37173, 37174, 37175, 37176, 37178, 37179, 37180, 37181, + 37182, 37183, 37184, 37185, 37186, 37188, 21815, 21846, 21877, 21878, + 21879, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, 21896, + 21889, 21919, 21886, 21974, 21905, 21883, 21983, 21949, 21950, 21908, + 21913, 21994, 22007, 21961, 22047, 21969, 21995, 21996, 21972, 21990, + 21981, 21956, 21999, 21989, 22002, 22003, 21964, 21965, 21992, 22005, + 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, 22014, 22016, + 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, 22105, 22108, + 22092, 22100, 22150, 22116, 22129, 22123, 22139, 22140, 22149, 22163, + 22191, 22228, 22231, 22237, 22241, 22261, 22251, 22265, 22271, 22276, + 22282, 22281, 22300, 24079, 24089, 24084, 24081, 24113, 24123, 24124, + 37189, 37191, 37192, 37201, 37203, 37204, 37205, 37206, 37208, 37209, + 37211, 37212, 37215, 37216, 37222, 37223, 37224, 37227, 37229, 37235, + 37242, 37243, 37244, 37248, 37249, 37250, 37251, 37252, 37254, 37256, + 37258, 37262, 37263, 37267, 37268, 37269, 37270, 37271, 37272, 37273, + 37276, 37277, 37278, 37279, 37280, 37281, 37284, 37285, 37286, 37287, + 37288, 37289, 37291, 37292, 37296, 37297, 37298, 37299, 37302, 37303, + 37304, 37305, 37307, 37308, 37309, 37310, 37311, 37312, 37313, 37314, + 37315, 37316, 37317, 37318, 37320, 37323, 37328, 37330, 37331, 37332, + 37333, 37334, 37335, 37336, 37337, 37338, 37339, 37341, 37342, 37343, + 37344, 37345, 37346, 37347, 37348, 37349, 24119, 24132, 24148, 24155, + 24158, 24161, 23692, 23674, 23693, 23696, 23702, 23688, 23704, 23705, + 23697, 23706, 23708, 23733, 23714, 23741, 23724, 23723, 23729, 23715, + 23745, 23735, 23748, 23762, 23780, 23755, 23781, 23810, 23811, 23847, + 23846, 23854, 23844, 23838, 23814, 23835, 23896, 23870, 23860, 23869, + 23916, 23899, 23919, 23901, 23915, 23883, 23882, 23913, 23924, 23938, + 23961, 23965, 35955, 23991, 24005, 24435, 24439, 24450, 24455, 24457, + 24460, 24469, 24473, 24476, 24488, 24493, 24501, 24508, 34914, 24417, + 29357, 29360, 29364, 29367, 29368, 29379, 29377, 29390, 29389, 29394, + 29416, 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, 29434, + 37350, 37351, 37352, 37353, 37354, 37355, 37356, 37357, 37358, 37359, + 37360, 37361, 37362, 37363, 37364, 37365, 37366, 37367, 37368, 37369, + 37370, 37371, 37372, 37373, 37374, 37375, 37376, 37377, 37378, 37379, + 37380, 37381, 37382, 37383, 37384, 37385, 37386, 37387, 37388, 37389, + 37390, 37391, 37392, 37393, 37394, 37395, 37396, 37397, 37398, 37399, + 37400, 37401, 37402, 37403, 37404, 37405, 37406, 37407, 37408, 37409, + 37410, 37411, 37412, 37413, 37414, 37415, 37416, 37417, 37418, 37419, + 37420, 37421, 37422, 37423, 37424, 37425, 37426, 37427, 37428, 37429, + 37430, 37431, 37432, 37433, 37434, 37435, 37436, 37437, 37438, 37439, + 37440, 37441, 37442, 37443, 37444, 37445, 29435, 29463, 29459, 29473, + 29450, 29470, 29469, 29461, 29474, 29497, 29477, 29484, 29496, 29489, + 29520, 29517, 29527, 29536, 29548, 29551, 29566, 33307, 22821, 39143, + 22820, 22786, 39267, 39271, 39272, 39273, 39274, 39275, 39276, 39284, + 39287, 39293, 39296, 39300, 39303, 39306, 39309, 39312, 39313, 39315, + 39316, 39317, 24192, 24209, 24203, 24214, 24229, 24224, 24249, 24245, + 24254, 24243, 36179, 24274, 24273, 24283, 24296, 24298, 33210, 24516, + 24521, 24534, 24527, 24579, 24558, 24580, 24545, 24548, 24574, 24581, + 24582, 24554, 24557, 24568, 24601, 24629, 24614, 24603, 24591, 24589, + 24617, 24619, 24586, 24639, 24609, 24696, 24697, 24699, 24698, 24642, + 37446, 37447, 37448, 37449, 37450, 37451, 37452, 37453, 37454, 37455, + 37456, 37457, 37458, 37459, 37460, 37461, 37462, 37463, 37464, 37465, + 37466, 37467, 37468, 37469, 37470, 37471, 37472, 37473, 37474, 37475, + 37476, 37477, 37478, 37479, 37480, 37481, 37482, 37483, 37484, 37485, + 37486, 37487, 37488, 37489, 37490, 37491, 37493, 37494, 37495, 37496, + 37497, 37498, 37499, 37500, 37501, 37502, 37503, 37504, 37505, 37506, + 37507, 37508, 37509, 37510, 37511, 37512, 37513, 37514, 37515, 37516, + 37517, 37519, 37520, 37521, 37522, 37523, 37524, 37525, 37526, 37527, + 37528, 37529, 37530, 37531, 37532, 37533, 37534, 37535, 37536, 37537, + 37538, 37539, 37540, 37541, 37542, 37543, 24682, 24701, 24726, 24730, + 24749, 24733, 24707, 24722, 24716, 24731, 24812, 24763, 24753, 24797, + 24792, 24774, 24794, 24756, 24864, 24870, 24853, 24867, 24820, 24832, + 24846, 24875, 24906, 24949, 25004, 24980, 24999, 25015, 25044, 25077, + 24541, 38579, 38377, 38379, 38385, 38387, 38389, 38390, 38396, 38398, + 38403, 38404, 38406, 38408, 38410, 38411, 38412, 38413, 38415, 38418, + 38421, 38422, 38423, 38425, 38426, 20012, 29247, 25109, 27701, 27732, + 27740, 27722, 27811, 27781, 27792, 27796, 27788, 27752, 27753, 27764, + 27766, 27782, 27817, 27856, 27860, 27821, 27895, 27896, 27889, 27863, + 27826, 27872, 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, + 37544, 37545, 37546, 37547, 37548, 37549, 37551, 37552, 37553, 37554, + 37555, 37556, 37557, 37558, 37559, 37560, 37561, 37562, 37563, 37564, + 37565, 37566, 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574, + 37575, 37577, 37578, 37579, 37580, 37581, 37582, 37583, 37584, 37585, + 37586, 37587, 37588, 37589, 37590, 37591, 37592, 37593, 37594, 37595, + 37596, 37597, 37598, 37599, 37600, 37601, 37602, 37603, 37604, 37605, + 37606, 37607, 37608, 37609, 37610, 37611, 37612, 37613, 37614, 37615, + 37616, 37617, 37618, 37619, 37620, 37621, 37622, 37623, 37624, 37625, + 37626, 37627, 37628, 37629, 37630, 37631, 37632, 37633, 37634, 37635, + 37636, 37637, 37638, 37639, 37640, 37641, 27961, 27943, 27916, 27971, + 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, 27957, 27930, + 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, 27998, 28051, + 28052, 27996, 28000, 28028, 28003, 28186, 28103, 28101, 28126, 28174, + 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, 28172, 28078, + 28203, 28270, 28238, 28267, 28338, 28255, 28294, 28243, 28244, 28210, + 28197, 28228, 28383, 28337, 28312, 28384, 28461, 28386, 28325, 28327, + 28349, 28347, 28343, 28375, 28340, 28367, 28303, 28354, 28319, 28514, + 28486, 28487, 28452, 28437, 28409, 28463, 28470, 28491, 28532, 28458, + 28425, 28457, 28553, 28557, 28556, 28536, 28530, 28540, 28538, 28625, + 37642, 37643, 37644, 37645, 37646, 37647, 37648, 37649, 37650, 37651, + 37652, 37653, 37654, 37655, 37656, 37657, 37658, 37659, 37660, 37661, + 37662, 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670, 37671, + 37672, 37673, 37674, 37675, 37676, 37677, 37678, 37679, 37680, 37681, + 37682, 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690, 37691, + 37692, 37693, 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702, + 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710, 37711, 37712, + 37713, 37714, 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, + 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, 37731, 37732, + 37733, 37734, 37735, 37736, 37737, 37739, 28617, 28583, 28601, 28598, + 28610, 28641, 28654, 28638, 28640, 28655, 28698, 28707, 28699, 28729, + 28725, 28751, 28766, 23424, 23428, 23445, 23443, 23461, 23480, 29999, + 39582, 25652, 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, + 36821, 36837, 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, + 36875, 36902, 36881, 36877, 36886, 36897, 36917, 36918, 36909, 36911, + 36932, 36945, 36946, 36944, 36968, 36952, 36962, 36955, 26297, 36980, + 36989, 36994, 37000, 36995, 37003, 24400, 24407, 24406, 24408, 23611, + 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, + 33396, 24380, 39739, 23662, 22913, 22915, 22925, 22953, 22954, 22947, + 37740, 37741, 37742, 37743, 37744, 37745, 37746, 37747, 37748, 37749, + 37750, 37751, 37752, 37753, 37754, 37755, 37756, 37757, 37758, 37759, + 37760, 37761, 37762, 37763, 37764, 37765, 37766, 37767, 37768, 37769, + 37770, 37771, 37772, 37773, 37774, 37776, 37777, 37778, 37779, 37780, + 37781, 37782, 37783, 37784, 37785, 37786, 37787, 37788, 37789, 37790, + 37791, 37792, 37793, 37794, 37795, 37796, 37797, 37798, 37799, 37800, + 37801, 37802, 37803, 37804, 37805, 37806, 37807, 37808, 37809, 37810, + 37811, 37812, 37813, 37814, 37815, 37816, 37817, 37818, 37819, 37820, + 37821, 37822, 37823, 37824, 37825, 37826, 37827, 37828, 37829, 37830, + 37831, 37832, 37833, 37835, 37836, 37837, 22935, 22986, 22955, 22942, + 22948, 22994, 22962, 22959, 22999, 22974, 23045, 23046, 23005, 23048, + 23011, 23000, 23033, 23052, 23049, 23090, 23092, 23057, 23075, 23059, + 23104, 23143, 23114, 23125, 23100, 23138, 23157, 33004, 23210, 23195, + 23159, 23162, 23230, 23275, 23218, 23250, 23252, 23224, 23264, 23267, + 23281, 23254, 23270, 23256, 23260, 23305, 23319, 23318, 23346, 23351, + 23360, 23573, 23580, 23386, 23397, 23411, 23377, 23379, 23394, 39541, + 39543, 39544, 39546, 39551, 39549, 39552, 39553, 39557, 39560, 39562, + 39568, 39570, 39571, 39574, 39576, 39579, 39580, 39581, 39583, 39584, + 39586, 39587, 39589, 39591, 32415, 32417, 32419, 32421, 32424, 32425, + 37838, 37839, 37840, 37841, 37842, 37843, 37844, 37845, 37847, 37848, + 37849, 37850, 37851, 37852, 37853, 37854, 37855, 37856, 37857, 37858, + 37859, 37860, 37861, 37862, 37863, 37864, 37865, 37866, 37867, 37868, + 37869, 37870, 37871, 37872, 37873, 37874, 37875, 37876, 37877, 37878, + 37879, 37880, 37881, 37882, 37883, 37884, 37885, 37886, 37887, 37888, + 37889, 37890, 37891, 37892, 37893, 37894, 37895, 37896, 37897, 37898, + 37899, 37900, 37901, 37902, 37903, 37904, 37905, 37906, 37907, 37908, + 37909, 37910, 37911, 37912, 37913, 37914, 37915, 37916, 37917, 37918, + 37919, 37920, 37921, 37922, 37923, 37924, 37925, 37926, 37927, 37928, + 37929, 37930, 37931, 37932, 37933, 37934, 32429, 32432, 32446, 32448, + 32449, 32450, 32457, 32459, 32460, 32464, 32468, 32471, 32475, 32480, + 32481, 32488, 32491, 32494, 32495, 32497, 32498, 32525, 32502, 32506, + 32507, 32510, 32513, 32514, 32515, 32519, 32520, 32523, 32524, 32527, + 32529, 32530, 32535, 32537, 32540, 32539, 32543, 32545, 32546, 32547, + 32548, 32549, 32550, 32551, 32554, 32555, 32556, 32557, 32559, 32560, + 32561, 32562, 32563, 32565, 24186, 30079, 24027, 30014, 37013, 29582, + 29585, 29614, 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, + 29641, 29640, 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, + 29682, 29711, 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, + 37935, 37936, 37937, 37938, 37939, 37940, 37941, 37942, 37943, 37944, + 37945, 37946, 37947, 37948, 37949, 37951, 37952, 37953, 37954, 37955, + 37956, 37957, 37958, 37959, 37960, 37961, 37962, 37963, 37964, 37965, + 37966, 37967, 37968, 37969, 37970, 37971, 37972, 37973, 37974, 37975, + 37976, 37977, 37978, 37979, 37980, 37981, 37982, 37983, 37984, 37985, + 37986, 37987, 37988, 37989, 37990, 37991, 37992, 37993, 37994, 37996, + 37997, 37998, 37999, 38000, 38001, 38002, 38003, 38004, 38005, 38006, + 38007, 38008, 38009, 38010, 38011, 38012, 38013, 38014, 38015, 38016, + 38017, 38018, 38019, 38020, 38033, 38038, 38040, 38087, 38095, 38099, + 38100, 38106, 38118, 38139, 38172, 38176, 29723, 29722, 29761, 29788, + 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, 29824, 29825, + 29831, 29835, 29854, 29864, 29865, 29840, 29863, 29906, 29882, 38890, + 38891, 38892, 26444, 26451, 26462, 26440, 26473, 26533, 26503, 26474, + 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, 26487, 26492, + 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, 26549, 26586, + 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, 26621, 26674, + 26675, 26720, 26721, 26702, 26722, 26692, 26724, 26755, 26653, 26709, + 26726, 26689, 26727, 26688, 26686, 26698, 26697, 26665, 26805, 26767, + 26740, 26743, 26771, 26731, 26818, 26990, 26876, 26911, 26912, 26873, + 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, + 38260, 38261, 38263, 38264, 38265, 38266, 38267, 38268, 38269, 38270, + 38272, 38273, 38274, 38275, 38276, 38277, 38278, 38279, 38280, 38281, + 38282, 38283, 38284, 38285, 38286, 38287, 38288, 38289, 38290, 38291, + 38292, 38293, 38294, 38295, 38296, 38297, 38298, 38299, 38300, 38301, + 38302, 38303, 38304, 38305, 38306, 38307, 38308, 38309, 38310, 38311, + 38312, 38313, 38314, 38315, 38316, 38317, 38318, 38319, 38320, 38321, + 38322, 38323, 38324, 38325, 38326, 38327, 38328, 38329, 38330, 38331, + 38332, 38333, 38334, 38335, 38336, 38337, 38338, 38339, 38340, 38341, + 38342, 38343, 38344, 38345, 38346, 38347, 26916, 26864, 26891, 26881, + 26967, 26851, 26896, 26993, 26937, 26976, 26946, 26973, 27012, 26987, + 27008, 27032, 27000, 26932, 27084, 27015, 27016, 27086, 27017, 26982, + 26979, 27001, 27035, 27047, 27067, 27051, 27053, 27092, 27057, 27073, + 27082, 27103, 27029, 27104, 27021, 27135, 27183, 27117, 27159, 27160, + 27237, 27122, 27204, 27198, 27296, 27216, 27227, 27189, 27278, 27257, + 27197, 27176, 27224, 27260, 27281, 27280, 27305, 27287, 27307, 29495, + 29522, 27521, 27522, 27527, 27524, 27538, 27539, 27533, 27546, 27547, + 27553, 27562, 36715, 36717, 36721, 36722, 36723, 36725, 36726, 36728, + 36727, 36729, 36730, 36732, 36734, 36737, 36738, 36740, 36743, 36747, + 38348, 38349, 38350, 38351, 38352, 38353, 38354, 38355, 38356, 38357, + 38358, 38359, 38360, 38361, 38362, 38363, 38364, 38365, 38366, 38367, + 38368, 38369, 38370, 38371, 38372, 38373, 38374, 38375, 38380, 38399, + 38407, 38419, 38424, 38427, 38430, 38432, 38435, 38436, 38437, 38438, + 38439, 38440, 38441, 38443, 38444, 38445, 38447, 38448, 38455, 38456, + 38457, 38458, 38462, 38465, 38467, 38474, 38478, 38479, 38481, 38482, + 38483, 38486, 38487, 38488, 38489, 38490, 38492, 38493, 38494, 38496, + 38499, 38501, 38502, 38507, 38509, 38510, 38511, 38512, 38513, 38515, + 38520, 38521, 38522, 38523, 38524, 38525, 38526, 38527, 38528, 38529, + 38530, 38531, 38532, 38535, 38537, 38538, 36749, 36750, 36751, 36760, + 36762, 36558, 25099, 25111, 25115, 25119, 25122, 25121, 25125, 25124, + 25132, 33255, 29935, 29940, 29951, 29967, 29969, 29971, 25908, 26094, + 26095, 26096, 26122, 26137, 26482, 26115, 26133, 26112, 28805, 26359, + 26141, 26164, 26161, 26166, 26165, 32774, 26207, 26196, 26177, 26191, + 26198, 26209, 26199, 26231, 26244, 26252, 26279, 26269, 26302, 26331, + 26332, 26342, 26345, 36146, 36147, 36150, 36155, 36157, 36160, 36165, + 36166, 36168, 36169, 36167, 36173, 36181, 36185, 35271, 35274, 35275, + 35276, 35278, 35279, 35280, 35281, 29294, 29343, 29277, 29286, 29295, + 29310, 29311, 29316, 29323, 29325, 29327, 29330, 25352, 25394, 25520, + 38540, 38542, 38545, 38546, 38547, 38549, 38550, 38554, 38555, 38557, + 38558, 38559, 38560, 38561, 38562, 38563, 38564, 38565, 38566, 38568, + 38569, 38570, 38571, 38572, 38573, 38574, 38575, 38577, 38578, 38580, + 38581, 38583, 38584, 38586, 38587, 38591, 38594, 38595, 38600, 38602, + 38603, 38608, 38609, 38611, 38612, 38614, 38615, 38616, 38617, 38618, + 38619, 38620, 38621, 38622, 38623, 38625, 38626, 38627, 38628, 38629, + 38630, 38631, 38635, 38636, 38637, 38638, 38640, 38641, 38642, 38644, + 38645, 38648, 38650, 38651, 38652, 38653, 38655, 38658, 38659, 38661, + 38666, 38667, 38668, 38672, 38673, 38674, 38676, 38677, 38679, 38680, + 38681, 38682, 38683, 38685, 38687, 38688, 25663, 25816, 32772, 27626, + 27635, 27645, 27637, 27641, 27653, 27655, 27654, 27661, 27669, 27672, + 27673, 27674, 27681, 27689, 27684, 27690, 27698, 25909, 25941, 25963, + 29261, 29266, 29270, 29232, 34402, 21014, 32927, 32924, 32915, 32956, + 26378, 32957, 32945, 32939, 32941, 32948, 32951, 32999, 33000, 33001, + 33002, 32987, 32962, 32964, 32985, 32973, 32983, 26384, 32989, 33003, + 33009, 33012, 33005, 33037, 33038, 33010, 33020, 26389, 33042, 35930, + 33078, 33054, 33068, 33048, 33074, 33096, 33100, 33107, 33140, 33113, + 33114, 33137, 33120, 33129, 33148, 33149, 33133, 33127, 22605, 23221, + 33160, 33154, 33169, 28373, 33187, 33194, 33228, 26406, 33226, 33211, + 38689, 38690, 38691, 38692, 38693, 38694, 38695, 38696, 38697, 38699, + 38700, 38702, 38703, 38705, 38707, 38708, 38709, 38710, 38711, 38714, + 38715, 38716, 38717, 38719, 38720, 38721, 38722, 38723, 38724, 38725, + 38726, 38727, 38728, 38729, 38730, 38731, 38732, 38733, 38734, 38735, + 38736, 38737, 38740, 38741, 38743, 38744, 38746, 38748, 38749, 38751, + 38755, 38756, 38758, 38759, 38760, 38762, 38763, 38764, 38765, 38766, + 38767, 38768, 38769, 38770, 38773, 38775, 38776, 38777, 38778, 38779, + 38781, 38782, 38783, 38784, 38785, 38786, 38787, 38788, 38790, 38791, + 38792, 38793, 38794, 38796, 38798, 38799, 38800, 38803, 38805, 38806, + 38807, 38809, 38810, 38811, 38812, 38813, 33217, 33190, 27428, 27447, + 27449, 27459, 27462, 27481, 39121, 39122, 39123, 39125, 39129, 39130, + 27571, 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, 26052, + 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, 28859, + 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, 28975, + 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, 29080, + 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, 29224, + 28780, 28952, 29030, 29113, 25150, 25149, 25155, 25160, 25161, 31035, + 31040, 31046, 31049, 31067, 31068, 31059, 31066, 31074, 31063, 31072, + 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, 24528, + 38814, 38815, 38817, 38818, 38820, 38821, 38822, 38823, 38824, 38825, + 38826, 38828, 38830, 38832, 38833, 38835, 38837, 38838, 38839, 38840, + 38841, 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849, 38850, + 38851, 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859, 38860, + 38861, 38862, 38863, 38864, 38865, 38866, 38867, 38868, 38869, 38870, + 38871, 38872, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, + 38881, 38882, 38883, 38884, 38885, 38888, 38894, 38895, 38896, 38897, + 38898, 38900, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, + 38911, 38912, 38913, 38914, 38915, 38916, 38917, 38918, 38919, 38920, + 38921, 38922, 38923, 38924, 38925, 38926, 24636, 24669, 24666, 24679, + 24641, 24665, 24675, 24747, 24838, 24845, 24925, 25001, 24989, 25035, + 25041, 25094, 32896, 32895, 27795, 27894, 28156, 30710, 30712, 30720, + 30729, 30743, 30744, 30737, 26027, 30765, 30748, 30749, 30777, 30778, + 30779, 30751, 30780, 30757, 30764, 30755, 30761, 30798, 30829, 30806, + 30807, 30758, 30800, 30791, 30796, 30826, 30875, 30867, 30874, 30855, + 30876, 30881, 30883, 30898, 30905, 30885, 30932, 30937, 30921, 30956, + 30962, 30981, 30964, 30995, 31012, 31006, 31028, 40859, 40697, 40699, + 40700, 30449, 30468, 30477, 30457, 30471, 30472, 30490, 30498, 30489, + 30509, 30502, 30517, 30520, 30544, 30545, 30535, 30531, 30554, 30568, + 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, + 38937, 38938, 38939, 38940, 38941, 38942, 38943, 38944, 38945, 38946, + 38947, 38948, 38949, 38950, 38951, 38952, 38953, 38954, 38955, 38956, + 38957, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, + 38967, 38968, 38969, 38970, 38971, 38972, 38973, 38974, 38975, 38976, + 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, + 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38996, + 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, + 39007, 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015, 39016, + 39017, 39018, 39019, 39020, 39021, 39022, 30562, 30565, 30591, 30605, + 30589, 30592, 30604, 30609, 30623, 30624, 30640, 30645, 30653, 30010, + 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, 32609, + 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, 30437, + 34866, 38021, 38022, 38023, 38027, 38026, 38028, 38029, 38031, 38032, + 38036, 38039, 38037, 38042, 38043, 38044, 38051, 38052, 38059, 38058, + 38061, 38060, 38063, 38064, 38066, 38068, 38070, 38071, 38072, 38073, + 38074, 38076, 38077, 38079, 38084, 38088, 38089, 38090, 38091, 38092, + 38093, 38094, 38096, 38097, 38098, 38101, 38102, 38103, 38105, 38104, + 38107, 38110, 38111, 38112, 38114, 38116, 38117, 38119, 38120, 38122, + 39023, 39024, 39025, 39026, 39027, 39028, 39051, 39054, 39058, 39061, + 39065, 39075, 39080, 39081, 39082, 39083, 39084, 39085, 39086, 39087, + 39088, 39089, 39090, 39091, 39092, 39093, 39094, 39095, 39096, 39097, + 39098, 39099, 39100, 39101, 39102, 39103, 39104, 39105, 39106, 39107, + 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, + 39119, 39120, 39124, 39126, 39127, 39131, 39132, 39133, 39136, 39137, + 39138, 39139, 39140, 39141, 39142, 39145, 39146, 39147, 39148, 39149, + 39150, 39151, 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159, + 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167, 39168, 39169, + 39170, 39171, 39172, 39173, 39174, 39175, 38121, 38123, 38126, 38127, + 38131, 38132, 38133, 38135, 38137, 38140, 38141, 38143, 38147, 38146, + 38150, 38151, 38153, 38154, 38157, 38158, 38159, 38162, 38163, 38164, + 38165, 38166, 38168, 38171, 38173, 38174, 38175, 38178, 38186, 38187, + 38185, 38188, 38193, 38194, 38196, 38198, 38199, 38200, 38204, 38206, + 38207, 38210, 38197, 38212, 38213, 38214, 38217, 38220, 38222, 38223, + 38226, 38227, 38228, 38230, 38231, 38232, 38233, 38235, 38238, 38239, + 38237, 38241, 38242, 38244, 38245, 38246, 38247, 38248, 38249, 38250, + 38251, 38252, 38255, 38257, 38258, 38259, 38202, 30695, 30700, 38601, + 31189, 31213, 31203, 31211, 31238, 23879, 31235, 31234, 31262, 31252, + 39176, 39177, 39178, 39179, 39180, 39182, 39183, 39185, 39186, 39187, + 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195, 39196, 39197, + 39198, 39199, 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207, + 39208, 39209, 39210, 39211, 39212, 39213, 39215, 39216, 39217, 39218, + 39219, 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227, 39228, + 39229, 39230, 39231, 39232, 39233, 39234, 39235, 39236, 39237, 39238, + 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39248, + 39249, 39250, 39251, 39254, 39255, 39256, 39257, 39258, 39259, 39260, + 39261, 39262, 39263, 39264, 39265, 39266, 39268, 39270, 39283, 39288, + 39289, 39291, 39294, 39298, 39299, 39305, 31289, 31287, 31313, 40655, + 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, + 40480, 40482, 40488, 40489, 40490, 40491, 40492, 40498, 40497, 40502, + 40504, 40503, 40505, 40506, 40510, 40513, 40514, 40516, 40518, 40519, + 40520, 40521, 40523, 40524, 40526, 40529, 40533, 40535, 40538, 40539, + 40540, 40542, 40547, 40550, 40551, 40552, 40553, 40554, 40555, 40556, + 40561, 40557, 40563, 30098, 30100, 30102, 30112, 30109, 30124, 30115, + 30131, 30132, 30136, 30148, 30129, 30128, 30147, 30146, 30166, 30157, + 30179, 30184, 30182, 30180, 30187, 30183, 30211, 30193, 30204, 30207, + 30224, 30208, 30213, 30220, 30231, 30218, 30245, 30232, 30229, 30233, + 39308, 39310, 39322, 39323, 39324, 39325, 39326, 39327, 39328, 39329, + 39330, 39331, 39332, 39334, 39335, 39337, 39338, 39339, 39340, 39341, + 39342, 39343, 39344, 39345, 39346, 39347, 39348, 39349, 39350, 39351, + 39352, 39353, 39354, 39355, 39356, 39357, 39358, 39359, 39360, 39361, + 39362, 39363, 39364, 39365, 39366, 39367, 39368, 39369, 39370, 39371, + 39372, 39373, 39374, 39375, 39376, 39377, 39378, 39379, 39380, 39381, + 39382, 39383, 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391, + 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401, + 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409, 39410, 39411, + 39412, 39413, 39414, 39415, 39416, 39417, 30235, 30268, 30242, 30240, + 30272, 30253, 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, + 30292, 30300, 30294, 30315, 30319, 32714, 31462, 31352, 31353, 31360, + 31366, 31368, 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, + 34921, 34930, 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, + 35042, 35022, 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, + 35105, 35097, 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, + 35195, 30091, 32997, 30386, 30388, 30684, 32786, 32788, 32790, 32796, + 32800, 32802, 32805, 32806, 32807, 32809, 32808, 32817, 32779, 32821, + 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, + 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425, 39426, 39427, + 39428, 39429, 39430, 39431, 39432, 39433, 39434, 39435, 39436, 39437, + 39438, 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446, 39447, + 39448, 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456, 39457, + 39458, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, 39467, + 39468, 39469, 39470, 39471, 39472, 39473, 39474, 39475, 39476, 39477, + 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, + 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, + 39498, 39499, 39500, 39501, 39502, 39503, 39504, 39505, 39506, 39507, + 39508, 39509, 39510, 39511, 39512, 39513, 39049, 39052, 39053, 39055, + 39060, 39066, 39067, 39070, 39071, 39073, 39074, 39077, 39078, 34381, + 34388, 34412, 34414, 34431, 34426, 34428, 34427, 34472, 34445, 34443, + 34476, 34461, 34471, 34467, 34474, 34451, 34473, 34486, 34500, 34485, + 34510, 34480, 34490, 34481, 34479, 34505, 34511, 34484, 34537, 34545, + 34546, 34541, 34547, 34512, 34579, 34526, 34548, 34527, 34520, 34513, + 34563, 34567, 34552, 34568, 34570, 34573, 34569, 34595, 34619, 34590, + 34597, 34606, 34586, 34622, 34632, 34612, 34609, 34601, 34615, 34623, + 34690, 34594, 34685, 34686, 34683, 34656, 34672, 34636, 34670, 34699, + 34643, 34659, 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, + 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523, + 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531, 39538, 39555, + 39561, 39565, 39566, 39572, 39573, 39577, 39590, 39593, 39594, 39595, + 39596, 39597, 39598, 39599, 39602, 39603, 39604, 39605, 39609, 39611, + 39613, 39614, 39615, 39619, 39620, 39622, 39623, 39624, 39625, 39626, + 39629, 39630, 39631, 39632, 39634, 39636, 39637, 39638, 39639, 39641, + 39642, 39643, 39644, 39645, 39646, 39648, 39650, 39651, 39652, 39653, + 39655, 39656, 39657, 39658, 39660, 39662, 39664, 39665, 39666, 39667, + 39668, 39669, 39670, 39671, 39672, 39674, 39676, 39677, 39678, 39679, + 39680, 39681, 39682, 39684, 39685, 39686, 34758, 34696, 34693, 34733, + 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, 34771, 34749, + 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, 34835, 34814, + 34826, 34843, 34849, 34873, 34876, 32566, 32578, 32580, 32581, 33296, + 31482, 31485, 31496, 31491, 31492, 31509, 31498, 31531, 31503, 31559, + 31544, 31530, 31513, 31534, 31537, 31520, 31525, 31524, 31539, 31550, + 31518, 31576, 31578, 31557, 31605, 31564, 31581, 31584, 31598, 31611, + 31586, 31602, 31601, 31632, 31654, 31655, 31672, 31660, 31645, 31656, + 31621, 31658, 31644, 31650, 31659, 31668, 31697, 31681, 31692, 31709, + 31706, 31717, 31718, 31722, 31756, 31742, 31740, 31759, 31766, 31755, + 39687, 39689, 39690, 39691, 39692, 39693, 39694, 39696, 39697, 39698, + 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, + 39710, 39712, 39713, 39714, 39716, 39717, 39718, 39719, 39720, 39721, + 39722, 39723, 39724, 39725, 39726, 39728, 39729, 39731, 39732, 39733, + 39734, 39735, 39736, 39737, 39738, 39741, 39742, 39743, 39744, 39750, + 39754, 39755, 39756, 39758, 39760, 39762, 39763, 39765, 39766, 39767, + 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777, + 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785, 39786, 39787, + 39788, 39789, 39790, 39791, 39792, 39793, 39794, 39795, 39796, 39797, + 39798, 39799, 39800, 39801, 39802, 39803, 31775, 31786, 31782, 31800, + 31809, 31808, 33278, 33281, 33282, 33284, 33260, 34884, 33313, 33314, + 33315, 33325, 33327, 33320, 33323, 33336, 33339, 33331, 33332, 33342, + 33348, 33353, 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, + 35032, 35039, 35166, 32669, 32671, 32679, 32687, 32688, 32690, 31868, + 25929, 31889, 31901, 31900, 31902, 31906, 31922, 31932, 31933, 31937, + 31943, 31948, 31949, 31944, 31941, 31959, 31976, 33390, 26280, 32703, + 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, 31992, 32119, + 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, 36241, + 36273, 36199, 36205, 35911, 35913, 37194, 37200, 37198, 37199, 37220, + 39804, 39805, 39806, 39807, 39808, 39809, 39810, 39811, 39812, 39813, + 39814, 39815, 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823, + 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833, + 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841, 39842, 39843, + 39844, 39845, 39846, 39847, 39848, 39849, 39850, 39851, 39852, 39853, + 39854, 39855, 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863, + 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873, + 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881, 39882, 39883, + 39884, 39885, 39886, 39887, 39888, 39889, 39890, 39891, 39892, 39893, + 39894, 39895, 39896, 39897, 39898, 39899, 37218, 37217, 37232, 37225, + 37231, 37245, 37246, 37234, 37236, 37241, 37260, 37253, 37264, 37261, + 37265, 37282, 37283, 37290, 37293, 37294, 37295, 37301, 37300, 37306, + 35925, 40574, 36280, 36331, 36357, 36441, 36457, 36277, 36287, 36284, + 36282, 36292, 36310, 36311, 36314, 36318, 36302, 36303, 36315, 36294, + 36332, 36343, 36344, 36323, 36345, 36347, 36324, 36361, 36349, 36372, + 36381, 36383, 36396, 36398, 36387, 36399, 36410, 36416, 36409, 36405, + 36413, 36401, 36425, 36417, 36418, 36433, 36434, 36426, 36464, 36470, + 36476, 36463, 36468, 36485, 36495, 36500, 36496, 36508, 36510, 35960, + 35970, 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, + 39900, 39901, 39902, 39903, 39904, 39905, 39906, 39907, 39908, 39909, + 39910, 39911, 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919, + 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929, + 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937, 39938, 39939, + 39940, 39941, 39942, 39943, 39944, 39945, 39946, 39947, 39948, 39949, + 39950, 39951, 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959, + 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969, + 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977, 39978, 39979, + 39980, 39981, 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989, + 39990, 39991, 39992, 39993, 39994, 39995, 35301, 35307, 35311, 35390, + 35622, 38739, 38633, 38643, 38639, 38662, 38657, 38664, 38671, 38670, + 38698, 38701, 38704, 38718, 40832, 40835, 40837, 40838, 40839, 40840, + 40841, 40842, 40844, 40702, 40715, 40717, 38585, 38588, 38589, 38606, + 38610, 30655, 38624, 37518, 37550, 37576, 37694, 37738, 37834, 37775, + 37950, 37995, 40063, 40066, 40069, 40070, 40071, 40072, 31267, 40075, + 40078, 40080, 40081, 40082, 40084, 40085, 40090, 40091, 40094, 40095, + 40096, 40097, 40098, 40099, 40101, 40102, 40103, 40104, 40105, 40107, + 40109, 40110, 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119, + 40122, 40123, 40124, 40125, 40132, 40133, 40134, 40135, 40138, 40139, + 39996, 39997, 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005, + 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015, + 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023, 40024, 40025, + 40026, 40027, 40028, 40029, 40030, 40031, 40032, 40033, 40034, 40035, + 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045, + 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055, + 40056, 40057, 40058, 40059, 40061, 40062, 40064, 40067, 40068, 40073, + 40074, 40076, 40079, 40083, 40086, 40087, 40088, 40089, 40093, 40106, + 40108, 40111, 40121, 40126, 40127, 40128, 40129, 40130, 40136, 40137, + 40145, 40146, 40154, 40155, 40160, 40161, 40140, 40141, 40142, 40143, + 40144, 40147, 40148, 40149, 40151, 40152, 40153, 40156, 40157, 40159, + 40162, 38780, 38789, 38801, 38802, 38804, 38831, 38827, 38819, 38834, + 38836, 39601, 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, + 39621, 39618, 39627, 39628, 39633, 39749, 39747, 39751, 39753, 39752, + 39757, 39761, 39144, 39181, 39214, 39253, 39252, 39647, 39649, 39654, + 39663, 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, + 40637, 40638, 32315, 40578, 40583, 40584, 40587, 40594, 37846, 40605, + 40607, 40667, 40668, 40669, 40672, 40671, 40674, 40681, 40679, 40677, + 40682, 40687, 40738, 40748, 40751, 40761, 40759, 40765, 40766, 40772, + 40163, 40164, 40165, 40166, 40167, 40168, 40169, 40170, 40171, 40172, + 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, + 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191, 40192, + 40193, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, + 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, + 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, + 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, + 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, + 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40251, 40252, + 40253, 40254, 40255, 40256, 40257, 40258, 57908, 57909, 57910, 57911, + 57912, 57913, 57914, 57915, 57916, 57917, 57918, 57919, 57920, 57921, + 57922, 57923, 57924, 57925, 57926, 57927, 57928, 57929, 57930, 57931, + 57932, 57933, 57934, 57935, 57936, 57937, 57938, 57939, 57940, 57941, + 57942, 57943, 57944, 57945, 57946, 57947, 57948, 57949, 57950, 57951, + 57952, 57953, 57954, 57955, 57956, 57957, 57958, 57959, 57960, 57961, + 57962, 57963, 57964, 57965, 57966, 57967, 57968, 57969, 57970, 57971, + 57972, 57973, 57974, 57975, 57976, 57977, 57978, 57979, 57980, 57981, + 57982, 57983, 57984, 57985, 57986, 57987, 57988, 57989, 57990, 57991, + 57992, 57993, 57994, 57995, 57996, 57997, 57998, 57999, 58000, 58001, + 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, + 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, + 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, + 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, + 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, + 40309, 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, 40318, + 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, 40328, + 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, + 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, + 40349, 40350, 40351, 40352, 40353, 40354, 58002, 58003, 58004, 58005, + 58006, 58007, 58008, 58009, 58010, 58011, 58012, 58013, 58014, 58015, + 58016, 58017, 58018, 58019, 58020, 58021, 58022, 58023, 58024, 58025, + 58026, 58027, 58028, 58029, 58030, 58031, 58032, 58033, 58034, 58035, + 58036, 58037, 58038, 58039, 58040, 58041, 58042, 58043, 58044, 58045, + 58046, 58047, 58048, 58049, 58050, 58051, 58052, 58053, 58054, 58055, + 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, + 58066, 58067, 58068, 58069, 58070, 58071, 58072, 58073, 58074, 58075, + 58076, 58077, 58078, 58079, 58080, 58081, 58082, 58083, 58084, 58085, + 58086, 58087, 58088, 58089, 58090, 58091, 58092, 58093, 58094, 58095, + 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40364, + 40365, 40366, 40367, 40368, 40369, 40370, 40371, 40372, 40373, 40374, + 40375, 40376, 40377, 40378, 40379, 40380, 40381, 40382, 40383, 40384, + 40385, 40386, 40387, 40388, 40389, 40390, 40391, 40392, 40393, 40394, + 40395, 40396, 40397, 40398, 40399, 40400, 40401, 40402, 40403, 40404, + 40405, 40406, 40407, 40408, 40409, 40410, 40411, 40412, 40413, 40414, + 40415, 40416, 40417, 40418, 40419, 40420, 40421, 40422, 40423, 40424, + 40425, 40426, 40427, 40428, 40429, 40430, 40431, 40432, 40433, 40434, + 40435, 40436, 40437, 40438, 40439, 40440, 40441, 40442, 40443, 40444, + 40445, 40446, 40447, 40448, 40449, 40450, 58096, 58097, 58098, 58099, + 58100, 58101, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, + 58110, 58111, 58112, 58113, 58114, 58115, 58116, 58117, 58118, 58119, + 58120, 58121, 58122, 58123, 58124, 58125, 58126, 58127, 58128, 58129, + 58130, 58131, 58132, 58133, 58134, 58135, 58136, 58137, 58138, 58139, + 58140, 58141, 58142, 58143, 58144, 58145, 58146, 58147, 58148, 58149, + 58150, 58151, 58152, 58153, 58154, 58155, 58156, 58157, 58158, 58159, + 58160, 58161, 58162, 58163, 58164, 58165, 58166, 58167, 58168, 58169, + 58170, 58171, 58172, 58173, 58174, 58175, 58176, 58177, 58178, 58179, + 58180, 58181, 58182, 58183, 58184, 58185, 58186, 58187, 58188, 58189, + 40451, 40452, 40453, 40454, 40455, 40456, 40457, 40458, 40459, 40460, + 40461, 40462, 40463, 40464, 40465, 40466, 40467, 40468, 40469, 40470, + 40471, 40472, 40473, 40474, 40475, 40476, 40477, 40478, 40484, 40487, + 40494, 40496, 40500, 40507, 40508, 40512, 40525, 40528, 40530, 40531, + 40532, 40534, 40537, 40541, 40543, 40544, 40545, 40546, 40549, 40558, + 40559, 40562, 40564, 40565, 40566, 40567, 40568, 40569, 40570, 40571, + 40572, 40573, 40576, 40577, 40579, 40580, 40581, 40582, 40585, 40586, + 40588, 40589, 40590, 40591, 40592, 40593, 40596, 40597, 40598, 40599, + 40600, 40601, 40602, 40603, 40604, 40606, 40608, 40609, 40610, 40611, + 40612, 40613, 40615, 40616, 40617, 40618, 58190, 58191, 58192, 58193, + 58194, 58195, 58196, 58197, 58198, 58199, 58200, 58201, 58202, 58203, + 58204, 58205, 58206, 58207, 58208, 58209, 58210, 58211, 58212, 58213, + 58214, 58215, 58216, 58217, 58218, 58219, 58220, 58221, 58222, 58223, + 58224, 58225, 58226, 58227, 58228, 58229, 58230, 58231, 58232, 58233, + 58234, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58242, 58243, + 58244, 58245, 58246, 58247, 58248, 58249, 58250, 58251, 58252, 58253, + 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58263, + 58264, 58265, 58266, 58267, 58268, 58269, 58270, 58271, 58272, 58273, + 58274, 58275, 58276, 58277, 58278, 58279, 58280, 58281, 58282, 58283, + 40619, 40620, 40621, 40622, 40623, 40624, 40625, 40626, 40627, 40629, + 40630, 40631, 40633, 40634, 40636, 40639, 40640, 40641, 40642, 40643, + 40645, 40646, 40647, 40648, 40650, 40651, 40652, 40656, 40658, 40659, + 40661, 40662, 40663, 40665, 40666, 40670, 40673, 40675, 40676, 40678, + 40680, 40683, 40684, 40685, 40686, 40688, 40689, 40690, 40691, 40692, + 40693, 40694, 40695, 40696, 40698, 40701, 40703, 40704, 40705, 40706, + 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40716, 40719, + 40721, 40722, 40724, 40725, 40726, 40728, 40730, 40731, 40732, 40733, + 40734, 40735, 40737, 40739, 40740, 40741, 40742, 40743, 40744, 40745, + 40746, 40747, 40749, 40750, 40752, 40753, 58284, 58285, 58286, 58287, + 58288, 58289, 58290, 58291, 58292, 58293, 58294, 58295, 58296, 58297, + 58298, 58299, 58300, 58301, 58302, 58303, 58304, 58305, 58306, 58307, + 58308, 58309, 58310, 58311, 58312, 58313, 58314, 58315, 58316, 58317, + 58318, 58319, 58320, 58321, 58322, 58323, 58324, 58325, 58326, 58327, + 58328, 58329, 58330, 58331, 58332, 58333, 58334, 58335, 58336, 58337, + 58338, 58339, 58340, 58341, 58342, 58343, 58344, 58345, 58346, 58347, + 58348, 58349, 58350, 58351, 58352, 58353, 58354, 58355, 58356, 58357, + 58358, 58359, 58360, 58361, 58362, 58363, 58364, 58365, 58366, 58367, + 58368, 58369, 58370, 58371, 58372, 58373, 58374, 58375, 58376, 58377, + 40754, 40755, 40756, 40757, 40758, 40760, 40762, 40764, 40767, 40768, + 40769, 40770, 40771, 40773, 40774, 40775, 40776, 40777, 40778, 40779, + 40780, 40781, 40782, 40783, 40786, 40787, 40788, 40789, 40790, 40791, + 40792, 40793, 40794, 40795, 40796, 40797, 40798, 40799, 40800, 40801, + 40802, 40803, 40804, 40805, 40806, 40807, 40808, 40809, 40810, 40811, + 40812, 40813, 40814, 40815, 40816, 40817, 40818, 40819, 40820, 40821, + 40822, 40823, 40824, 40825, 40826, 40827, 40828, 40829, 40830, 40833, + 40834, 40845, 40846, 40847, 40848, 40849, 40850, 40851, 40852, 40853, + 40854, 40855, 40856, 40860, 40861, 40862, 40865, 40866, 40867, 40868, + 40869, 63788, 63865, 63893, 63975, 63985, 58378, 58379, 58380, 58381, + 58382, 58383, 58384, 58385, 58386, 58387, 58388, 58389, 58390, 58391, + 58392, 58393, 58394, 58395, 58396, 58397, 58398, 58399, 58400, 58401, + 58402, 58403, 58404, 58405, 58406, 58407, 58408, 58409, 58410, 58411, + 58412, 58413, 58414, 58415, 58416, 58417, 58418, 58419, 58420, 58421, + 58422, 58423, 58424, 58425, 58426, 58427, 58428, 58429, 58430, 58431, + 58432, 58433, 58434, 58435, 58436, 58437, 58438, 58439, 58440, 58441, + 58442, 58443, 58444, 58445, 58446, 58447, 58448, 58449, 58450, 58451, + 58452, 58453, 58454, 58455, 58456, 58457, 58458, 58459, 58460, 58461, + 58462, 58463, 58464, 58465, 58466, 58467, 58468, 58469, 58470, 58471, + 64012, 64013, 64014, 64015, 64017, 64019, 64020, 64024, 64031, 64032, + 64033, 64035, 64036, 64039, 64040, 64041, 11905, 59414, 59415, 59416, + 11908, 13427, 13383, 11912, 11915, 59422, 13726, 13850, 13838, 11916, + 11927, 14702, 14616, 59430, 14799, 14815, 14963, 14800, 59435, 59436, + 15182, 15470, 15584, 11943, 59441, 59442, 11946, 16470, 16735, 11950, + 17207, 11955, 11958, 11959, 59451, 17329, 17324, 11963, 17373, 17622, + 18017, 17996, 59459, 18211, 18217, 18300, 18317, 11978, 18759, 18810, + 18813, 18818, 18819, 18821, 18822, 18847, 18843, 18871, 18870, 59476, + 59477, 19619, 19615, 19616, 19617, 19575, 19618, 19731, 19732, 19733, + 19734, 19735, 19736, 19737, 19886, 59492, 58472, 58473, 58474, 58475, + 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58485, + 58486, 58487, 58488, 58489, 58490, 58491, 58492, 58493, 58494, 58495, + 58496, 58497, 58498, 58499, 58500, 58501, 58502, 58503, 58504, 58505, + 58506, 58507, 58508, 58509, 58510, 58511, 58512, 58513, 58514, 58515, + 58516, 58517, 58518, 58519, 58520, 58521, 58522, 58523, 58524, 58525, + 58526, 58527, 58528, 58529, 58530, 58531, 58532, 58533, 58534, 58535, + 58536, 58537, 58538, 58539, 58540, 58541, 58542, 58543, 58544, 58545, + 58546, 58547, 58548, 58549, 58550, 58551, 58552, 58553, 58554, 58555, + 58556, 58557, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, + +}; + +static const unsigned long myencoding_map_gb18030_ranges[][2] = { + {0, 128}, {36, 165}, {38, 169}, {45, 178}, {50, 184}, + {81, 216}, {89, 226}, {95, 235}, {96, 238}, {100, 244}, + {103, 248}, {104, 251}, {105, 253}, {109, 258}, {126, 276}, + {133, 284}, {148, 300}, {172, 325}, {175, 329}, {179, 334}, + {208, 364}, {306, 463}, {307, 465}, {308, 467}, {309, 469}, + {310, 471}, {311, 473}, {312, 475}, {313, 477}, {341, 506}, + {428, 594}, {443, 610}, {544, 712}, {545, 716}, {558, 730}, + {741, 930}, {742, 938}, {749, 962}, {750, 970}, {805, 1026}, + {819, 1104}, {820, 1106}, {7922, 8209}, {7924, 8215}, {7925, 8218}, + {7927, 8222}, {7934, 8231}, {7943, 8241}, {7944, 8244}, {7945, 8246}, + {7950, 8252}, {8062, 8365}, {8148, 8452}, {8149, 8454}, {8152, 8458}, + {8164, 8471}, {8174, 8482}, {8236, 8556}, {8240, 8570}, {8262, 8596}, + {8264, 8602}, {8374, 8713}, {8380, 8720}, {8381, 8722}, {8384, 8726}, + {8388, 8731}, {8390, 8737}, {8392, 8740}, {8393, 8742}, {8394, 8748}, + {8396, 8751}, {8401, 8760}, {8406, 8766}, {8416, 8777}, {8419, 8781}, + {8424, 8787}, {8437, 8802}, {8439, 8808}, {8445, 8816}, {8482, 8854}, + {8485, 8858}, {8496, 8870}, {8521, 8896}, {8603, 8979}, {8936, 9322}, + {8946, 9372}, {9046, 9548}, {9050, 9588}, {9063, 9616}, {9066, 9622}, + {9076, 9634}, {9092, 9652}, {9100, 9662}, {9108, 9672}, {9111, 9676}, + {9113, 9680}, {9131, 9702}, {9162, 9735}, {9164, 9738}, {9218, 9793}, + {9219, 9795}, {11329, 11906}, {11331, 11909}, {11334, 11913}, {11336, 11917}, + {11346, 11928}, {11361, 11944}, {11363, 11947}, {11366, 11951}, {11370, 11956}, + {11372, 11960}, {11375, 11964}, {11389, 11979}, {11682, 12284}, {11686, 12292}, + {11687, 12312}, {11692, 12319}, {11694, 12330}, {11714, 12351}, {11716, 12436}, + {11723, 12447}, {11725, 12535}, {11730, 12543}, {11736, 12586}, {11982, 12842}, + {11989, 12850}, {12102, 12964}, {12336, 13200}, {12348, 13215}, {12350, 13218}, + {12384, 13253}, {12393, 13263}, {12395, 13267}, {12397, 13270}, {12510, 13384}, + {12553, 13428}, {12851, 13727}, {12962, 13839}, {12973, 13851}, {13738, 14617}, + {13823, 14703}, {13919, 14801}, {13933, 14816}, {14080, 14964}, {14298, 15183}, + {14585, 15471}, {14698, 15585}, {15583, 16471}, {15847, 16736}, {16318, 17208}, + {16434, 17325}, {16438, 17330}, {16481, 17374}, {16729, 17623}, {17102, 17997}, + {17122, 18018}, {17315, 18212}, {17320, 18218}, {17402, 18301}, {17418, 18318}, + {17859, 18760}, {17909, 18811}, {17911, 18814}, {17915, 18820}, {17916, 18823}, + {17936, 18844}, {17939, 18848}, {17961, 18872}, {18664, 19576}, {18703, 19620}, + {18814, 19738}, {18962, 19887}, {19043, 40870}, {33469, 59244}, {33470, 59336}, + {33471, 59367}, {33484, 59413}, {33485, 59417}, {33490, 59423}, {33497, 59431}, + {33501, 59437}, {33505, 59443}, {33513, 59452}, {33520, 59460}, {33536, 59478}, + {33550, 59493}, {37845, 63789}, {37921, 63866}, {37948, 63894}, {38029, 63976}, + {38038, 63986}, {38064, 64016}, {38065, 64018}, {38066, 64021}, {38069, 64025}, + {38075, 64034}, {38076, 64037}, {38078, 64042}, {39108, 65074}, {39109, 65093}, + {39113, 65107}, {39114, 65112}, {39115, 65127}, {39116, 65132}, {39265, 65375}, + {39394, 65510}, {189000, 65536}, +}; + +static const unsigned long myencoding_map_ibm866[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 9617, 9618, + 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, + 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, + 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, + 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, + 9484, 9608, 9604, 9612, 9616, 9600, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, + 176, 8729, 183, 8730, 8470, 164, 9632, 160, +}; + +static const unsigned long myencoding_map_iso_8859_10[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 274, 290, 298, 296, 310, 167, + 315, 272, 352, 358, 381, 173, 362, 330, 176, 261, + 275, 291, 299, 297, 311, 183, 316, 273, 353, 359, + 382, 8213, 363, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 207, + 208, 325, 332, 211, 212, 213, 214, 360, 216, 370, + 218, 219, 220, 221, 222, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 239, 240, 326, 333, 243, 244, 245, 246, 361, + 248, 371, 250, 251, 252, 253, 254, 312, +}; + +static const unsigned long myencoding_map_iso_8859_13[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8221, 162, 163, 164, 8222, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 8220, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 8217, +}; + +static const unsigned long myencoding_map_iso_8859_14[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 7682, 7683, 163, 266, 267, 7690, 167, + 7808, 169, 7810, 7691, 7922, 173, 174, 376, 7710, 7711, + 288, 289, 7744, 7745, 182, 7766, 7809, 7767, 7811, 7776, + 7923, 7812, 7813, 7777, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 372, 209, 210, 211, 212, 213, 214, 7786, 216, 217, + 218, 219, 220, 221, 374, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 373, 241, 242, 243, 244, 245, 246, 7787, + 248, 249, 250, 251, 252, 253, 375, 255, +}; + +static const unsigned long myencoding_map_iso_8859_15[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 8364, 165, 352, 167, + 353, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 381, 181, 182, 183, 382, 185, 186, 187, + 338, 339, 376, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myencoding_map_iso_8859_16[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 261, 321, 8364, 8222, 352, 167, + 353, 169, 536, 171, 377, 173, 378, 379, 176, 177, + 268, 322, 381, 8221, 182, 183, 382, 269, 537, 187, + 338, 339, 376, 380, 192, 193, 194, 258, 196, 262, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 272, 323, 210, 211, 212, 336, 214, 346, 368, 217, + 218, 219, 220, 280, 538, 223, 224, 225, 226, 259, + 228, 263, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 273, 324, 242, 243, 244, 337, 246, 347, + 369, 249, 250, 251, 252, 281, 539, 255, +}; + +static const unsigned long myencoding_map_iso_8859_2[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 728, 321, 164, 317, 346, 167, + 168, 352, 350, 356, 377, 173, 381, 379, 176, 261, + 731, 322, 180, 318, 347, 711, 184, 353, 351, 357, + 378, 733, 382, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myencoding_map_iso_8859_3[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 294, 728, 163, 164, 0x0000, 292, 167, + 168, 304, 350, 286, 308, 173, 0x0000, 379, 176, 295, + 178, 179, 180, 181, 293, 183, 184, 305, 351, 287, + 309, 189, 0x0000, 380, 192, 193, 194, 0x0000, 196, 266, + 264, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 0x0000, 209, 210, 211, 212, 288, 214, 215, 284, 217, + 218, 219, 220, 364, 348, 223, 224, 225, 226, 0x0000, + 228, 267, 265, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 0x0000, 241, 242, 243, 244, 289, 246, 247, + 285, 249, 250, 251, 252, 365, 349, 729, +}; + +static const unsigned long myencoding_map_iso_8859_4[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 312, 342, 164, 296, 315, 167, + 168, 352, 274, 290, 358, 173, 381, 175, 176, 261, + 731, 343, 180, 297, 316, 711, 184, 353, 275, 291, + 359, 330, 382, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 298, + 272, 325, 332, 310, 212, 213, 214, 215, 216, 370, + 218, 219, 220, 360, 362, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 299, 273, 326, 333, 311, 244, 245, 246, 247, + 248, 371, 250, 251, 252, 361, 363, 729, +}; + +static const unsigned long myencoding_map_iso_8859_5[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 173, 1038, 1039, 1040, 1041, + 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, + 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 8470, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 167, 1118, 1119, +}; + +static const unsigned long myencoding_map_iso_8859_6[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 0x0000, 0x0000, 164, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1548, 173, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1563, + 0x0000, 0x0000, 0x0000, 1567, 0x0000, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myencoding_map_iso_8859_7[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8216, 8217, 163, 8364, 8367, 166, 167, + 168, 169, 890, 171, 172, 173, 0x0000, 8213, 176, 177, + 178, 179, 900, 901, 902, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myencoding_map_iso_8859_8[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 162, 163, 164, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8215, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myencoding_map_jis0208[] = { + 12288, 12289, 12290, 65292, 65294, 12539, 65306, 65307, 65311, 65281, + 12443, 12444, 180, 65344, 168, 65342, 65507, 65343, 12541, 12542, + 12445, 12446, 12291, 20189, 12293, 12294, 12295, 12540, 8213, 8208, + 65295, 65340, 65374, 8741, 65372, 8230, 8229, 8216, 8217, 8220, + 8221, 65288, 65289, 12308, 12309, 65339, 65341, 65371, 65373, 12296, + 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 65291, + 65293, 177, 215, 247, 65309, 8800, 65308, 65310, 8806, 8807, + 8734, 8756, 9794, 9792, 176, 8242, 8243, 8451, 65509, 65284, + 65504, 65505, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, + 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, + 9660, 8251, 12306, 8594, 8592, 8593, 8595, 12307, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8743, 8744, 65506, 8658, 8660, + 8704, 8707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8491, 8240, 9839, 9837, 9834, + 8224, 8225, 182, 0x0000, 0x0000, 0x0000, 0x0000, 9711, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 65296, 65297, 65298, 65299, 65300, 65301, 65302, + 65303, 65304, 65305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, + 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, + 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 0x0000, 0x0000, + 0x0000, 0x0000, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, + 12361, 12362, 12363, 12364, 12365, 12366, 12367, 12368, 12369, 12370, + 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, + 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, + 12391, 12392, 12393, 12394, 12395, 12396, 12397, 12398, 12399, 12400, + 12401, 12402, 12403, 12404, 12405, 12406, 12407, 12408, 12409, 12410, + 12411, 12412, 12413, 12414, 12415, 12416, 12417, 12418, 12419, 12420, + 12421, 12422, 12423, 12424, 12425, 12426, 12427, 12428, 12429, 12430, + 12431, 12432, 12433, 12434, 12435, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, + 934, 935, 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, + 964, 965, 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1040, 1041, 1042, 1043, 1044, 1045, + 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, + 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, + 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, + 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9472, 9474, + 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, + 9475, 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, + 9504, 9519, 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9312, 9313, + 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, + 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 0x0000, 13129, + 13076, 13090, 13133, 13080, 13095, 13059, 13110, 13137, 13143, 13069, + 13094, 13091, 13099, 13130, 13115, 13212, 13213, 13214, 13198, 13199, + 13252, 13217, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 13179, 12317, 12319, 8470, 13261, 8481, 12964, 12965, 12966, 12967, + 12968, 12849, 12850, 12857, 13182, 13181, 13180, 8786, 8801, 8747, + 8750, 8721, 8730, 8869, 8736, 8735, 8895, 8757, 8745, 8746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 20124, 21782, 23043, 38463, 21696, 24859, 25384, 23030, 36898, 33909, + 33564, 31312, 24746, 25569, 28197, 26093, 33894, 33446, 39925, 26771, + 22311, 26017, 25201, 23451, 22992, 34427, 39156, 32098, 32190, 39822, + 25110, 31903, 34999, 23433, 24245, 25353, 26263, 26696, 38343, 38797, + 26447, 20197, 20234, 20301, 20381, 20553, 22258, 22839, 22996, 23041, + 23561, 24799, 24847, 24944, 26131, 26885, 28858, 30031, 30064, 31227, + 32173, 32239, 32963, 33806, 34915, 35586, 36949, 36986, 21307, 20117, + 20133, 22495, 32946, 37057, 30959, 19968, 22769, 28322, 36920, 31282, + 33576, 33419, 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, + 39154, 28139, 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, + 23431, 28879, 32701, 36802, 38632, 21359, 40284, 31418, 19985, 30867, + 33276, 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, 28006, + 29916, 38287, 22082, 20113, 36939, 38642, 33615, 39180, 21473, 21942, + 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, 29787, 30408, + 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, 30410, 39365, + 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, 22576, 22852, + 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, 28948, 29017, + 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, 40219, 22633, + 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, 25276, 26106, + 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, 40644, 23713, + 27798, 33659, 20740, 23627, 25014, 33222, 26742, 29281, 20057, 20474, + 21368, 24681, 28201, 31311, 38899, 19979, 21270, 20206, 20309, 20285, + 20385, 20339, 21152, 21487, 22025, 22799, 23233, 23478, 23521, 31185, + 26247, 26524, 26550, 27468, 27827, 28779, 29634, 31117, 31166, 31292, + 31623, 33457, 33499, 33540, 33655, 33775, 33747, 34662, 35506, 22057, + 36008, 36838, 36942, 38686, 34442, 20420, 23784, 25105, 29273, 30011, + 33253, 33469, 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, + 22238, 22602, 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, + 25296, 25913, 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, + 33445, 34809, 38283, 38542, 35997, 20977, 21182, 22806, 21683, 23475, + 23830, 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, + 28012, 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, + 24275, 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, + 35282, 36203, 36611, 37101, 38307, 38548, 38761, 23398, 23731, 27005, + 38989, 38990, 25499, 31520, 27179, 27263, 26806, 39949, 28511, 21106, + 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, 36676, 19988, + 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, 33970, 37340, + 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, 33477, 29926, + 20094, 20355, 20896, 23506, 21002, 21208, 21223, 24059, 21914, 22570, + 23014, 23436, 23448, 23515, 24178, 24185, 24739, 24863, 24931, 25022, + 25563, 25954, 26577, 26707, 26874, 27454, 27475, 27735, 28450, 28567, + 28485, 29872, 29976, 30435, 30475, 31487, 31649, 31777, 32233, 32566, + 32752, 32925, 33382, 33694, 35251, 35532, 36011, 36996, 37969, 38291, + 38289, 38306, 38501, 38867, 39208, 33304, 20024, 21547, 23736, 24012, + 29609, 30284, 30524, 23721, 32747, 36107, 38593, 38929, 38996, 39000, + 20225, 20238, 21361, 21916, 22120, 22522, 22855, 23305, 23492, 23696, + 24076, 24190, 24524, 25582, 26426, 26071, 26082, 26399, 26827, 26820, + 27231, 24112, 27589, 27671, 27773, 30079, 31048, 23395, 31232, 32000, + 24509, 35215, 35352, 36020, 36215, 36556, 36637, 39138, 39438, 39740, + 20096, 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, + 30097, 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, + 21507, 21931, 26708, 27224, 35440, 30759, 26485, 40653, 21364, 23458, + 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, + 24339, 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, 31350, + 31406, 31496, 32026, 31998, 32102, 26087, 29275, 21435, 23621, 24040, + 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, 28417, 31142, + 39770, 20136, 20139, 20140, 20379, 20384, 20689, 20807, 31478, 20849, + 20982, 21332, 21281, 21375, 21483, 21932, 22659, 23777, 24375, 24394, + 24623, 24656, 24685, 25375, 25945, 27211, 27841, 29378, 29421, 30703, + 33016, 33029, 33288, 34126, 37111, 37857, 38911, 39255, 39514, 20208, + 20957, 23597, 26241, 26989, 23616, 26354, 26997, 29577, 26704, 31873, + 20677, 21220, 22343, 24062, 37670, 26020, 27427, 27453, 29748, 31105, + 31165, 31563, 32202, 33465, 33740, 34943, 35167, 35641, 36817, 37329, + 21535, 37504, 20061, 20534, 21477, 21306, 29399, 29590, 30697, 33510, + 36527, 39366, 39368, 39378, 20855, 24858, 34398, 21936, 31354, 20598, + 23507, 36935, 38533, 20018, 27355, 37351, 23633, 23624, 25496, 31391, + 27795, 38772, 36705, 31402, 29066, 38536, 31874, 26647, 32368, 26705, + 37740, 21234, 21531, 34219, 35347, 32676, 36557, 37089, 21350, 34952, + 31041, 20418, 20670, 21009, 20804, 21843, 22317, 29674, 22411, 22865, + 24418, 24452, 24693, 24950, 24935, 25001, 25522, 25658, 25964, 26223, + 26690, 28179, 30054, 31293, 31995, 32076, 32153, 32331, 32619, 33550, + 33610, 34509, 35336, 35427, 35686, 36605, 38938, 40335, 33464, 36814, + 39912, 21127, 25119, 25731, 28608, 38553, 26689, 20625, 27424, 27770, + 28500, 31348, 32080, 34880, 35363, 26376, 20214, 20537, 20518, 20581, + 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, 25010, 25080, + 25331, 25458, 26908, 27177, 29309, 29356, 29486, 30740, 30831, 32121, + 30476, 32937, 35211, 35609, 36066, 36562, 36963, 37749, 38522, 38997, + 39443, 40568, 20803, 21407, 21427, 24187, 24358, 28187, 28304, 29572, + 29694, 32067, 33335, 35328, 35578, 38480, 20046, 20491, 21476, 21628, + 22266, 22993, 23396, 24049, 24235, 24359, 25144, 25925, 26543, 28246, + 29392, 31946, 34996, 32929, 32993, 33776, 34382, 35463, 36328, 37431, + 38599, 39015, 40723, 20116, 20114, 20237, 21320, 21577, 21566, 23087, + 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, 35703, + 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, 20844, + 21151, 21177, 21246, 21402, 21475, 21521, 21518, 21897, 22353, 22434, + 22909, 23380, 23389, 23439, 24037, 24039, 24055, 24184, 24195, 24218, + 24247, 24344, 24658, 24908, 25239, 25304, 25511, 25915, 26114, 26179, + 26356, 26477, 26657, 26775, 27083, 27743, 27946, 28009, 28207, 28317, + 30002, 30343, 30828, 31295, 31968, 32005, 32024, 32094, 32177, 32789, + 32771, 32943, 32945, 33108, 33167, 33322, 33618, 34892, 34913, 35611, + 36002, 36092, 37066, 37237, 37489, 30783, 37628, 38308, 38477, 38917, + 39321, 39640, 40251, 21083, 21163, 21495, 21512, 22741, 25335, 28640, + 35946, 36703, 40633, 20811, 21051, 21578, 22269, 31296, 37239, 40288, + 40658, 29508, 28425, 33136, 29969, 24573, 24794, 39592, 29403, 36796, + 27492, 38915, 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, + 26118, 26681, 26801, 28151, 30165, 32058, 33390, 39746, 20123, 20304, + 21449, 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, + 37782, 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, + 22622, 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, + 37319, 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, + 38555, 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, + 27018, 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, + 25662, 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, + 31545, 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, + 34217, 38609, 30352, 39894, 25420, 37638, 39851, 30399, 26194, 19977, + 20632, 21442, 23665, 24808, 25746, 25955, 26719, 29158, 29642, 29987, + 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, 27531, + 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, 22763, + 22987, 22985, 23039, 23376, 23629, 24066, 24107, 24535, 24605, 25351, + 25903, 23388, 26031, 26045, 26088, 26525, 27490, 27515, 27663, 29509, + 31049, 31169, 31992, 32025, 32043, 32930, 33026, 33267, 35222, 35422, + 35433, 35430, 35468, 35566, 36039, 36060, 38604, 39164, 27503, 20107, + 20284, 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, + 27835, 29246, 29885, 30164, 30913, 31034, 32780, 32819, 33258, 33940, + 36766, 27728, 40575, 24335, 35672, 40235, 31482, 36600, 23437, 38635, + 19971, 21489, 22519, 22833, 23241, 23460, 24713, 28287, 28422, 30142, + 36074, 23455, 34048, 31712, 20594, 26612, 33437, 23649, 34122, 32286, + 33294, 20889, 23556, 25448, 36198, 26012, 29038, 31038, 32023, 32773, + 35613, 36554, 36974, 34503, 37034, 20511, 21242, 23610, 26451, 28796, + 29237, 37196, 37320, 37675, 33509, 23490, 24369, 24825, 20027, 21462, + 23432, 25163, 26417, 27530, 29417, 29664, 31278, 33131, 36259, 37202, + 39318, 20754, 21463, 21610, 23551, 25480, 27193, 32172, 38656, 22234, + 21454, 21608, 23447, 23601, 24030, 20462, 24833, 25342, 27954, 31168, + 31179, 32066, 32333, 32722, 33261, 33311, 33936, 34886, 35186, 35728, + 36468, 36655, 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, + 21313, 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, + 21460, 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, + 34899, 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, + 24490, 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, + 36981, 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, + 32210, 32626, 26360, 34223, 34295, 35576, 21161, 21465, 22899, 24207, + 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, + 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, 23567, + 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, 25307, 25484, + 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, 27189, 27836, + 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, 30813, 30977, + 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, 33931, 34121, + 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, 37284, 37478, + 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, 20887, 21104, + 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, 26454, 27972, + 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, 22516, 39166, + 25325, 26893, 27542, 29165, 32340, 32887, 33394, 35302, 39135, 34645, + 36785, 23611, 20280, 20449, 20405, 21767, 23072, 23517, 23529, 24515, + 24910, 25391, 26032, 26187, 26862, 27035, 28024, 28145, 30003, 30137, + 30495, 31070, 31206, 32051, 33251, 33455, 34218, 35242, 35386, 36523, + 36763, 36914, 37341, 38663, 20154, 20161, 20995, 22645, 22764, 23563, + 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, + 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, 27700, 28810, + 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, 29790, + 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, 26905, + 33733, 38935, 38592, 35070, 28548, 25722, 23544, 19990, 28716, 30045, + 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, 25919, 25972, + 26143, 26228, 26866, 26646, 27491, 28165, 29298, 29983, 30427, 31934, + 32854, 22768, 35069, 35199, 35488, 35475, 35531, 36893, 37266, 38738, + 38745, 25993, 31246, 33030, 38587, 24109, 24796, 25114, 26021, 26132, + 26512, 30707, 31309, 31821, 32318, 33034, 36012, 36196, 36321, 36447, + 30889, 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, + 38634, 32118, 33292, 34633, 20185, 20808, 21315, 21344, 23459, 23554, + 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, + 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, + 33146, 33307, 33337, 34214, 35438, 36046, 36341, 36984, 36983, 37549, + 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, 32341, + 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, 29401, + 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, 35380, + 38459, 36961, 40736, 20711, 21109, 21452, 21474, 20489, 21930, 22766, + 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, 25475, 25407, + 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, 29157, 20105, + 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, 33624, 33900, + 33980, 34299, 35013, 36208, 36865, 36973, 37783, 38684, 39442, 20687, + 22679, 24974, 33235, 34101, 36104, 36896, 20419, 20596, 21063, 21363, + 24687, 25417, 26463, 28204, 36275, 36895, 20439, 23646, 36042, 26063, + 32154, 21330, 34966, 20854, 25539, 23384, 23403, 23562, 25613, 26449, + 36956, 20182, 22810, 22826, 27760, 35409, 21822, 22549, 22949, 24816, + 25171, 26561, 33333, 26965, 38464, 39364, 39464, 20307, 22534, 23550, + 32784, 23729, 24111, 24453, 24608, 24907, 25140, 26367, 27888, 28382, + 32974, 33151, 33492, 34955, 36024, 36864, 36910, 38538, 40667, 39899, + 20195, 21488, 22823, 31532, 37261, 38988, 40441, 28381, 28711, 21331, + 21828, 23429, 25176, 25246, 25299, 27810, 28655, 29730, 35351, 37944, + 28609, 35582, 33592, 20967, 34552, 21482, 21481, 20294, 36948, 36784, + 22890, 33073, 24061, 31466, 36799, 26842, 35895, 29432, 40008, 27197, + 35504, 20025, 21336, 22022, 22374, 25285, 25506, 26086, 27470, 28129, + 28251, 28845, 30701, 31471, 31658, 32187, 32829, 32966, 34507, 35477, + 37723, 22243, 22727, 24382, 26029, 26262, 27264, 27573, 30007, 35527, + 20516, 30693, 22320, 24347, 24677, 26234, 27744, 30196, 31258, 32622, + 33268, 34584, 36933, 39347, 31689, 30044, 31481, 31569, 33988, 36880, + 31209, 31378, 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, + 26172, 26609, 27880, 34411, 34935, 35387, 37198, 37619, 39376, 27159, + 28710, 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, + 24086, 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, + 26397, 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, + 35548, 36229, 36339, 37530, 38263, 38914, 40165, 21189, 25431, 30452, + 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, 26894, 27084, + 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, 20291, 28460, + 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, 22775, 23340, + 32044, 29226, 21514, 37347, 40372, 20141, 20302, 20572, 20597, 21059, + 35998, 21576, 22564, 23450, 24093, 24213, 24237, 24311, 24351, 24716, + 25269, 25402, 25552, 26799, 27712, 30855, 31118, 31243, 32224, 33351, + 35330, 35558, 36420, 36883, 37048, 37165, 37336, 40718, 27877, 25688, + 25826, 25973, 28404, 30340, 31515, 36969, 37841, 28346, 21746, 24505, + 25764, 36685, 36845, 37444, 20856, 22635, 22825, 23637, 24215, 28155, + 32399, 29980, 36028, 36578, 39003, 28857, 20253, 27583, 28593, 30000, + 38651, 20814, 21520, 22581, 22615, 22956, 23648, 24466, 26007, 26460, + 28193, 30331, 33759, 36077, 36884, 37117, 37709, 30757, 30778, 21162, + 24230, 22303, 22900, 24594, 20498, 20826, 20908, 20941, 20992, 21776, + 22612, 22616, 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, + 26691, 26812, 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, + 30168, 31095, 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, + 34276, 35342, 35588, 35910, 36367, 36867, 36879, 37913, 38518, 38957, + 39472, 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, + 30643, 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, + 24499, 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, + 27233, 20984, 31361, 26932, 23626, 40182, 33515, 23493, 37193, 28702, + 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, + 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, + 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, + 20108, 23612, 24336, 36841, 21250, 36049, 32905, 34425, 24319, 26085, + 20083, 20837, 22914, 23615, 38894, 20219, 22922, 24525, 35469, 28641, + 31152, 31074, 23527, 33905, 29483, 29105, 24180, 24565, 25467, 25754, + 29123, 31896, 20035, 24316, 20043, 22492, 22178, 24745, 28611, 32013, + 33021, 33075, 33215, 36786, 35223, 34468, 24052, 25226, 25773, 35207, + 26487, 27874, 27966, 29750, 30772, 23110, 32629, 33453, 39340, 20467, + 24259, 25309, 25490, 25943, 26479, 30403, 29260, 32972, 32954, 36649, + 37197, 20493, 22521, 23186, 26757, 26995, 29028, 29437, 36023, 22770, + 36064, 38506, 36889, 34687, 31204, 30695, 33833, 20271, 21093, 21338, + 25293, 26575, 27850, 30333, 31636, 31893, 33334, 34180, 36843, 26333, + 28448, 29190, 32283, 33707, 39361, 40614, 20989, 31665, 30834, 31672, + 32903, 31560, 27368, 24161, 32908, 30033, 30048, 20843, 37474, 28300, + 30330, 37271, 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, + 22617, 34532, 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, + 26001, 26495, 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, + 34281, 36009, 31684, 37318, 29033, 38930, 39151, 25405, 26217, 30058, + 30436, 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, + 24754, 25161, 25209, 25259, 26000, 27604, 27852, 30130, 30382, 30865, + 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, 38750, 39131, + 27147, 31800, 20633, 23614, 24494, 26503, 27608, 29749, 30473, 32654, + 40763, 26570, 31255, 21305, 30091, 39661, 24422, 33181, 33777, 32920, + 24380, 24517, 30050, 31558, 36924, 26727, 23019, 23195, 32016, 30334, + 35628, 20469, 24426, 27161, 27703, 28418, 29922, 31080, 34920, 35413, + 35961, 24287, 25551, 30149, 31186, 33495, 37672, 37618, 33948, 34541, + 39981, 21697, 24428, 25996, 27996, 28693, 36007, 36051, 38971, 25935, + 29942, 19981, 20184, 22496, 22827, 23142, 23500, 20904, 24067, 24220, + 24598, 25206, 25975, 26023, 26222, 28014, 29238, 31526, 33104, 33178, + 33433, 35676, 36000, 36070, 36212, 38428, 38468, 20398, 25771, 27494, + 33310, 33889, 34154, 37096, 23553, 26963, 39080, 33914, 34135, 20239, + 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, + 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, + 25198, 28954, 22894, 31881, 31966, 32027, 38640, 25991, 32862, 19993, + 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, 38281, + 38491, 31859, 38913, 20731, 22721, 30294, 30887, 21029, 30629, 34065, + 31622, 20559, 22793, 29255, 31687, 32232, 36794, 36820, 36941, 20415, + 21193, 23081, 24321, 38829, 20445, 33303, 37610, 22275, 25429, 27497, + 29995, 35036, 36628, 31298, 21215, 22675, 24917, 25098, 26286, 27597, + 31807, 33769, 20515, 20472, 21253, 21574, 22577, 22857, 23453, 23792, + 23791, 23849, 24214, 25265, 25447, 25918, 26041, 26379, 27861, 27873, + 28921, 30770, 32299, 32990, 33459, 33804, 34028, 34562, 35090, 35370, + 35914, 37030, 37586, 39165, 40179, 40300, 20047, 20129, 20621, 21078, + 22346, 22952, 24125, 24536, 24537, 25151, 26292, 26395, 26576, 26834, + 20882, 32033, 32938, 33192, 35584, 35980, 36031, 37502, 38450, 21536, + 38956, 21271, 20693, 21340, 22696, 25778, 26420, 29287, 30566, 31302, + 37350, 21187, 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, + 30406, 25705, 30952, 39764, 40635, 22475, 22969, 26151, 26522, 27598, + 21737, 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, + 20451, 21448, 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, + 24930, 28288, 28459, 34067, 21619, 26410, 39749, 24051, 31637, 23724, + 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, 27665, 30496, + 21209, 22818, 28961, 29279, 30683, 38695, 40289, 26891, 23167, 23064, + 20901, 21517, 21629, 26126, 30431, 36855, 37528, 40180, 23018, 29277, + 28357, 20813, 26825, 32191, 32236, 38754, 40634, 25720, 27169, 33538, + 22916, 23391, 27611, 29467, 30450, 32178, 32791, 33945, 20786, 26408, + 40665, 30446, 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, + 24758, 32011, 38272, 21249, 20063, 20918, 22812, 29242, 32822, 37326, + 24357, 30690, 21380, 24441, 32004, 34220, 35379, 36493, 38742, 26611, + 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, 21807, 20305, + 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, 26377, 26586, + 28263, 28044, 29494, 29495, 30001, 31056, 35029, 35480, 36938, 37009, + 37109, 38596, 34701, 22805, 20104, 20313, 19982, 35465, 36671, 38928, + 20653, 24188, 22934, 23481, 24248, 25562, 25594, 25793, 26332, 26954, + 27096, 27915, 28342, 29076, 29992, 31407, 32650, 32768, 33865, 33993, + 35201, 35617, 36362, 36965, 38525, 39178, 24958, 25233, 27442, 27779, + 28020, 32716, 32764, 28096, 32645, 34746, 35064, 26469, 33713, 38972, + 38647, 27931, 32097, 33853, 37226, 20081, 21365, 23888, 27396, 28651, + 34253, 34349, 35239, 21033, 21519, 23653, 26446, 26792, 29702, 29827, + 30178, 35023, 35041, 37324, 38626, 38520, 24459, 29575, 31435, 33870, + 25504, 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, + 31452, 40845, 20406, 24942, 26053, 34396, 20102, 20142, 20698, 20001, + 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, 31260, 31975, + 33391, 35538, 36988, 37327, 38517, 38936, 21147, 32209, 20523, 21400, + 26519, 28107, 29136, 29747, 33256, 36650, 38563, 40023, 40607, 29792, + 22593, 28057, 32047, 39006, 20196, 20278, 20363, 20919, 21169, 23994, + 24604, 29618, 31036, 33491, 37428, 38583, 38646, 38666, 40599, 40802, + 26278, 27508, 21015, 21155, 28872, 35010, 24265, 24651, 24976, 28451, + 29001, 31806, 32244, 32879, 34030, 36899, 37676, 21570, 39791, 27347, + 28809, 36034, 36335, 38706, 21172, 23105, 24266, 24324, 26391, 27004, + 27028, 28010, 28431, 29282, 29436, 31725, 32769, 32894, 34635, 37070, + 20845, 40595, 31108, 32907, 37682, 35542, 20525, 21644, 35441, 27498, + 36036, 33031, 24785, 26528, 40434, 20121, 20120, 39952, 35435, 34241, + 34152, 26880, 28286, 30871, 33109, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24332, 19984, + 19989, 20010, 20017, 20022, 20028, 20031, 20034, 20054, 20056, 20098, + 20101, 35947, 20106, 33298, 24333, 20110, 20126, 20127, 20128, 20130, + 20144, 20147, 20150, 20174, 20173, 20164, 20166, 20162, 20183, 20190, + 20205, 20191, 20215, 20233, 20314, 20272, 20315, 20317, 20311, 20295, + 20342, 20360, 20367, 20376, 20347, 20329, 20336, 20369, 20335, 20358, + 20374, 20760, 20436, 20447, 20430, 20440, 20443, 20433, 20442, 20432, + 20452, 20453, 20506, 20520, 20500, 20522, 20517, 20485, 20252, 20470, + 20513, 20521, 20524, 20478, 20463, 20497, 20486, 20547, 20551, 26371, + 20565, 20560, 20552, 20570, 20566, 20588, 20600, 20608, 20634, 20613, + 20660, 20658, 20681, 20682, 20659, 20674, 20694, 20702, 20709, 20717, + 20707, 20718, 20729, 20725, 20745, 20737, 20738, 20758, 20757, 20756, + 20762, 20769, 20794, 20791, 20796, 20795, 20799, 20800, 20818, 20812, + 20820, 20834, 31480, 20841, 20842, 20846, 20864, 20866, 22232, 20876, + 20873, 20879, 20881, 20883, 20885, 20886, 20900, 20902, 20898, 20905, + 20906, 20907, 20915, 20913, 20914, 20912, 20917, 20925, 20933, 20937, + 20955, 20960, 34389, 20969, 20973, 20976, 20981, 20990, 20996, 21003, + 21012, 21006, 21031, 21034, 21038, 21043, 21049, 21071, 21060, 21067, + 21068, 21086, 21076, 21098, 21108, 21097, 21107, 21119, 21117, 21133, + 21140, 21138, 21105, 21128, 21137, 36776, 36775, 21164, 21165, 21180, + 21173, 21185, 21197, 21207, 21214, 21219, 21222, 39149, 21216, 21235, + 21237, 21240, 21241, 21254, 21256, 30008, 21261, 21264, 21263, 21269, + 21274, 21283, 21295, 21297, 21299, 21304, 21312, 21318, 21317, 19991, + 21321, 21325, 20950, 21342, 21353, 21358, 22808, 21371, 21367, 21378, + 21398, 21408, 21414, 21413, 21422, 21424, 21430, 21443, 31762, 38617, + 21471, 26364, 29166, 21486, 21480, 21485, 21498, 21505, 21565, 21568, + 21548, 21549, 21564, 21550, 21558, 21545, 21533, 21582, 21647, 21621, + 21646, 21599, 21617, 21623, 21616, 21650, 21627, 21632, 21622, 21636, + 21648, 21638, 21703, 21666, 21688, 21669, 21676, 21700, 21704, 21672, + 21675, 21698, 21668, 21694, 21692, 21720, 21733, 21734, 21775, 21780, + 21757, 21742, 21741, 21754, 21730, 21817, 21824, 21859, 21836, 21806, + 21852, 21829, 21846, 21847, 21816, 21811, 21853, 21913, 21888, 21679, + 21898, 21919, 21883, 21886, 21912, 21918, 21934, 21884, 21891, 21929, + 21895, 21928, 21978, 21957, 21983, 21956, 21980, 21988, 21972, 22036, + 22007, 22038, 22014, 22013, 22043, 22009, 22094, 22096, 29151, 22068, + 22070, 22066, 22072, 22123, 22116, 22063, 22124, 22122, 22150, 22144, + 22154, 22176, 22164, 22159, 22181, 22190, 22198, 22196, 22210, 22204, + 22209, 22211, 22208, 22216, 22222, 22225, 22227, 22231, 22254, 22265, + 22272, 22271, 22276, 22281, 22280, 22283, 22285, 22291, 22296, 22294, + 21959, 22300, 22310, 22327, 22328, 22350, 22331, 22336, 22351, 22377, + 22464, 22408, 22369, 22399, 22409, 22419, 22432, 22451, 22436, 22442, + 22448, 22467, 22470, 22484, 22482, 22483, 22538, 22486, 22499, 22539, + 22553, 22557, 22642, 22561, 22626, 22603, 22640, 27584, 22610, 22589, + 22649, 22661, 22713, 22687, 22699, 22714, 22750, 22715, 22712, 22702, + 22725, 22739, 22737, 22743, 22745, 22744, 22757, 22748, 22756, 22751, + 22767, 22778, 22777, 22779, 22780, 22781, 22786, 22794, 22800, 22811, + 26790, 22821, 22828, 22829, 22834, 22840, 22846, 31442, 22869, 22864, + 22862, 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, + 22941, 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, 23001, + 23002, 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, + 23093, 23094, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, + 23267, 23255, 23270, 23273, 23254, 23290, 23291, 23308, 23307, 23318, + 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, + 23386, 23387, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, + 23424, 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, 23524, + 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, 23559, + 23560, 23565, 23571, 23584, 23586, 23592, 23608, 23609, 23617, 23622, + 23630, 23635, 23632, 23631, 23409, 23660, 23662, 20066, 23670, 23673, + 23692, 23697, 23700, 22939, 23723, 23739, 23734, 23740, 23735, 23749, + 23742, 23751, 23769, 23785, 23805, 23802, 23789, 23948, 23786, 23819, + 23829, 23831, 23900, 23839, 23835, 23825, 23828, 23842, 23834, 23833, + 23832, 23884, 23890, 23886, 23883, 23916, 23923, 23926, 23943, 23940, + 23938, 23970, 23965, 23980, 23982, 23997, 23952, 23991, 23996, 24009, + 24013, 24019, 24018, 24022, 24027, 24043, 24050, 24053, 24075, 24090, + 24089, 24081, 24091, 24118, 24119, 24132, 24131, 24128, 24142, 24151, + 24148, 24159, 24162, 24164, 24135, 24181, 24182, 24186, 40636, 24191, + 24224, 24257, 24258, 24264, 24272, 24271, 24278, 24291, 24285, 24282, + 24283, 24290, 24289, 24296, 24297, 24300, 24305, 24307, 24304, 24308, + 24312, 24318, 24323, 24329, 24413, 24412, 24331, 24337, 24342, 24361, + 24365, 24376, 24385, 24392, 24396, 24398, 24367, 24401, 24406, 24407, + 24409, 24417, 24429, 24435, 24439, 24451, 24450, 24447, 24458, 24456, + 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, 24534, + 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, 24601, + 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, 24634, + 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, 24643, + 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, 24730, + 24708, 24731, 24726, 24727, 24722, 24743, 24715, 24801, 24760, 24800, + 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, 24838, + 24822, 24823, 24832, 24820, 24826, 24835, 24865, 24827, 24817, 24845, + 24846, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, 24884, + 24893, 24898, 24900, 24947, 24951, 24920, 24921, 24922, 24939, 24948, + 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, + 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, + 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, + 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, 25096, 25097, + 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, 25138, + 25139, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, 25218, + 25225, 25214, 25234, 25235, 25238, 25300, 25219, 25236, 25303, 25297, + 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, 25282, + 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, 25327, + 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, 25515, + 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, 25577, + 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, 25606, + 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, 25718, + 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, 25810, + 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, 25824, 25825, + 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, 25856, 25853, + 25880, 25884, 25861, 25892, 25891, 25899, 25908, 25909, 25911, 25910, + 25912, 30027, 25928, 25942, 25941, 25933, 25944, 25950, 25949, 25970, + 25976, 25986, 25987, 35722, 26011, 26015, 26027, 26039, 26051, 26054, + 26049, 26052, 26060, 26066, 26075, 26073, 26080, 26081, 26097, 26482, + 26122, 26115, 26107, 26483, 26165, 26166, 26164, 26140, 26191, 26180, + 26185, 26177, 26206, 26205, 26212, 26215, 26216, 26207, 26210, 26224, + 26243, 26248, 26254, 26249, 26244, 26264, 26269, 26305, 26297, 26313, + 26302, 26300, 26308, 26296, 26326, 26330, 26336, 26175, 26342, 26345, + 26352, 26357, 26359, 26383, 26390, 26398, 26406, 26407, 38712, 26414, + 26431, 26422, 26433, 26424, 26423, 26438, 26462, 26464, 26457, 26467, + 26468, 26505, 26480, 26537, 26492, 26474, 26508, 26507, 26534, 26529, + 26501, 26551, 26607, 26548, 26604, 26547, 26601, 26552, 26596, 26590, + 26589, 26594, 26606, 26553, 26574, 26566, 26599, 27292, 26654, 26694, + 26665, 26688, 26701, 26674, 26702, 26803, 26667, 26713, 26723, 26743, + 26751, 26783, 26767, 26797, 26772, 26781, 26779, 26755, 27310, 26809, + 26740, 26805, 26784, 26810, 26895, 26765, 26750, 26881, 26826, 26888, + 26840, 26914, 26918, 26849, 26892, 26829, 26836, 26855, 26837, 26934, + 26898, 26884, 26839, 26851, 26917, 26873, 26848, 26863, 26920, 26922, + 26906, 26915, 26913, 26822, 27001, 26999, 26972, 27000, 26987, 26964, + 27006, 26990, 26937, 26996, 26941, 26969, 26928, 26977, 26974, 26973, + 27009, 26986, 27058, 27054, 27088, 27071, 27073, 27091, 27070, 27086, + 23528, 27082, 27101, 27067, 27075, 27047, 27182, 27025, 27040, 27036, + 27029, 27060, 27102, 27112, 27138, 27163, 27135, 27402, 27129, 27122, + 27111, 27141, 27057, 27166, 27117, 27156, 27115, 27146, 27154, 27329, + 27171, 27155, 27204, 27148, 27250, 27190, 27256, 27207, 27234, 27225, + 27238, 27208, 27192, 27170, 27280, 27277, 27296, 27268, 27298, 27299, + 27287, 34327, 27323, 27331, 27330, 27320, 27315, 27308, 27358, 27345, + 27359, 27306, 27354, 27370, 27387, 27397, 34326, 27386, 27410, 27414, + 39729, 27423, 27448, 27447, 30428, 27449, 39150, 27463, 27459, 27465, + 27472, 27481, 27476, 27483, 27487, 27489, 27512, 27513, 27519, 27520, + 27524, 27523, 27533, 27544, 27541, 27550, 27556, 27562, 27563, 27567, + 27570, 27569, 27571, 27575, 27580, 27590, 27595, 27603, 27615, 27628, + 27627, 27635, 27631, 40638, 27656, 27667, 27668, 27675, 27684, 27683, + 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, 27774, + 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, 27845, + 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, 27935, + 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, 27916, + 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, 28037, + 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, 28126, + 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, 28142, + 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, 28203, + 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, 28216, + 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, 28338, + 28372, 28373, 28303, 28325, 28354, 28319, 28481, 28433, 28748, 28396, + 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, 28435, + 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, 28525, + 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, 28577, + 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, 28657, + 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, 28699, + 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, 28771, + 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, 28875, + 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, 29030, + 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, 29100, + 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, 29159, + 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, 29228, + 29232, 29234, 29243, 29244, 29247, 29248, 29254, 29259, 29272, 29300, + 29310, 29314, 29313, 29319, 29330, 29334, 29346, 29351, 29369, 29362, + 29379, 29382, 29380, 29390, 29394, 29410, 29408, 29409, 29433, 29431, + 20495, 29463, 29450, 29468, 29462, 29469, 29492, 29487, 29481, 29477, + 29502, 29518, 29519, 40664, 29527, 29546, 29544, 29552, 29560, 29557, + 29563, 29562, 29640, 29619, 29646, 29627, 29632, 29669, 29678, 29662, + 29858, 29701, 29807, 29733, 29688, 29746, 29754, 29781, 29759, 29791, + 29785, 29761, 29788, 29801, 29808, 29795, 29802, 29814, 29822, 29835, + 29854, 29863, 29898, 29903, 29908, 29681, 29920, 29923, 29927, 29929, + 29934, 29938, 29936, 29937, 29944, 29943, 29956, 29955, 29957, 29964, + 29966, 29965, 29973, 29971, 29982, 29990, 29996, 30012, 30020, 30029, + 30026, 30025, 30043, 30022, 30042, 30057, 30052, 30055, 30059, 30061, + 30072, 30070, 30086, 30087, 30068, 30090, 30089, 30082, 30100, 30106, + 30109, 30117, 30115, 30146, 30131, 30147, 30133, 30141, 30136, 30140, + 30129, 30157, 30154, 30162, 30169, 30179, 30174, 30206, 30207, 30204, + 30209, 30192, 30202, 30194, 30195, 30219, 30221, 30217, 30239, 30247, + 30240, 30241, 30242, 30244, 30260, 30256, 30267, 30279, 30280, 30278, + 30300, 30296, 30305, 30306, 30312, 30313, 30314, 30311, 30316, 30320, + 30322, 30326, 30328, 30332, 30336, 30339, 30344, 30347, 30350, 30358, + 30355, 30361, 30362, 30384, 30388, 30392, 30393, 30394, 30402, 30413, + 30422, 30418, 30430, 30433, 30437, 30439, 30442, 34351, 30459, 30472, + 30471, 30468, 30505, 30500, 30494, 30501, 30502, 30491, 30519, 30520, + 30535, 30554, 30568, 30571, 30555, 30565, 30591, 30590, 30585, 30606, + 30603, 30609, 30624, 30622, 30640, 30646, 30649, 30655, 30652, 30653, + 30651, 30663, 30669, 30679, 30682, 30684, 30691, 30702, 30716, 30732, + 30738, 31014, 30752, 31018, 30789, 30862, 30836, 30854, 30844, 30874, + 30860, 30883, 30901, 30890, 30895, 30929, 30918, 30923, 30932, 30910, + 30908, 30917, 30922, 30956, 30951, 30938, 30973, 30964, 30983, 30994, + 30993, 31001, 31020, 31019, 31040, 31072, 31063, 31071, 31066, 31061, + 31059, 31098, 31103, 31114, 31133, 31143, 40779, 31146, 31150, 31155, + 31161, 31162, 31177, 31189, 31207, 31212, 31201, 31203, 31240, 31245, + 31256, 31257, 31264, 31263, 31104, 31281, 31291, 31294, 31287, 31299, + 31319, 31305, 31329, 31330, 31337, 40861, 31344, 31353, 31357, 31368, + 31383, 31381, 31384, 31382, 31401, 31432, 31408, 31414, 31429, 31428, + 31423, 36995, 31431, 31434, 31437, 31439, 31445, 31443, 31449, 31450, + 31453, 31457, 31458, 31462, 31469, 31472, 31490, 31503, 31498, 31494, + 31539, 31512, 31513, 31518, 31541, 31528, 31542, 31568, 31610, 31492, + 31565, 31499, 31564, 31557, 31605, 31589, 31604, 31591, 31600, 31601, + 31596, 31598, 31645, 31640, 31647, 31629, 31644, 31642, 31627, 31634, + 31631, 31581, 31641, 31691, 31681, 31692, 31695, 31668, 31686, 31709, + 31721, 31761, 31764, 31718, 31717, 31840, 31744, 31751, 31763, 31731, + 31735, 31767, 31757, 31734, 31779, 31783, 31786, 31775, 31799, 31787, + 31805, 31820, 31811, 31828, 31823, 31808, 31824, 31832, 31839, 31844, + 31830, 31845, 31852, 31861, 31875, 31888, 31908, 31917, 31906, 31915, + 31905, 31912, 31923, 31922, 31921, 31918, 31929, 31933, 31936, 31941, + 31938, 31960, 31954, 31964, 31970, 39739, 31983, 31986, 31988, 31990, + 31994, 32006, 32002, 32028, 32021, 32010, 32069, 32075, 32046, 32050, + 32063, 32053, 32070, 32115, 32086, 32078, 32114, 32104, 32110, 32079, + 32099, 32147, 32137, 32091, 32143, 32125, 32155, 32186, 32174, 32163, + 32181, 32199, 32189, 32171, 32317, 32162, 32175, 32220, 32184, 32159, + 32176, 32216, 32221, 32228, 32222, 32251, 32242, 32225, 32261, 32266, + 32291, 32289, 32274, 32305, 32287, 32265, 32267, 32290, 32326, 32358, + 32315, 32309, 32313, 32323, 32311, 32306, 32314, 32359, 32349, 32342, + 32350, 32345, 32346, 32377, 32362, 32361, 32380, 32379, 32387, 32213, + 32381, 36782, 32383, 32392, 32393, 32396, 32402, 32400, 32403, 32404, + 32406, 32398, 32411, 32412, 32568, 32570, 32581, 32588, 32589, 32590, + 32592, 32593, 32597, 32596, 32600, 32607, 32608, 32616, 32617, 32615, + 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, 32669, + 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, 32709, + 32710, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, 39132, + 32774, 32772, 32779, 32786, 32792, 32793, 32796, 32801, 32808, 32831, + 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, 32872, 32883, + 32882, 32880, 32886, 32889, 32893, 32895, 32900, 32902, 32901, 32923, + 32915, 32922, 32941, 20880, 32940, 32987, 32997, 32985, 32989, 32964, + 32986, 32982, 33033, 33007, 33009, 33051, 33065, 33059, 33071, 33099, + 38539, 33094, 33086, 33107, 33105, 33020, 33137, 33134, 33125, 33126, + 33140, 33155, 33160, 33162, 33152, 33154, 33184, 33173, 33188, 33187, + 33119, 33171, 33193, 33200, 33205, 33214, 33208, 33213, 33216, 33218, + 33210, 33225, 33229, 33233, 33241, 33240, 33224, 33242, 33247, 33248, + 33255, 33274, 33275, 33278, 33281, 33282, 33285, 33287, 33290, 33293, + 33296, 33302, 33321, 33323, 33336, 33331, 33344, 33369, 33368, 33373, + 33370, 33375, 33380, 33378, 33384, 33386, 33387, 33326, 33393, 33399, + 33400, 33406, 33421, 33426, 33451, 33439, 33467, 33452, 33505, 33507, + 33503, 33490, 33524, 33523, 33530, 33683, 33539, 33531, 33529, 33502, + 33542, 33500, 33545, 33497, 33589, 33588, 33558, 33586, 33585, 33600, + 33593, 33616, 33605, 33583, 33579, 33559, 33560, 33669, 33690, 33706, + 33695, 33698, 33686, 33571, 33678, 33671, 33674, 33660, 33717, 33651, + 33653, 33696, 33673, 33704, 33780, 33811, 33771, 33742, 33789, 33795, + 33752, 33803, 33729, 33783, 33799, 33760, 33778, 33805, 33826, 33824, + 33725, 33848, 34054, 33787, 33901, 33834, 33852, 34138, 33924, 33911, + 33899, 33965, 33902, 33922, 33897, 33862, 33836, 33903, 33913, 33845, + 33994, 33890, 33977, 33983, 33951, 34009, 33997, 33979, 34010, 34000, + 33985, 33990, 34006, 33953, 34081, 34047, 34036, 34071, 34072, 34092, + 34079, 34069, 34068, 34044, 34112, 34147, 34136, 34120, 34113, 34306, + 34123, 34133, 34176, 34212, 34184, 34193, 34186, 34216, 34157, 34196, + 34203, 34282, 34183, 34204, 34167, 34174, 34192, 34249, 34234, 34255, + 34233, 34256, 34261, 34269, 34277, 34268, 34297, 34314, 34323, 34315, + 34302, 34298, 34310, 34338, 34330, 34352, 34367, 34381, 20053, 34388, + 34399, 34407, 34417, 34451, 34467, 34473, 34474, 34443, 34444, 34486, + 34479, 34500, 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, + 34540, 34527, 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, + 34577, 34569, 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, + 34601, 34586, 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, + 34670, 34649, 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, + 34763, 34749, 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, + 34747, 34799, 34802, 34784, 34831, 34829, 34814, 34806, 34807, 34830, + 34770, 34833, 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, + 34875, 34884, 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, + 34974, 34933, 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, + 34978, 34957, 34980, 34992, 35007, 34993, 35011, 35012, 35028, 35032, + 35033, 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, + 35082, 35091, 35139, 35102, 35109, 35114, 35115, 35137, 35140, 35131, + 35126, 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, + 35183, 35188, 35191, 35198, 35203, 35208, 35210, 35219, 35224, 35233, + 35241, 35238, 35244, 35247, 35250, 35258, 35261, 35263, 35264, 35290, + 35292, 35293, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, + 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, + 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, 35493, 35494, + 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, + 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, + 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, + 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, + 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, 35730, 35731, + 35734, 35737, 35738, 35898, 35905, 35903, 35912, 35916, 35918, 35920, + 35925, 35938, 35948, 35960, 35962, 35970, 35977, 35973, 35978, 35981, + 35982, 35988, 35964, 35992, 25117, 36013, 36010, 36029, 36018, 36019, + 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, 36090, 36091, + 36100, 36101, 36106, 36103, 36111, 36109, 36112, 40782, 36115, 36045, + 36116, 36118, 36199, 36205, 36209, 36211, 36225, 36249, 36290, 36286, + 36282, 36303, 36314, 36310, 36300, 36315, 36299, 36330, 36331, 36319, + 36323, 36348, 36360, 36361, 36351, 36381, 36382, 36368, 36383, 36418, + 36405, 36400, 36404, 36426, 36423, 36425, 36428, 36432, 36424, 36441, + 36452, 36448, 36394, 36451, 36437, 36470, 36466, 36476, 36481, 36487, + 36485, 36484, 36491, 36490, 36499, 36497, 36500, 36505, 36522, 36513, + 36524, 36528, 36550, 36529, 36542, 36549, 36552, 36555, 36571, 36579, + 36604, 36603, 36587, 36606, 36618, 36613, 36629, 36626, 36633, 36627, + 36636, 36639, 36635, 36620, 36646, 36659, 36667, 36665, 36677, 36674, + 36670, 36684, 36681, 36678, 36686, 36695, 36700, 36706, 36707, 36708, + 36764, 36767, 36771, 36781, 36783, 36791, 36826, 36837, 36834, 36842, + 36847, 36999, 36852, 36869, 36857, 36858, 36881, 36885, 36897, 36877, + 36894, 36886, 36875, 36903, 36918, 36917, 36921, 36856, 36943, 36944, + 36945, 36946, 36878, 36937, 36926, 36950, 36952, 36958, 36968, 36975, + 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, 37001, 37007, + 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, 37122, 37138, + 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, 37225, 37235, + 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, 37301, 37300, + 37306, 37312, 37313, 37321, 37323, 37328, 37334, 37343, 37345, 37339, + 37372, 37365, 37366, 37406, 37375, 37396, 37420, 37397, 37393, 37470, + 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, 37456, 37532, + 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, 37647, 37626, + 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, 37691, 37724, + 37728, 37756, 37742, 37718, 37808, 37804, 37805, 37780, 37817, 37846, + 37847, 37864, 37861, 37848, 37827, 37853, 37840, 37832, 37860, 37914, + 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, 37921, 37946, + 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, 37417, 38000, + 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, 38274, 38279, + 38282, 38292, 38294, 38296, 38297, 38304, 38312, 38311, 38317, 38332, + 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, 38357, 38356, + 38358, 38364, 38369, 38373, 38370, 38433, 38440, 38446, 38447, 38466, + 38476, 38479, 38475, 38519, 38492, 38494, 38493, 38495, 38502, 38514, + 38508, 38541, 38552, 38549, 38551, 38570, 38567, 38577, 38578, 38576, + 38580, 38582, 38584, 38585, 38606, 38603, 38601, 38605, 35149, 38620, + 38669, 38613, 38649, 38660, 38662, 38664, 38675, 38670, 38673, 38671, + 38678, 38681, 38692, 38698, 38704, 38713, 38717, 38718, 38724, 38726, + 38728, 38722, 38729, 38748, 38752, 38756, 38758, 38760, 21202, 38763, + 38769, 38777, 38789, 38780, 38785, 38778, 38790, 38795, 38799, 38800, + 38812, 38824, 38822, 38819, 38835, 38836, 38851, 38854, 38856, 38859, + 38876, 38893, 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, + 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, 39023, 39024, + 39025, 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, + 39145, 39147, 39171, 39177, 39186, 39188, 39192, 39201, 39197, 39198, + 39204, 39200, 39212, 39214, 39229, 39230, 39234, 39241, 39237, 39248, + 39243, 39249, 39250, 39244, 39253, 39319, 39320, 39333, 39341, 39342, + 39356, 39391, 39387, 39389, 39384, 39377, 39405, 39406, 39409, 39410, + 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, 39479, 39493, + 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, 39519, 39522, + 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, 39616, 39631, + 39633, 39635, 39636, 39646, 39647, 39650, 39651, 39654, 39663, 39659, + 39662, 39668, 39665, 39671, 39675, 39686, 39704, 39706, 39711, 39714, + 39715, 39717, 39719, 39720, 39721, 39722, 39726, 39727, 39730, 39748, + 39747, 39759, 39757, 39758, 39761, 39768, 39796, 39827, 39811, 39825, + 39830, 39831, 39839, 39840, 39848, 39860, 39872, 39882, 39865, 39878, + 39887, 39889, 39890, 39907, 39906, 39908, 39892, 39905, 39994, 39922, + 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, 39954, + 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, 39986, + 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, 40176, + 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, 40223, + 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, 40285, 40286, + 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, 40303, 40314, + 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, 40378, 40390, + 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, 40445, 40474, + 40475, 40478, 40565, 40569, 40573, 40577, 40584, 40587, 40588, 40594, + 40597, 40593, 40605, 40613, 40617, 40632, 40618, 40621, 38753, 40652, + 40654, 40655, 40656, 40660, 40668, 40670, 40669, 40672, 40677, 40680, + 40687, 40692, 40694, 40695, 40697, 40699, 40700, 40701, 40711, 40712, + 30391, 40725, 40737, 40748, 40766, 40778, 40786, 40788, 40803, 40799, + 40800, 40801, 40806, 40807, 40812, 40810, 40823, 40818, 40822, 40853, + 40860, 40864, 22575, 27079, 36953, 29796, 20956, 29081, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 32394, 35100, 37704, 37512, 34012, 20425, 28859, 26161, + 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, 20227, 20281, + 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, 20479, 20510, + 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, 20893, 20926, + 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, 21284, 21362, + 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, 21894, 22361, + 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, 22795, 22867, + 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, 23512, 23532, + 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, 23917, 23992, + 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, 24709, 24714, + 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, 25107, 25254, + 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, 26121, 26158, + 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, 26290, + 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, 26625, 26692, + 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, + 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, + 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, + 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, + 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, 29182, 29361, + 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, + 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, 29953, 30063, + 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, + 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, 31131, 31441, + 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, 32160, 32214, + 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, 33782, 33864, + 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, 34823, 35061, + 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, 35667, 35711, + 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, 36967, 37086, + 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, 37348, 37349, + 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, 37457, 37433, + 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, 64039, 37589, + 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, 37661, 37634, + 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, 37960, 38290, + 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, 38735, 38737, + 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, 39502, 39641, + 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, 40299, 64045, + 40473, 40657, 0x0000, 0x0000, 8560, 8561, 8562, 8563, 8564, 8565, + 8566, 8567, 8568, 8569, 65506, 65508, 65287, 65282, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 65506, 65508, 65287, 65282, + 12849, 8470, 8481, 8757, 32394, 35100, 37704, 37512, 34012, 20425, + 28859, 26161, 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, + 20227, 20281, 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, + 20479, 20510, 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, + 20893, 20926, 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, + 21284, 21362, 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, + 21894, 22361, 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, + 22795, 22867, 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, + 23512, 23532, 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, + 23917, 23992, 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, + 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, + 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, + 26121, 26158, 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, + 26272, 26290, 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, + 26625, 26692, 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, + 27206, 27251, 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, + 27866, 27908, 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, + 28217, 28252, 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, + 28712, 28805, 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, + 29182, 29361, 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, + 29650, 29703, 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, + 29953, 30063, 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, + 30753, 30798, 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, + 31131, 31441, 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, + 32160, 32214, 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, + 33782, 33864, 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, + 34823, 35061, 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, + 35667, 35711, 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, + 36967, 37086, 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, + 37348, 37349, 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, + 37457, 37433, 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, + 64039, 37589, 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, + 37661, 37634, 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, + 37960, 38290, 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, + 38735, 38737, 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, + 39502, 39641, 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, + 40299, 64045, 40473, 40657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myencoding_map_jis0212[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 728, 711, + 184, 729, 733, 175, 731, 730, 65374, 900, 901, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 161, 166, 191, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 186, 170, + 169, 174, 8482, 164, 8470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 902, 904, 905, 906, 938, 0x0000, + 908, 0x0000, 910, 939, 0x0000, 911, 0x0000, 0x0000, 0x0000, 0x0000, + 940, 941, 942, 943, 970, 912, 972, 962, 973, 971, + 944, 974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1026, 1027, 1028, + 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, 1039, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1106, 1107, 1108, 1109, 1110, + 1111, 1112, 1113, 1114, 1115, 1116, 1118, 1119, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 198, 272, 0x0000, 294, 0x0000, 306, 0x0000, 321, + 319, 0x0000, 330, 216, 338, 0x0000, 358, 222, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 230, 273, 240, 295, 305, 307, + 312, 322, 320, 329, 331, 248, 339, 223, 359, 254, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 193, 192, 196, 194, + 258, 461, 256, 260, 197, 195, 262, 264, 268, 199, + 266, 270, 201, 200, 203, 202, 282, 278, 274, 280, + 0x0000, 284, 286, 290, 288, 292, 205, 204, 207, 206, + 463, 304, 298, 302, 296, 308, 310, 313, 317, 315, + 323, 327, 325, 209, 211, 210, 214, 212, 465, 336, + 332, 213, 340, 344, 342, 346, 348, 352, 350, 356, + 354, 218, 217, 220, 219, 364, 467, 368, 362, 370, + 366, 360, 471, 475, 473, 469, 372, 221, 376, 374, + 377, 381, 379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 225, 224, 228, 226, 259, 462, 257, 261, 229, 227, + 263, 265, 269, 231, 267, 271, 233, 232, 235, 234, + 283, 279, 275, 281, 501, 285, 287, 0x0000, 289, 293, + 237, 236, 239, 238, 464, 0x0000, 299, 303, 297, 309, + 311, 314, 318, 316, 324, 328, 326, 241, 243, 242, + 246, 244, 466, 337, 333, 245, 341, 345, 343, 347, + 349, 353, 351, 357, 355, 250, 249, 252, 251, 365, + 468, 369, 363, 371, 367, 361, 472, 476, 474, 470, + 373, 253, 255, 375, 378, 382, 380, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 19970, 19972, 19973, 19980, 19986, 19999, 20003, 20004, 20008, 20011, + 20014, 20015, 20016, 20021, 20032, 20033, 20036, 20039, 20049, 20058, + 20060, 20067, 20072, 20073, 20084, 20085, 20089, 20095, 20109, 20118, + 20119, 20125, 20143, 20153, 20163, 20176, 20186, 20187, 20192, 20193, + 20194, 20200, 20207, 20209, 20211, 20213, 20221, 20222, 20223, 20224, + 20226, 20227, 20232, 20235, 20236, 20242, 20245, 20246, 20247, 20249, + 20270, 20273, 20320, 20275, 20277, 20279, 20281, 20283, 20286, 20288, + 20290, 20296, 20297, 20299, 20300, 20306, 20308, 20310, 20312, 20319, + 20323, 20330, 20332, 20334, 20337, 20343, 20344, 20345, 20346, 20349, + 20350, 20353, 20354, 20356, 20357, 20361, 20362, 20364, 20366, 20368, + 20370, 20371, 20372, 20375, 20377, 20378, 20382, 20383, 20402, 20407, + 20409, 20411, 20412, 20413, 20414, 20416, 20417, 20421, 20422, 20424, + 20425, 20427, 20428, 20429, 20431, 20434, 20444, 20448, 20450, 20464, + 20466, 20476, 20477, 20479, 20480, 20481, 20484, 20487, 20490, 20492, + 20494, 20496, 20499, 20503, 20504, 20507, 20508, 20509, 20510, 20514, + 20519, 20526, 20528, 20530, 20531, 20533, 20544, 20545, 20546, 20549, + 20550, 20554, 20556, 20558, 20561, 20562, 20563, 20567, 20569, 20575, + 20576, 20578, 20579, 20582, 20583, 20586, 20589, 20592, 20593, 20539, + 20609, 20611, 20612, 20614, 20618, 20622, 20623, 20624, 20626, 20627, + 20628, 20630, 20635, 20636, 20638, 20639, 20640, 20641, 20642, 20650, + 20655, 20656, 20665, 20666, 20669, 20672, 20675, 20676, 20679, 20684, + 20686, 20688, 20691, 20692, 20696, 20700, 20701, 20703, 20706, 20708, + 20710, 20712, 20713, 20719, 20721, 20726, 20730, 20734, 20739, 20742, + 20743, 20744, 20747, 20748, 20749, 20750, 20722, 20752, 20759, 20761, + 20763, 20764, 20765, 20766, 20771, 20775, 20776, 20780, 20781, 20783, + 20785, 20787, 20788, 20789, 20792, 20793, 20802, 20810, 20815, 20819, + 20821, 20823, 20824, 20831, 20836, 20838, 20862, 20867, 20868, 20875, + 20878, 20888, 20893, 20897, 20899, 20909, 20920, 20922, 20924, 20926, + 20927, 20930, 20936, 20943, 20945, 20946, 20947, 20949, 20952, 20958, + 20962, 20965, 20974, 20978, 20979, 20980, 20983, 20993, 20994, 20997, + 21010, 21011, 21013, 21014, 21016, 21026, 21032, 21041, 21042, 21045, + 21052, 21061, 21065, 21077, 21079, 21080, 21082, 21084, 21087, 21088, + 21089, 21094, 21102, 21111, 21112, 21113, 21120, 21122, 21125, 21130, + 21132, 21139, 21141, 21142, 21143, 21144, 21146, 21148, 21156, 21157, + 21158, 21159, 21167, 21168, 21174, 21175, 21176, 21178, 21179, 21181, + 21184, 21188, 21190, 21192, 21196, 21199, 21201, 21204, 21206, 21211, + 21212, 21217, 21221, 21224, 21225, 21226, 21228, 21232, 21233, 21236, + 21238, 21239, 21248, 21251, 21258, 21259, 21260, 21265, 21267, 21272, + 21275, 21276, 21278, 21279, 21285, 21287, 21288, 21289, 21291, 21292, + 21293, 21296, 21298, 21301, 21308, 21309, 21310, 21314, 21324, 21323, + 21337, 21339, 21345, 21347, 21349, 21356, 21357, 21362, 21369, 21374, + 21379, 21383, 21384, 21390, 21395, 21396, 21401, 21405, 21409, 21412, + 21418, 21419, 21423, 21426, 21428, 21429, 21431, 21432, 21434, 21437, + 21440, 21445, 21455, 21458, 21459, 21461, 21466, 21469, 21470, 21472, + 21478, 21479, 21493, 21506, 21523, 21530, 21537, 21543, 21544, 21546, + 21551, 21553, 21556, 21557, 21571, 21572, 21575, 21581, 21583, 21598, + 21602, 21604, 21606, 21607, 21609, 21611, 21613, 21614, 21620, 21631, + 21633, 21635, 21637, 21640, 21641, 21645, 21649, 21653, 21654, 21660, + 21663, 21665, 21670, 21671, 21673, 21674, 21677, 21678, 21681, 21687, + 21689, 21690, 21691, 21695, 21702, 21706, 21709, 21710, 21728, 21738, + 21740, 21743, 21750, 21756, 21758, 21759, 21760, 21761, 21765, 21768, + 21769, 21772, 21773, 21774, 21781, 21802, 21803, 21810, 21813, 21814, + 21819, 21820, 21821, 21825, 21831, 21833, 21834, 21837, 21840, 21841, + 21848, 21850, 21851, 21854, 21856, 21857, 21860, 21862, 21887, 21889, + 21890, 21894, 21896, 21902, 21903, 21905, 21906, 21907, 21908, 21911, + 21923, 21924, 21933, 21938, 21951, 21953, 21955, 21958, 21961, 21963, + 21964, 21966, 21969, 21970, 21971, 21975, 21976, 21979, 21982, 21986, + 21993, 22006, 22015, 22021, 22024, 22026, 22029, 22030, 22031, 22032, + 22033, 22034, 22041, 22060, 22064, 22067, 22069, 22071, 22073, 22075, + 22076, 22077, 22079, 22080, 22081, 22083, 22084, 22086, 22089, 22091, + 22093, 22095, 22100, 22110, 22112, 22113, 22114, 22115, 22118, 22121, + 22125, 22127, 22129, 22130, 22133, 22148, 22149, 22152, 22155, 22156, + 22165, 22169, 22170, 22173, 22174, 22175, 22182, 22183, 22184, 22185, + 22187, 22188, 22189, 22193, 22195, 22199, 22206, 22213, 22217, 22218, + 22219, 22223, 22224, 22220, 22221, 22233, 22236, 22237, 22239, 22241, + 22244, 22245, 22246, 22247, 22248, 22257, 22251, 22253, 22262, 22263, + 22273, 22274, 22279, 22282, 22284, 22289, 22293, 22298, 22299, 22301, + 22304, 22306, 22307, 22308, 22309, 22313, 22314, 22316, 22318, 22319, + 22323, 22324, 22333, 22334, 22335, 22341, 22342, 22348, 22349, 22354, + 22370, 22373, 22375, 22376, 22379, 22381, 22382, 22383, 22384, 22385, + 22387, 22388, 22389, 22391, 22393, 22394, 22395, 22396, 22398, 22401, + 22403, 22412, 22420, 22423, 22425, 22426, 22428, 22429, 22430, 22431, + 22433, 22421, 22439, 22440, 22441, 22444, 22456, 22461, 22471, 22472, + 22476, 22479, 22485, 22493, 22494, 22500, 22502, 22503, 22505, 22509, + 22512, 22517, 22518, 22520, 22525, 22526, 22527, 22531, 22532, 22536, + 22537, 22497, 22540, 22541, 22555, 22558, 22559, 22560, 22566, 22567, + 22573, 22578, 22585, 22591, 22601, 22604, 22605, 22607, 22608, 22613, + 22623, 22625, 22628, 22631, 22632, 22648, 22652, 22655, 22656, 22657, + 22663, 22664, 22665, 22666, 22668, 22669, 22671, 22672, 22676, 22678, + 22685, 22688, 22689, 22690, 22694, 22697, 22705, 22706, 22724, 22716, + 22722, 22728, 22733, 22734, 22736, 22738, 22740, 22742, 22746, 22749, + 22753, 22754, 22761, 22771, 22789, 22790, 22795, 22796, 22802, 22803, + 22804, 34369, 22813, 22817, 22819, 22820, 22824, 22831, 22832, 22835, + 22837, 22838, 22847, 22851, 22854, 22866, 22867, 22873, 22875, 22877, + 22878, 22879, 22881, 22883, 22891, 22893, 22895, 22898, 22901, 22902, + 22905, 22907, 22908, 22923, 22924, 22926, 22930, 22933, 22935, 22943, + 22948, 22951, 22957, 22958, 22959, 22960, 22963, 22967, 22970, 22972, + 22977, 22979, 22980, 22984, 22986, 22989, 22994, 23005, 23006, 23007, + 23011, 23012, 23015, 23022, 23023, 23025, 23026, 23028, 23031, 23040, + 23044, 23052, 23053, 23054, 23058, 23059, 23070, 23075, 23076, 23079, + 23080, 23082, 23085, 23088, 23108, 23109, 23111, 23112, 23116, 23120, + 23125, 23134, 23139, 23141, 23143, 23149, 23159, 23162, 23163, 23166, + 23179, 23184, 23187, 23190, 23193, 23196, 23198, 23199, 23200, 23202, + 23207, 23212, 23217, 23218, 23219, 23221, 23224, 23226, 23227, 23231, + 23236, 23238, 23240, 23247, 23258, 23260, 23264, 23269, 23274, 23278, + 23285, 23286, 23293, 23296, 23297, 23304, 23319, 23348, 23321, 23323, + 23325, 23329, 23333, 23341, 23352, 23361, 23371, 23372, 23378, 23382, + 23390, 23400, 23406, 23407, 23420, 23421, 23422, 23423, 23425, 23428, + 23430, 23434, 23438, 23440, 23441, 23443, 23444, 23446, 23464, 23465, + 23468, 23469, 23471, 23473, 23474, 23479, 23482, 23484, 23488, 23489, + 23501, 23503, 23510, 23511, 23512, 23513, 23514, 23520, 23535, 23537, + 23540, 23549, 23564, 23575, 23582, 23583, 23587, 23590, 23593, 23595, + 23596, 23598, 23600, 23602, 23605, 23606, 23641, 23642, 23644, 23650, + 23651, 23655, 23656, 23657, 23661, 23664, 23668, 23669, 23674, 23675, + 23676, 23677, 23687, 23688, 23690, 23695, 23698, 23709, 23711, 23712, + 23714, 23715, 23718, 23722, 23730, 23732, 23733, 23738, 23753, 23755, + 23762, 23773, 23767, 23790, 23793, 23794, 23796, 23809, 23814, 23821, + 23826, 23851, 23843, 23844, 23846, 23847, 23857, 23860, 23865, 23869, + 23871, 23874, 23875, 23878, 23880, 23893, 23889, 23897, 23882, 23903, + 23904, 23905, 23906, 23908, 23914, 23917, 23920, 23929, 23930, 23934, + 23935, 23937, 23939, 23944, 23946, 23954, 23955, 23956, 23957, 23961, + 23963, 23967, 23968, 23975, 23979, 23984, 23988, 23992, 23993, 24003, + 24007, 24011, 24016, 24014, 24024, 24025, 24032, 24036, 24041, 24056, + 24057, 24064, 24071, 24077, 24082, 24084, 24085, 24088, 24095, 24096, + 24110, 24104, 24114, 24117, 24126, 24139, 24144, 24137, 24145, 24150, + 24152, 24155, 24156, 24158, 24168, 24170, 24171, 24172, 24173, 24174, + 24176, 24192, 24203, 24206, 24226, 24228, 24229, 24232, 24234, 24236, + 24241, 24243, 24253, 24254, 24255, 24262, 24268, 24267, 24270, 24273, + 24274, 24276, 24277, 24284, 24286, 24293, 24299, 24322, 24326, 24327, + 24328, 24334, 24345, 24348, 24349, 24353, 24354, 24355, 24356, 24360, + 24363, 24364, 24366, 24368, 24372, 24374, 24379, 24381, 24383, 24384, + 24388, 24389, 24391, 24397, 24400, 24404, 24408, 24411, 24416, 24419, + 24420, 24423, 24431, 24434, 24436, 24437, 24440, 24442, 24445, 24446, + 24457, 24461, 24463, 24470, 24476, 24477, 24482, 24487, 24491, 24484, + 24492, 24495, 24496, 24497, 24504, 24516, 24519, 24520, 24521, 24523, + 24528, 24529, 24530, 24531, 24532, 24542, 24545, 24546, 24552, 24553, + 24554, 24556, 24557, 24558, 24559, 24562, 24563, 24566, 24570, 24572, + 24583, 24586, 24589, 24595, 24596, 24599, 24600, 24602, 24607, 24612, + 24621, 24627, 24629, 24640, 24647, 24648, 24649, 24652, 24657, 24660, + 24662, 24663, 24669, 24673, 24679, 24689, 24702, 24703, 24706, 24710, + 24712, 24714, 24718, 24721, 24723, 24725, 24728, 24733, 24734, 24738, + 24740, 24741, 24744, 24752, 24753, 24759, 24763, 24766, 24770, 24772, + 24776, 24777, 24778, 24779, 24782, 24783, 24788, 24789, 24793, 24795, + 24797, 24798, 24802, 24805, 24818, 24821, 24824, 24828, 24829, 24834, + 24839, 24842, 24844, 24848, 24849, 24850, 24851, 24852, 24854, 24855, + 24857, 24860, 24862, 24866, 24874, 24875, 24880, 24881, 24885, 24886, + 24887, 24889, 24897, 24901, 24902, 24905, 24926, 24928, 24940, 24946, + 24952, 24955, 24956, 24959, 24960, 24961, 24963, 24964, 24971, 24973, + 24978, 24979, 24983, 24984, 24988, 24989, 24991, 24992, 24997, 25000, + 25002, 25005, 25016, 25017, 25020, 25024, 25025, 25026, 25038, 25039, + 25045, 25052, 25053, 25054, 25055, 25057, 25058, 25063, 25065, 25061, + 25068, 25069, 25071, 25089, 25091, 25092, 25095, 25107, 25109, 25116, + 25120, 25122, 25123, 25127, 25129, 25131, 25145, 25149, 25154, 25155, + 25156, 25158, 25164, 25168, 25169, 25170, 25172, 25174, 25178, 25180, + 25188, 25197, 25199, 25203, 25210, 25213, 25229, 25230, 25231, 25232, + 25254, 25256, 25267, 25270, 25271, 25274, 25278, 25279, 25284, 25294, + 25301, 25302, 25306, 25322, 25330, 25332, 25340, 25341, 25347, 25348, + 25354, 25355, 25357, 25360, 25363, 25366, 25368, 25385, 25386, 25389, + 25397, 25398, 25401, 25404, 25409, 25410, 25411, 25412, 25414, 25418, + 25419, 25422, 25426, 25427, 25428, 25432, 25435, 25445, 25446, 25452, + 25453, 25457, 25460, 25461, 25464, 25468, 25469, 25471, 25474, 25476, + 25479, 25482, 25488, 25492, 25493, 25497, 25498, 25502, 25508, 25510, + 25517, 25518, 25519, 25533, 25537, 25541, 25544, 25550, 25553, 25555, + 25556, 25557, 25564, 25568, 25573, 25578, 25580, 25586, 25587, 25589, + 25592, 25593, 25609, 25610, 25616, 25618, 25620, 25624, 25630, 25632, + 25634, 25636, 25637, 25641, 25642, 25647, 25648, 25653, 25661, 25663, + 25675, 25679, 25681, 25682, 25683, 25684, 25690, 25691, 25692, 25693, + 25695, 25696, 25697, 25699, 25709, 25715, 25716, 25723, 25725, 25733, + 25735, 25743, 25744, 25745, 25752, 25753, 25755, 25757, 25759, 25761, + 25763, 25766, 25768, 25772, 25779, 25789, 25790, 25791, 25796, 25801, + 25802, 25803, 25804, 25806, 25808, 25809, 25813, 25815, 25828, 25829, + 25833, 25834, 25837, 25840, 25845, 25847, 25851, 25855, 25857, 25860, + 25864, 25865, 25866, 25871, 25875, 25876, 25878, 25881, 25883, 25886, + 25887, 25890, 25894, 25897, 25902, 25905, 25914, 25916, 25917, 25923, + 25927, 25929, 25936, 25938, 25940, 25951, 25952, 25959, 25963, 25978, + 25981, 25985, 25989, 25994, 26002, 26005, 26008, 26013, 26016, 26019, + 26022, 26030, 26034, 26035, 26036, 26047, 26050, 26056, 26057, 26062, + 26064, 26068, 26070, 26072, 26079, 26096, 26098, 26100, 26101, 26105, + 26110, 26111, 26112, 26116, 26120, 26121, 26125, 26129, 26130, 26133, + 26134, 26141, 26142, 26145, 26146, 26147, 26148, 26150, 26153, 26154, + 26155, 26156, 26158, 26160, 26161, 26163, 26169, 26167, 26176, 26181, + 26182, 26186, 26188, 26193, 26190, 26199, 26200, 26201, 26203, 26204, + 26208, 26209, 26363, 26218, 26219, 26220, 26238, 26227, 26229, 26239, + 26231, 26232, 26233, 26235, 26240, 26236, 26251, 26252, 26253, 26256, + 26258, 26265, 26266, 26267, 26268, 26271, 26272, 26276, 26285, 26289, + 26290, 26293, 26299, 26303, 26304, 26306, 26307, 26312, 26316, 26318, + 26319, 26324, 26331, 26335, 26344, 26347, 26348, 26350, 26362, 26373, + 26375, 26382, 26387, 26393, 26396, 26400, 26402, 26419, 26430, 26437, + 26439, 26440, 26444, 26452, 26453, 26461, 26470, 26476, 26478, 26484, + 26486, 26491, 26497, 26500, 26510, 26511, 26513, 26515, 26518, 26520, + 26521, 26523, 26544, 26545, 26546, 26549, 26555, 26556, 26557, 26617, + 26560, 26562, 26563, 26565, 26568, 26569, 26578, 26583, 26585, 26588, + 26593, 26598, 26608, 26610, 26614, 26615, 26706, 26644, 26649, 26653, + 26655, 26664, 26663, 26668, 26669, 26671, 26672, 26673, 26675, 26683, + 26687, 26692, 26693, 26698, 26700, 26709, 26711, 26712, 26715, 26731, + 26734, 26735, 26736, 26737, 26738, 26741, 26745, 26746, 26747, 26748, + 26754, 26756, 26758, 26760, 26774, 26776, 26778, 26780, 26785, 26787, + 26789, 26793, 26794, 26798, 26802, 26811, 26821, 26824, 26828, 26831, + 26832, 26833, 26835, 26838, 26841, 26844, 26845, 26853, 26856, 26858, + 26859, 26860, 26861, 26864, 26865, 26869, 26870, 26875, 26876, 26877, + 26886, 26889, 26890, 26896, 26897, 26899, 26902, 26903, 26929, 26931, + 26933, 26936, 26939, 26946, 26949, 26953, 26958, 26967, 26971, 26979, + 26980, 26981, 26982, 26984, 26985, 26988, 26992, 26993, 26994, 27002, + 27003, 27007, 27008, 27021, 27026, 27030, 27032, 27041, 27045, 27046, + 27048, 27051, 27053, 27055, 27063, 27064, 27066, 27068, 27077, 27080, + 27089, 27094, 27095, 27106, 27109, 27118, 27119, 27121, 27123, 27125, + 27134, 27136, 27137, 27139, 27151, 27153, 27157, 27162, 27165, 27168, + 27172, 27176, 27184, 27186, 27188, 27191, 27195, 27198, 27199, 27205, + 27206, 27209, 27210, 27214, 27216, 27217, 27218, 27221, 27222, 27227, + 27236, 27239, 27242, 27249, 27251, 27262, 27265, 27267, 27270, 27271, + 27273, 27275, 27281, 27291, 27293, 27294, 27295, 27301, 27307, 27311, + 27312, 27313, 27316, 27325, 27326, 27327, 27334, 27337, 27336, 27340, + 27344, 27348, 27349, 27350, 27356, 27357, 27364, 27367, 27372, 27376, + 27377, 27378, 27388, 27389, 27394, 27395, 27398, 27399, 27401, 27407, + 27408, 27409, 27415, 27419, 27422, 27428, 27432, 27435, 27436, 27439, + 27445, 27446, 27451, 27455, 27462, 27466, 27469, 27474, 27478, 27480, + 27485, 27488, 27495, 27499, 27502, 27504, 27509, 27517, 27518, 27522, + 27525, 27543, 27547, 27551, 27552, 27554, 27555, 27560, 27561, 27564, + 27565, 27566, 27568, 27576, 27577, 27581, 27582, 27587, 27588, 27593, + 27596, 27606, 27610, 27617, 27619, 27622, 27623, 27630, 27633, 27639, + 27641, 27647, 27650, 27652, 27653, 27657, 27661, 27662, 27664, 27666, + 27673, 27679, 27686, 27687, 27688, 27692, 27694, 27699, 27701, 27702, + 27706, 27707, 27711, 27722, 27723, 27725, 27727, 27730, 27732, 27737, + 27739, 27740, 27755, 27757, 27759, 27764, 27766, 27768, 27769, 27771, + 27781, 27782, 27783, 27785, 27796, 27797, 27799, 27800, 27804, 27807, + 27824, 27826, 27828, 27842, 27846, 27853, 27855, 27856, 27857, 27858, + 27860, 27862, 27866, 27868, 27872, 27879, 27881, 27883, 27884, 27886, + 27890, 27892, 27908, 27911, 27914, 27918, 27919, 27921, 27923, 27930, + 27942, 27943, 27944, 27751, 27950, 27951, 27953, 27961, 27964, 27967, + 27991, 27998, 27999, 28001, 28005, 28007, 28015, 28016, 28028, 28034, + 28039, 28049, 28050, 28052, 28054, 28055, 28056, 28074, 28076, 28084, + 28087, 28089, 28093, 28095, 28100, 28104, 28106, 28110, 28111, 28118, + 28123, 28125, 28127, 28128, 28130, 28133, 28137, 28143, 28144, 28148, + 28150, 28156, 28160, 28164, 28190, 28194, 28199, 28210, 28214, 28217, + 28219, 28220, 28228, 28229, 28232, 28233, 28235, 28239, 28241, 28242, + 28243, 28244, 28247, 28252, 28253, 28254, 28258, 28259, 28264, 28275, + 28283, 28285, 28301, 28307, 28313, 28320, 28327, 28333, 28334, 28337, + 28339, 28347, 28351, 28352, 28353, 28355, 28359, 28360, 28362, 28365, + 28366, 28367, 28395, 28397, 28398, 28409, 28411, 28413, 28420, 28424, + 28426, 28428, 28429, 28438, 28440, 28442, 28443, 28454, 28457, 28458, + 28463, 28464, 28467, 28470, 28475, 28476, 28461, 28495, 28497, 28498, + 28499, 28503, 28505, 28506, 28509, 28510, 28513, 28514, 28520, 28524, + 28541, 28542, 28547, 28551, 28552, 28555, 28556, 28557, 28560, 28562, + 28563, 28564, 28566, 28570, 28575, 28576, 28581, 28582, 28583, 28584, + 28590, 28591, 28592, 28597, 28598, 28604, 28613, 28615, 28616, 28618, + 28634, 28638, 28648, 28649, 28656, 28661, 28665, 28668, 28669, 28672, + 28677, 28678, 28679, 28685, 28695, 28704, 28707, 28719, 28724, 28727, + 28729, 28732, 28739, 28740, 28744, 28745, 28746, 28747, 28756, 28757, + 28765, 28766, 28750, 28772, 28773, 28780, 28782, 28789, 28790, 28798, + 28801, 28805, 28806, 28820, 28821, 28822, 28823, 28824, 28827, 28836, + 28843, 28848, 28849, 28852, 28855, 28874, 28881, 28883, 28884, 28885, + 28886, 28888, 28892, 28900, 28922, 28931, 28932, 28933, 28934, 28935, + 28939, 28940, 28943, 28958, 28960, 28971, 28973, 28975, 28976, 28977, + 28984, 28993, 28997, 28998, 28999, 29002, 29003, 29008, 29010, 29015, + 29018, 29020, 29022, 29024, 29032, 29049, 29056, 29061, 29063, 29068, + 29074, 29082, 29083, 29088, 29090, 29103, 29104, 29106, 29107, 29114, + 29119, 29120, 29121, 29124, 29131, 29132, 29139, 29142, 29145, 29146, + 29148, 29176, 29182, 29184, 29191, 29192, 29193, 29203, 29207, 29210, + 29213, 29215, 29220, 29227, 29231, 29236, 29240, 29241, 29249, 29250, + 29251, 29253, 29262, 29263, 29264, 29267, 29269, 29270, 29274, 29276, + 29278, 29280, 29283, 29288, 29291, 29294, 29295, 29297, 29303, 29304, + 29307, 29308, 29311, 29316, 29321, 29325, 29326, 29331, 29339, 29352, + 29357, 29358, 29361, 29364, 29374, 29377, 29383, 29385, 29388, 29397, + 29398, 29400, 29407, 29413, 29427, 29428, 29434, 29435, 29438, 29442, + 29444, 29445, 29447, 29451, 29453, 29458, 29459, 29464, 29465, 29470, + 29474, 29476, 29479, 29480, 29484, 29489, 29490, 29493, 29498, 29499, + 29501, 29507, 29517, 29520, 29522, 29526, 29528, 29533, 29534, 29535, + 29536, 29542, 29543, 29545, 29547, 29548, 29550, 29551, 29553, 29559, + 29561, 29564, 29568, 29569, 29571, 29573, 29574, 29582, 29584, 29587, + 29589, 29591, 29592, 29596, 29598, 29599, 29600, 29602, 29605, 29606, + 29610, 29611, 29613, 29621, 29623, 29625, 29628, 29629, 29631, 29637, + 29638, 29641, 29643, 29644, 29647, 29650, 29651, 29654, 29657, 29661, + 29665, 29667, 29670, 29671, 29673, 29684, 29685, 29687, 29689, 29690, + 29691, 29693, 29695, 29696, 29697, 29700, 29703, 29706, 29713, 29722, + 29723, 29732, 29734, 29736, 29737, 29738, 29739, 29740, 29741, 29742, + 29743, 29744, 29745, 29753, 29760, 29763, 29764, 29766, 29767, 29771, + 29773, 29777, 29778, 29783, 29789, 29794, 29798, 29799, 29800, 29803, + 29805, 29806, 29809, 29810, 29824, 29825, 29829, 29830, 29831, 29833, + 29839, 29840, 29841, 29842, 29848, 29849, 29850, 29852, 29855, 29856, + 29857, 29859, 29862, 29864, 29865, 29866, 29867, 29870, 29871, 29873, + 29874, 29877, 29881, 29883, 29887, 29896, 29897, 29900, 29904, 29907, + 29912, 29914, 29915, 29918, 29919, 29924, 29928, 29930, 29931, 29935, + 29940, 29946, 29947, 29948, 29951, 29958, 29970, 29974, 29975, 29984, + 29985, 29988, 29991, 29993, 29994, 29999, 30006, 30009, 30013, 30014, + 30015, 30016, 30019, 30023, 30024, 30030, 30032, 30034, 30039, 30046, + 30047, 30049, 30063, 30065, 30073, 30074, 30075, 30076, 30077, 30078, + 30081, 30085, 30096, 30098, 30099, 30101, 30105, 30108, 30114, 30116, + 30132, 30138, 30143, 30144, 30145, 30148, 30150, 30156, 30158, 30159, + 30167, 30172, 30175, 30176, 30177, 30180, 30183, 30188, 30190, 30191, + 30193, 30201, 30208, 30210, 30211, 30212, 30215, 30216, 30218, 30220, + 30223, 30226, 30227, 30229, 30230, 30233, 30235, 30236, 30237, 30238, + 30243, 30245, 30246, 30249, 30253, 30258, 30259, 30261, 30264, 30265, + 30266, 30268, 30282, 30272, 30273, 30275, 30276, 30277, 30281, 30283, + 30293, 30297, 30303, 30308, 30309, 30317, 30318, 30319, 30321, 30324, + 30337, 30341, 30348, 30349, 30357, 30363, 30364, 30365, 30367, 30368, + 30370, 30371, 30372, 30373, 30374, 30375, 30376, 30378, 30381, 30397, + 30401, 30405, 30409, 30411, 30412, 30414, 30420, 30425, 30432, 30438, + 30440, 30444, 30448, 30449, 30454, 30457, 30460, 30464, 30470, 30474, + 30478, 30482, 30484, 30485, 30487, 30489, 30490, 30492, 30498, 30504, + 30509, 30510, 30511, 30516, 30517, 30518, 30521, 30525, 30526, 30530, + 30533, 30534, 30538, 30541, 30542, 30543, 30546, 30550, 30551, 30556, + 30558, 30559, 30560, 30562, 30564, 30567, 30570, 30572, 30576, 30578, + 30579, 30580, 30586, 30589, 30592, 30596, 30604, 30605, 30612, 30613, + 30614, 30618, 30623, 30626, 30631, 30634, 30638, 30639, 30641, 30645, + 30654, 30659, 30665, 30673, 30674, 30677, 30681, 30686, 30687, 30688, + 30692, 30694, 30698, 30700, 30704, 30705, 30708, 30712, 30715, 30725, + 30726, 30729, 30733, 30734, 30737, 30749, 30753, 30754, 30755, 30765, + 30766, 30768, 30773, 30775, 30787, 30788, 30791, 30792, 30796, 30798, + 30802, 30812, 30814, 30816, 30817, 30819, 30820, 30824, 30826, 30830, + 30842, 30846, 30858, 30863, 30868, 30872, 30881, 30877, 30878, 30879, + 30884, 30888, 30892, 30893, 30896, 30897, 30898, 30899, 30907, 30909, + 30911, 30919, 30920, 30921, 30924, 30926, 30930, 30931, 30933, 30934, + 30948, 30939, 30943, 30944, 30945, 30950, 30954, 30962, 30963, 30976, + 30966, 30967, 30970, 30971, 30975, 30982, 30988, 30992, 31002, 31004, + 31006, 31007, 31008, 31013, 31015, 31017, 31021, 31025, 31028, 31029, + 31035, 31037, 31039, 31044, 31045, 31046, 31050, 31051, 31055, 31057, + 31060, 31064, 31067, 31068, 31079, 31081, 31083, 31090, 31097, 31099, + 31100, 31102, 31115, 31116, 31121, 31123, 31124, 31125, 31126, 31128, + 31131, 31132, 31137, 31144, 31145, 31147, 31151, 31153, 31156, 31160, + 31163, 31170, 31172, 31175, 31176, 31178, 31183, 31188, 31190, 31194, + 31197, 31198, 31200, 31202, 31205, 31210, 31211, 31213, 31217, 31224, + 31228, 31234, 31235, 31239, 31241, 31242, 31244, 31249, 31253, 31259, + 31262, 31265, 31271, 31275, 31277, 31279, 31280, 31284, 31285, 31288, + 31289, 31290, 31300, 31301, 31303, 31304, 31308, 31317, 31318, 31321, + 31324, 31325, 31327, 31328, 31333, 31335, 31338, 31341, 31349, 31352, + 31358, 31360, 31362, 31365, 31366, 31370, 31371, 31376, 31377, 31380, + 31390, 31392, 31395, 31404, 31411, 31413, 31417, 31419, 31420, 31430, + 31433, 31436, 31438, 31441, 31451, 31464, 31465, 31467, 31468, 31473, + 31476, 31483, 31485, 31486, 31495, 31508, 31519, 31523, 31527, 31529, + 31530, 31531, 31533, 31534, 31535, 31536, 31537, 31540, 31549, 31551, + 31552, 31553, 31559, 31566, 31573, 31584, 31588, 31590, 31593, 31594, + 31597, 31599, 31602, 31603, 31607, 31620, 31625, 31630, 31632, 31633, + 31638, 31643, 31646, 31648, 31653, 31660, 31663, 31664, 31666, 31669, + 31670, 31674, 31675, 31676, 31677, 31682, 31685, 31688, 31690, 31700, + 31702, 31703, 31705, 31706, 31707, 31720, 31722, 31730, 31732, 31733, + 31736, 31737, 31738, 31740, 31742, 31745, 31746, 31747, 31748, 31750, + 31753, 31755, 31756, 31758, 31759, 31769, 31771, 31776, 31781, 31782, + 31784, 31788, 31793, 31795, 31796, 31798, 31801, 31802, 31814, 31818, + 31829, 31825, 31826, 31827, 31833, 31834, 31835, 31836, 31837, 31838, + 31841, 31843, 31847, 31849, 31853, 31854, 31856, 31858, 31865, 31868, + 31869, 31878, 31879, 31887, 31892, 31902, 31904, 31910, 31920, 31926, + 31927, 31930, 31931, 31932, 31935, 31940, 31943, 31944, 31945, 31949, + 31951, 31955, 31956, 31957, 31959, 31961, 31962, 31965, 31974, 31977, + 31979, 31989, 32003, 32007, 32008, 32009, 32015, 32017, 32018, 32019, + 32022, 32029, 32030, 32035, 32038, 32042, 32045, 32049, 32060, 32061, + 32062, 32064, 32065, 32071, 32072, 32077, 32081, 32083, 32087, 32089, + 32090, 32092, 32093, 32101, 32103, 32106, 32112, 32120, 32122, 32123, + 32127, 32129, 32130, 32131, 32133, 32134, 32136, 32139, 32140, 32141, + 32145, 32150, 32151, 32157, 32158, 32166, 32167, 32170, 32179, 32182, + 32183, 32185, 32194, 32195, 32196, 32197, 32198, 32204, 32205, 32206, + 32215, 32217, 32256, 32226, 32229, 32230, 32234, 32235, 32237, 32241, + 32245, 32246, 32249, 32250, 32264, 32272, 32273, 32277, 32279, 32284, + 32285, 32288, 32295, 32296, 32300, 32301, 32303, 32307, 32310, 32319, + 32324, 32325, 32327, 32334, 32336, 32338, 32344, 32351, 32353, 32354, + 32357, 32363, 32366, 32367, 32371, 32376, 32382, 32385, 32390, 32391, + 32394, 32397, 32401, 32405, 32408, 32410, 32413, 32414, 32572, 32571, + 32573, 32574, 32575, 32579, 32580, 32583, 32591, 32594, 32595, 32603, + 32604, 32605, 32609, 32611, 32612, 32613, 32614, 32621, 32625, 32637, + 32638, 32639, 32640, 32651, 32653, 32655, 32656, 32657, 32662, 32663, + 32668, 32673, 32674, 32678, 32682, 32685, 32692, 32700, 32703, 32704, + 32707, 32712, 32718, 32719, 32731, 32735, 32739, 32741, 32744, 32748, + 32750, 32751, 32754, 32762, 32765, 32766, 32767, 32775, 32776, 32778, + 32781, 32782, 32783, 32785, 32787, 32788, 32790, 32797, 32798, 32799, + 32800, 32804, 32806, 32812, 32814, 32816, 32820, 32821, 32823, 32825, + 32826, 32828, 32830, 32832, 32836, 32864, 32868, 32870, 32877, 32881, + 32885, 32897, 32904, 32910, 32924, 32926, 32934, 32935, 32939, 32952, + 32953, 32968, 32973, 32975, 32978, 32980, 32981, 32983, 32984, 32992, + 33005, 33006, 33008, 33010, 33011, 33014, 33017, 33018, 33022, 33027, + 33035, 33046, 33047, 33048, 33052, 33054, 33056, 33060, 33063, 33068, + 33072, 33077, 33082, 33084, 33093, 33095, 33098, 33100, 33106, 33111, + 33120, 33121, 33127, 33128, 33129, 33133, 33135, 33143, 33153, 33168, + 33156, 33157, 33158, 33163, 33166, 33174, 33176, 33179, 33182, 33186, + 33198, 33202, 33204, 33211, 33227, 33219, 33221, 33226, 33230, 33231, + 33237, 33239, 33243, 33245, 33246, 33249, 33252, 33259, 33260, 33264, + 33265, 33266, 33269, 33270, 33272, 33273, 33277, 33279, 33280, 33283, + 33295, 33299, 33300, 33305, 33306, 33309, 33313, 33314, 33320, 33330, + 33332, 33338, 33347, 33348, 33349, 33350, 33355, 33358, 33359, 33361, + 33366, 33372, 33376, 33379, 33383, 33389, 33396, 33403, 33405, 33407, + 33408, 33409, 33411, 33412, 33415, 33417, 33418, 33422, 33425, 33428, + 33430, 33432, 33434, 33435, 33440, 33441, 33443, 33444, 33447, 33448, + 33449, 33450, 33454, 33456, 33458, 33460, 33463, 33466, 33468, 33470, + 33471, 33478, 33488, 33493, 33498, 33504, 33506, 33508, 33512, 33514, + 33517, 33519, 33526, 33527, 33533, 33534, 33536, 33537, 33543, 33544, + 33546, 33547, 33620, 33563, 33565, 33566, 33567, 33569, 33570, 33580, + 33581, 33582, 33584, 33587, 33591, 33594, 33596, 33597, 33602, 33603, + 33604, 33607, 33613, 33614, 33617, 33621, 33622, 33623, 33648, 33656, + 33661, 33663, 33664, 33666, 33668, 33670, 33677, 33682, 33684, 33685, + 33688, 33689, 33691, 33692, 33693, 33702, 33703, 33705, 33708, 33726, + 33727, 33728, 33735, 33737, 33743, 33744, 33745, 33748, 33757, 33619, + 33768, 33770, 33782, 33784, 33785, 33788, 33793, 33798, 33802, 33807, + 33809, 33813, 33817, 33709, 33839, 33849, 33861, 33863, 33864, 33866, + 33869, 33871, 33873, 33874, 33878, 33880, 33881, 33882, 33884, 33888, + 33892, 33893, 33895, 33898, 33904, 33907, 33908, 33910, 33912, 33916, + 33917, 33921, 33925, 33938, 33939, 33941, 33950, 33958, 33960, 33961, + 33962, 33967, 33969, 33972, 33978, 33981, 33982, 33984, 33986, 33991, + 33992, 33996, 33999, 34003, 34012, 34023, 34026, 34031, 34032, 34033, + 34034, 34039, 34098, 34042, 34043, 34045, 34050, 34051, 34055, 34060, + 34062, 34064, 34076, 34078, 34082, 34083, 34084, 34085, 34087, 34090, + 34091, 34095, 34099, 34100, 34102, 34111, 34118, 34127, 34128, 34129, + 34130, 34131, 34134, 34137, 34140, 34141, 34142, 34143, 34144, 34145, + 34146, 34148, 34155, 34159, 34169, 34170, 34171, 34173, 34175, 34177, + 34181, 34182, 34185, 34187, 34188, 34191, 34195, 34200, 34205, 34207, + 34208, 34210, 34213, 34215, 34228, 34230, 34231, 34232, 34236, 34237, + 34238, 34239, 34242, 34247, 34250, 34251, 34254, 34221, 34264, 34266, + 34271, 34272, 34278, 34280, 34285, 34291, 34294, 34300, 34303, 34304, + 34308, 34309, 34317, 34318, 34320, 34321, 34322, 34328, 34329, 34331, + 34334, 34337, 34343, 34345, 34358, 34360, 34362, 34364, 34365, 34368, + 34370, 34374, 34386, 34387, 34390, 34391, 34392, 34393, 34397, 34400, + 34401, 34402, 34403, 34404, 34409, 34412, 34415, 34421, 34422, 34423, + 34426, 34445, 34449, 34454, 34456, 34458, 34460, 34465, 34470, 34471, + 34472, 34477, 34481, 34483, 34484, 34485, 34487, 34488, 34489, 34495, + 34496, 34497, 34499, 34501, 34513, 34514, 34517, 34519, 34522, 34524, + 34528, 34531, 34533, 34535, 34440, 34554, 34556, 34557, 34564, 34565, + 34567, 34571, 34574, 34575, 34576, 34579, 34580, 34585, 34590, 34591, + 34593, 34595, 34600, 34606, 34607, 34609, 34610, 34617, 34618, 34620, + 34621, 34622, 34624, 34627, 34629, 34637, 34648, 34653, 34657, 34660, + 34661, 34671, 34673, 34674, 34683, 34691, 34692, 34693, 34694, 34695, + 34696, 34697, 34699, 34700, 34704, 34707, 34709, 34711, 34712, 34713, + 34718, 34720, 34723, 34727, 34732, 34733, 34734, 34737, 34741, 34750, + 34751, 34753, 34760, 34761, 34762, 34766, 34773, 34774, 34777, 34778, + 34780, 34783, 34786, 34787, 34788, 34794, 34795, 34797, 34801, 34803, + 34808, 34810, 34815, 34817, 34819, 34822, 34825, 34826, 34827, 34832, + 34841, 34834, 34835, 34836, 34840, 34842, 34843, 34844, 34846, 34847, + 34856, 34861, 34862, 34864, 34866, 34869, 34874, 34876, 34881, 34883, + 34885, 34888, 34889, 34890, 34891, 34894, 34897, 34901, 34902, 34904, + 34906, 34908, 34911, 34912, 34916, 34921, 34929, 34937, 34939, 34944, + 34968, 34970, 34971, 34972, 34975, 34976, 34984, 34986, 35002, 35005, + 35006, 35008, 35018, 35019, 35020, 35021, 35022, 35025, 35026, 35027, + 35035, 35038, 35047, 35055, 35056, 35057, 35061, 35063, 35073, 35078, + 35085, 35086, 35087, 35093, 35094, 35096, 35097, 35098, 35100, 35104, + 35110, 35111, 35112, 35120, 35121, 35122, 35125, 35129, 35130, 35134, + 35136, 35138, 35141, 35142, 35145, 35151, 35154, 35159, 35162, 35163, + 35164, 35169, 35170, 35171, 35179, 35182, 35184, 35187, 35189, 35194, + 35195, 35196, 35197, 35209, 35213, 35216, 35220, 35221, 35227, 35228, + 35231, 35232, 35237, 35248, 35252, 35253, 35254, 35255, 35260, 35284, + 35285, 35286, 35287, 35288, 35301, 35305, 35307, 35309, 35313, 35315, + 35318, 35321, 35325, 35327, 35332, 35333, 35335, 35343, 35345, 35346, + 35348, 35349, 35358, 35360, 35362, 35364, 35366, 35371, 35372, 35375, + 35381, 35383, 35389, 35390, 35392, 35395, 35397, 35399, 35401, 35405, + 35406, 35411, 35414, 35415, 35416, 35420, 35421, 35425, 35429, 35431, + 35445, 35446, 35447, 35449, 35450, 35451, 35454, 35455, 35456, 35459, + 35462, 35467, 35471, 35472, 35474, 35478, 35479, 35481, 35487, 35495, + 35497, 35502, 35503, 35507, 35510, 35511, 35515, 35518, 35523, 35526, + 35528, 35529, 35530, 35537, 35539, 35540, 35541, 35543, 35549, 35551, + 35564, 35568, 35572, 35573, 35574, 35580, 35583, 35589, 35590, 35595, + 35601, 35612, 35614, 35615, 35594, 35629, 35632, 35639, 35644, 35650, + 35651, 35652, 35653, 35654, 35656, 35666, 35667, 35668, 35673, 35661, + 35678, 35683, 35693, 35702, 35704, 35705, 35708, 35710, 35713, 35716, + 35717, 35723, 35725, 35727, 35732, 35733, 35740, 35742, 35743, 35896, + 35897, 35901, 35902, 35909, 35911, 35913, 35915, 35919, 35921, 35923, + 35924, 35927, 35928, 35931, 35933, 35929, 35939, 35940, 35942, 35944, + 35945, 35949, 35955, 35957, 35958, 35963, 35966, 35974, 35975, 35979, + 35984, 35986, 35987, 35993, 35995, 35996, 36004, 36025, 36026, 36037, + 36038, 36041, 36043, 36047, 36054, 36053, 36057, 36061, 36065, 36072, + 36076, 36079, 36080, 36082, 36085, 36087, 36088, 36094, 36095, 36097, + 36099, 36105, 36114, 36119, 36123, 36197, 36201, 36204, 36206, 36223, + 36226, 36228, 36232, 36237, 36240, 36241, 36245, 36254, 36255, 36256, + 36262, 36267, 36268, 36271, 36274, 36277, 36279, 36281, 36283, 36288, + 36293, 36294, 36295, 36296, 36298, 36302, 36305, 36308, 36309, 36311, + 36313, 36324, 36325, 36327, 36332, 36336, 36284, 36337, 36338, 36340, + 36349, 36353, 36356, 36357, 36358, 36363, 36369, 36372, 36374, 36384, + 36385, 36386, 36387, 36390, 36391, 36401, 36403, 36406, 36407, 36408, + 36409, 36413, 36416, 36417, 36427, 36429, 36430, 36431, 36436, 36443, + 36444, 36445, 36446, 36449, 36450, 36457, 36460, 36461, 36463, 36464, + 36465, 36473, 36474, 36475, 36482, 36483, 36489, 36496, 36498, 36501, + 36506, 36507, 36509, 36510, 36514, 36519, 36521, 36525, 36526, 36531, + 36533, 36538, 36539, 36544, 36545, 36547, 36548, 36551, 36559, 36561, + 36564, 36572, 36584, 36590, 36592, 36593, 36599, 36601, 36602, 36589, + 36608, 36610, 36615, 36616, 36623, 36624, 36630, 36631, 36632, 36638, + 36640, 36641, 36643, 36645, 36647, 36648, 36652, 36653, 36654, 36660, + 36661, 36662, 36663, 36666, 36672, 36673, 36675, 36679, 36687, 36689, + 36690, 36691, 36692, 36693, 36696, 36701, 36702, 36709, 36765, 36768, + 36769, 36772, 36773, 36774, 36789, 36790, 36792, 36798, 36800, 36801, + 36806, 36810, 36811, 36813, 36816, 36818, 36819, 36821, 36832, 36835, + 36836, 36840, 36846, 36849, 36853, 36854, 36859, 36862, 36866, 36868, + 36872, 36876, 36888, 36891, 36904, 36905, 36911, 36906, 36908, 36909, + 36915, 36916, 36919, 36927, 36931, 36932, 36940, 36955, 36957, 36962, + 36966, 36967, 36972, 36976, 36980, 36985, 36997, 37000, 37003, 37004, + 37006, 37008, 37013, 37015, 37016, 37017, 37019, 37024, 37025, 37026, + 37029, 37040, 37042, 37043, 37044, 37046, 37053, 37068, 37054, 37059, + 37060, 37061, 37063, 37064, 37077, 37079, 37080, 37081, 37084, 37085, + 37087, 37093, 37074, 37110, 37099, 37103, 37104, 37108, 37118, 37119, + 37120, 37124, 37125, 37126, 37128, 37133, 37136, 37140, 37142, 37143, + 37144, 37146, 37148, 37150, 37152, 37157, 37154, 37155, 37159, 37161, + 37166, 37167, 37169, 37172, 37174, 37175, 37177, 37178, 37180, 37181, + 37187, 37191, 37192, 37199, 37203, 37207, 37209, 37210, 37211, 37217, + 37220, 37223, 37229, 37236, 37241, 37242, 37243, 37249, 37251, 37253, + 37254, 37258, 37262, 37265, 37267, 37268, 37269, 37272, 37278, 37281, + 37286, 37288, 37292, 37293, 37294, 37296, 37297, 37298, 37299, 37302, + 37307, 37308, 37309, 37311, 37314, 37315, 37317, 37331, 37332, 37335, + 37337, 37338, 37342, 37348, 37349, 37353, 37354, 37356, 37357, 37358, + 37359, 37360, 37361, 37367, 37369, 37371, 37373, 37376, 37377, 37380, + 37381, 37382, 37383, 37385, 37386, 37388, 37392, 37394, 37395, 37398, + 37400, 37404, 37405, 37411, 37412, 37413, 37414, 37416, 37422, 37423, + 37424, 37427, 37429, 37430, 37432, 37433, 37434, 37436, 37438, 37440, + 37442, 37443, 37446, 37447, 37450, 37453, 37454, 37455, 37457, 37464, + 37465, 37468, 37469, 37472, 37473, 37477, 37479, 37480, 37481, 37486, + 37487, 37488, 37493, 37494, 37495, 37496, 37497, 37499, 37500, 37501, + 37503, 37512, 37513, 37514, 37517, 37518, 37522, 37527, 37529, 37535, + 37536, 37540, 37541, 37543, 37544, 37547, 37551, 37554, 37558, 37560, + 37562, 37563, 37564, 37565, 37567, 37568, 37569, 37570, 37571, 37573, + 37574, 37575, 37576, 37579, 37580, 37581, 37582, 37584, 37587, 37589, + 37591, 37592, 37593, 37596, 37597, 37599, 37600, 37601, 37603, 37605, + 37607, 37608, 37612, 37614, 37616, 37625, 37627, 37631, 37632, 37634, + 37640, 37645, 37649, 37652, 37653, 37660, 37661, 37662, 37663, 37665, + 37668, 37669, 37671, 37673, 37674, 37683, 37684, 37686, 37687, 37703, + 37704, 37705, 37712, 37713, 37714, 37717, 37719, 37720, 37722, 37726, + 37732, 37733, 37735, 37737, 37738, 37741, 37743, 37744, 37745, 37747, + 37748, 37750, 37754, 37757, 37759, 37760, 37761, 37762, 37768, 37770, + 37771, 37773, 37775, 37778, 37781, 37784, 37787, 37790, 37793, 37795, + 37796, 37798, 37800, 37803, 37812, 37813, 37814, 37818, 37801, 37825, + 37828, 37829, 37830, 37831, 37833, 37834, 37835, 37836, 37837, 37843, + 37849, 37852, 37854, 37855, 37858, 37862, 37863, 37881, 37879, 37880, + 37882, 37883, 37885, 37889, 37890, 37892, 37896, 37897, 37901, 37902, + 37903, 37909, 37910, 37911, 37919, 37934, 37935, 37937, 37938, 37939, + 37940, 37947, 37951, 37949, 37955, 37957, 37960, 37962, 37964, 37973, + 37977, 37980, 37983, 37985, 37987, 37992, 37995, 37997, 37998, 37999, + 38001, 38002, 38020, 38019, 38264, 38265, 38270, 38276, 38280, 38284, + 38285, 38286, 38301, 38302, 38303, 38305, 38310, 38313, 38315, 38316, + 38324, 38326, 38330, 38333, 38335, 38342, 38344, 38345, 38347, 38352, + 38353, 38354, 38355, 38361, 38362, 38365, 38366, 38367, 38368, 38372, + 38374, 38429, 38430, 38434, 38436, 38437, 38438, 38444, 38449, 38451, + 38455, 38456, 38457, 38458, 38460, 38461, 38465, 38482, 38484, 38486, + 38487, 38488, 38497, 38510, 38516, 38523, 38524, 38526, 38527, 38529, + 38530, 38531, 38532, 38537, 38545, 38550, 38554, 38557, 38559, 38564, + 38565, 38566, 38569, 38574, 38575, 38579, 38586, 38602, 38610, 23986, + 38616, 38618, 38621, 38622, 38623, 38633, 38639, 38641, 38650, 38658, + 38659, 38661, 38665, 38682, 38683, 38685, 38689, 38690, 38691, 38696, + 38705, 38707, 38721, 38723, 38730, 38734, 38735, 38741, 38743, 38744, + 38746, 38747, 38755, 38759, 38762, 38766, 38771, 38774, 38775, 38776, + 38779, 38781, 38783, 38784, 38793, 38805, 38806, 38807, 38809, 38810, + 38814, 38815, 38818, 38828, 38830, 38833, 38834, 38837, 38838, 38840, + 38841, 38842, 38844, 38846, 38847, 38849, 38852, 38853, 38855, 38857, + 38858, 38860, 38861, 38862, 38864, 38865, 38868, 38871, 38872, 38873, + 38877, 38878, 38880, 38875, 38881, 38884, 38895, 38897, 38900, 38903, + 38904, 38906, 38919, 38922, 38937, 38925, 38926, 38932, 38934, 38940, + 38942, 38944, 38947, 38950, 38955, 38958, 38959, 38960, 38962, 38963, + 38965, 38949, 38974, 38980, 38983, 38986, 38993, 38994, 38995, 38998, + 38999, 39001, 39002, 39010, 39011, 39013, 39014, 39018, 39020, 39083, + 39085, 39086, 39088, 39092, 39095, 39096, 39098, 39099, 39103, 39106, + 39109, 39112, 39116, 39137, 39139, 39141, 39142, 39143, 39146, 39155, + 39158, 39170, 39175, 39176, 39185, 39189, 39190, 39191, 39194, 39195, + 39196, 39199, 39202, 39206, 39207, 39211, 39217, 39218, 39219, 39220, + 39221, 39225, 39226, 39227, 39228, 39232, 39233, 39238, 39239, 39240, + 39245, 39246, 39252, 39256, 39257, 39259, 39260, 39262, 39263, 39264, + 39323, 39325, 39327, 39334, 39344, 39345, 39346, 39349, 39353, 39354, + 39357, 39359, 39363, 39369, 39379, 39380, 39385, 39386, 39388, 39390, + 39399, 39402, 39403, 39404, 39408, 39412, 39413, 39417, 39421, 39422, + 39426, 39427, 39428, 39435, 39436, 39440, 39441, 39446, 39454, 39456, + 39458, 39459, 39460, 39463, 39469, 39470, 39475, 39477, 39478, 39480, + 39495, 39489, 39492, 39498, 39499, 39500, 39502, 39505, 39508, 39510, + 39517, 39594, 39596, 39598, 39599, 39602, 39604, 39605, 39606, 39609, + 39611, 39614, 39615, 39617, 39619, 39622, 39624, 39630, 39632, 39634, + 39637, 39638, 39639, 39643, 39644, 39648, 39652, 39653, 39655, 39657, + 39660, 39666, 39667, 39669, 39673, 39674, 39677, 39679, 39680, 39681, + 39682, 39683, 39684, 39685, 39688, 39689, 39691, 39692, 39693, 39694, + 39696, 39698, 39702, 39705, 39707, 39708, 39712, 39718, 39723, 39725, + 39731, 39732, 39733, 39735, 39737, 39738, 39741, 39752, 39755, 39756, + 39765, 39766, 39767, 39771, 39774, 39777, 39779, 39781, 39782, 39784, + 39786, 39787, 39788, 39789, 39790, 39795, 39797, 39799, 39800, 39801, + 39807, 39808, 39812, 39813, 39814, 39815, 39817, 39818, 39819, 39821, + 39823, 39824, 39828, 39834, 39837, 39838, 39846, 39847, 39849, 39852, + 39856, 39857, 39858, 39863, 39864, 39867, 39868, 39870, 39871, 39873, + 39879, 39880, 39886, 39888, 39895, 39896, 39901, 39903, 39909, 39911, + 39914, 39915, 39919, 39923, 39927, 39928, 39929, 39930, 39933, 39935, + 39936, 39938, 39947, 39951, 39953, 39958, 39960, 39961, 39962, 39964, + 39966, 39970, 39971, 39974, 39975, 39976, 39977, 39978, 39985, 39989, + 39990, 39991, 39997, 40001, 40003, 40004, 40005, 40009, 40010, 40014, + 40015, 40016, 40019, 40020, 40022, 40024, 40027, 40029, 40030, 40031, + 40035, 40041, 40042, 40028, 40043, 40040, 40046, 40048, 40050, 40053, + 40055, 40059, 40166, 40178, 40183, 40185, 40203, 40194, 40209, 40215, + 40216, 40220, 40221, 40222, 40239, 40240, 40242, 40243, 40244, 40250, + 40252, 40261, 40253, 40258, 40259, 40263, 40266, 40275, 40276, 40287, + 40291, 40290, 40293, 40297, 40298, 40299, 40304, 40310, 40311, 40315, + 40316, 40318, 40323, 40324, 40326, 40330, 40333, 40334, 40338, 40339, + 40341, 40342, 40343, 40344, 40353, 40362, 40364, 40366, 40369, 40373, + 40377, 40380, 40383, 40387, 40391, 40393, 40394, 40404, 40405, 40406, + 40407, 40410, 40414, 40415, 40416, 40421, 40423, 40425, 40427, 40430, + 40432, 40435, 40436, 40446, 40458, 40450, 40455, 40462, 40464, 40465, + 40466, 40469, 40470, 40473, 40476, 40477, 40570, 40571, 40572, 40576, + 40578, 40579, 40580, 40581, 40583, 40590, 40591, 40598, 40600, 40603, + 40606, 40612, 40616, 40620, 40622, 40623, 40624, 40627, 40628, 40629, + 40646, 40648, 40651, 40661, 40671, 40676, 40679, 40684, 40685, 40686, + 40688, 40689, 40690, 40693, 40696, 40703, 40706, 40707, 40713, 40719, + 40720, 40721, 40722, 40724, 40726, 40727, 40729, 40730, 40731, 40735, + 40738, 40742, 40746, 40747, 40751, 40753, 40754, 40756, 40759, 40761, + 40762, 40764, 40765, 40767, 40769, 40771, 40772, 40773, 40774, 40775, + 40787, 40789, 40790, 40791, 40792, 40794, 40797, 40798, 40808, 40809, + 40813, 40814, 40815, 40816, 40817, 40819, 40821, 40826, 40829, 40847, + 40848, 40849, 40850, 40852, 40854, 40855, 40862, 40865, 40866, 40867, + 40869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myencoding_map_koi8_r[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 9555, 9556, 9557, 9558, + 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 1025, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, + 9578, 9579, 9580, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myencoding_map_koi8_u[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 1108, 9556, 1110, 1111, + 9559, 9560, 9561, 9562, 9563, 1169, 1118, 9566, 9567, 9568, + 9569, 1025, 1028, 9571, 1030, 1031, 9574, 9575, 9576, 9577, + 9578, 1168, 1038, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myencoding_map_macintosh[] = { + 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, + 228, 227, 229, 231, 233, 232, 234, 235, 237, 236, + 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, + 251, 252, 8224, 176, 162, 163, 167, 8226, 182, 223, + 174, 169, 8482, 180, 168, 8800, 198, 216, 8734, 177, + 8804, 8805, 165, 181, 8706, 8721, 8719, 960, 8747, 170, + 186, 937, 230, 248, 191, 161, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 192, 195, 213, 338, 339, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 9674, 255, 376, + 8260, 8364, 8249, 8250, 64257, 64258, 8225, 183, 8218, 8222, + 8240, 194, 202, 193, 203, 200, 205, 206, 207, 204, + 211, 212, 63743, 210, 218, 219, 217, 305, 710, 732, + 175, 728, 729, 730, 184, 733, 731, 711, +}; + +static const unsigned long myencoding_map_windows_1250[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 352, 8249, 346, 356, 381, 377, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 353, 8250, 347, 357, + 382, 378, 160, 711, 728, 321, 164, 260, 166, 167, + 168, 169, 350, 171, 172, 173, 174, 379, 176, 177, + 731, 322, 180, 181, 182, 183, 184, 261, 351, 187, + 317, 733, 318, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myencoding_map_windows_1251[] = { + 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, + 1033, 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, + 1115, 1119, 160, 1038, 1118, 1032, 164, 1168, 166, 167, + 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, + 1030, 1110, 1169, 181, 182, 183, 1105, 8470, 1108, 187, + 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, + 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, +}; + +static const unsigned long myencoding_map_windows_1252[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 382, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myencoding_map_windows_1253[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 157, + 158, 159, 160, 901, 902, 163, 164, 165, 166, 167, + 168, 169, 0x0000, 171, 172, 173, 174, 8213, 176, 177, + 178, 179, 900, 181, 182, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myencoding_map_windows_1254[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 305, 351, 255, +}; + +static const unsigned long myencoding_map_windows_1255[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 156, 157, + 158, 159, 160, 161, 162, 163, 8362, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 191, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1465, 0x0000, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1520, 1521, 1522, 1523, 1524, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myencoding_map_windows_1256[] = { + 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, + 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, + 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, + 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, + 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, + 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, + 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, + 1617, 249, 1618, 251, 252, 8206, 8207, 1746, +}; + +static const unsigned long myencoding_map_windows_1257[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 168, 711, 184, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 175, + 731, 159, 160, 0x0000, 162, 163, 164, 0x0000, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 180, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 729, +}; + +static const unsigned long myencoding_map_windows_1258[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 258, 196, 197, + 198, 199, 200, 201, 202, 203, 768, 205, 206, 207, + 272, 209, 777, 211, 212, 416, 214, 215, 216, 217, + 218, 219, 220, 431, 771, 223, 224, 225, 226, 259, + 228, 229, 230, 231, 232, 233, 234, 235, 769, 237, + 238, 239, 273, 241, 803, 243, 244, 417, 246, 247, + 248, 249, 250, 251, 252, 432, 8363, 255, +}; + +static const unsigned long myencoding_map_windows_874[] = { + 8364, 129, 130, 131, 132, 8230, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 3585, 3586, 3587, 3588, 3589, 3590, 3591, + 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, + 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, + 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, + 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, + 3642, 0x0000, 0x0000, 0x0000, 0x0000, 3647, 3648, 3649, 3650, 3651, + 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, + 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, + 3672, 3673, 3674, 3675, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myencoding_map_x_mac_cyrillic[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 8224, 176, 1168, 163, 167, 8226, 182, 1030, + 174, 169, 8482, 1026, 1106, 8800, 1027, 1107, 8734, 177, + 8804, 8805, 1110, 181, 1169, 1032, 1028, 1108, 1031, 1111, + 1033, 1113, 1034, 1114, 1112, 1029, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 1035, 1115, 1036, 1116, 1109, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 8222, 1038, 1118, + 1039, 1119, 8470, 1025, 1105, 1103, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 8364, +}; + +//static const myencoding_custom_f myencoding_function_index[] = { +// myencoding_decode_utf_8, NULL, NULL, myencoding_decode_utf_8, myencoding_decode_utf_16le, +// myencoding_decode_utf_16be, myencoding_decode_x_user_defined, +// myencoding_decode_big5, myencoding_decode_euc_kr, myencoding_decode_gb18030, +// myencoding_decode_ibm866, myencoding_decode_iso_8859_10, myencoding_decode_iso_8859_13, +// myencoding_decode_iso_8859_14, myencoding_decode_iso_8859_15, myencoding_decode_iso_8859_16, +// myencoding_decode_iso_8859_2, myencoding_decode_iso_8859_3, myencoding_decode_iso_8859_4, +// myencoding_decode_iso_8859_5, myencoding_decode_iso_8859_6, myencoding_decode_iso_8859_7, +// myencoding_decode_iso_8859_8, myencoding_decode_koi8_r, myencoding_decode_koi8_u, +// myencoding_decode_macintosh, myencoding_decode_windows_1250, myencoding_decode_windows_1251, +// myencoding_decode_windows_1252, myencoding_decode_windows_1253, myencoding_decode_windows_1254, +// myencoding_decode_windows_1255, myencoding_decode_windows_1256, myencoding_decode_windows_1257, +// myencoding_decode_windows_1258, myencoding_decode_windows_874, myencoding_decode_x_mac_cyrillic, +// myencoding_decode_iso_2022_jp, myencoding_decode_gbk, myencoding_decode_shift_jis, +// myencoding_decode_euc_jp, myencoding_decode_iso_8859_8_i +//}; + +static const myencoding_custom_f myencoding_function_index[] = +{ + myencoding_decode_utf_8, // MyENCODING_DEFAULT + NULL, + NULL, + myencoding_decode_utf_8, // MyENCODING_UTF_8 + myencoding_decode_utf_16le, // MyENCODING_UTF_16LE + myencoding_decode_utf_16be, // MyENCODING_UTF_16BE + myencoding_decode_x_user_defined, // MyENCODING_X_USER_DEFINED + myencoding_decode_big5, // MyENCODING_BIG5 + myencoding_decode_euc_jp, // MyENCODING_EUC_JP + myencoding_decode_euc_kr, // MyENCODING_EUC_KR + myencoding_decode_gb18030, // MyENCODING_GB18030 + myencoding_decode_gbk, // MyENCODING_GBK + myencoding_decode_ibm866, // MyENCODING_IBM866 + myencoding_decode_iso_2022_jp, // MyENCODING_ISO_2022_JP + myencoding_decode_iso_8859_10, // MyENCODING_ISO_8859_10 + myencoding_decode_iso_8859_13, // MyENCODING_ISO_8859_13 + myencoding_decode_iso_8859_14, // MyENCODING_ISO_8859_14 + myencoding_decode_iso_8859_15, // MyENCODING_ISO_8859_15 + myencoding_decode_iso_8859_16, // MyENCODING_ISO_8859_16 + myencoding_decode_iso_8859_2, // MyENCODING_ISO_8859_2 + myencoding_decode_iso_8859_3, // MyENCODING_ISO_8859_3 + myencoding_decode_iso_8859_4, // MyENCODING_ISO_8859_4 + myencoding_decode_iso_8859_5, // MyENCODING_ISO_8859_5 + myencoding_decode_iso_8859_6, // MyENCODING_ISO_8859_6 + myencoding_decode_iso_8859_7, // MyENCODING_ISO_8859_7 + myencoding_decode_iso_8859_8, // MyENCODING_ISO_8859_8 + myencoding_decode_iso_8859_8_i, // MyENCODING_ISO_8859_8_I + myencoding_decode_koi8_r, // MyENCODING_KOI8_R + myencoding_decode_koi8_u, // MyENCODING_KOI8_U + myencoding_decode_macintosh, // MyENCODING_MACINTOSH + myencoding_decode_shift_jis, // MyENCODING_SHIFT_JIS + myencoding_decode_windows_1250, // MyENCODING_WINDOWS_1250 + myencoding_decode_windows_1251, // MyENCODING_WINDOWS_1251 + myencoding_decode_windows_1252, // MyENCODING_WINDOWS_1252 + myencoding_decode_windows_1253, // MyENCODING_WINDOWS_1253 + myencoding_decode_windows_1254, // MyENCODING_WINDOWS_1254 + myencoding_decode_windows_1255, // MyENCODING_WINDOWS_1255 + myencoding_decode_windows_1256, // MyENCODING_WINDOWS_1256 + myencoding_decode_windows_1257, // MyENCODING_WINDOWS_1257 + myencoding_decode_windows_1258, // MyENCODING_WINDOWS_1258 + myencoding_decode_windows_874, // MyENCODING_WINDOWS_874 + myencoding_decode_x_mac_cyrillic, // MyENCODING_X_MAC_CYRILLIC + NULL, +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_RESOURCE_H */ + + + + diff --git a/include/myfont/cmap.h b/include/myfont/cmap.h index 8eae7b9..583f756 100644 --- a/include/myfont/cmap.h +++ b/include/myfont/cmap.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -208,9 +208,9 @@ typedef myfont_table_cmap_t; #include -myfont_status_t myfont_load_table_cmap(myfont_font_t *mf); +mystatus_t myfont_load_table_cmap(myfont_font_t* mf, uint8_t* data, size_t data_size); -uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long char_code, myfont_status_t* status); +uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long char_code, mystatus_t* status); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/glyf.h b/include/myfont/glyf.h index 2d2e223..8c146db 100644 --- a/include/myfont/glyf.h +++ b/include/myfont/glyf.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -99,13 +99,13 @@ typedef myfont_table_glyf_t; struct myfont_font; -myfont_status_t myfont_load_table_glyf(struct myfont_font *mf); +mystatus_t myfont_load_table_glyf(myfont_font_t *mf, uint8_t* data, size_t data_size); -myfont_status_t myfont_glyf_load(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint16_t glyph_index); -myfont_status_t myfont_glyf_load_data(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint32_t offset); -myfont_status_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset); -myfont_status_t myfont_glyf_load_simple_flags(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset); -myfont_status_t myfont_glyf_load_simple_coordinates(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset); +mystatus_t myfont_glyf_load(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t* data, size_t data_size, uint16_t glyph_index); +mystatus_t myfont_glyf_load_data(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t* data, size_t data_size, uint32_t offset); +mystatus_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset); +mystatus_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset); +mystatus_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/head.h b/include/myfont/head.h index e17dc74..f24655a 100644 --- a/include/myfont/head.h +++ b/include/myfont/head.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -53,9 +53,9 @@ typedef myfont_table_head_t; struct myfont_font; -myfont_status_t myfont_load_table_head(struct myfont_font *mf); +mystatus_t myfont_load_table_head(myfont_font_t *mf, uint8_t* data, size_t data_size); -float myfont_head_yMax_pixel(struct myfont_font *mf, float font_size); +float myfont_head_yMax_pixel(myfont_font_t *mf, float font_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/hhea.h b/include/myfont/hhea.h index d0406f7..582df31 100644 --- a/include/myfont/hhea.h +++ b/include/myfont/hhea.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -54,7 +54,7 @@ typedef myfont_table_hhea_t; struct myfont_font; -myfont_status_t myfont_load_table_hhea(struct myfont_font *mf); +mystatus_t myfont_load_table_hhea(myfont_font_t *mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/hmtx.h b/include/myfont/hmtx.h index 7a2609b..bda5ae3 100644 --- a/include/myfont/hmtx.h +++ b/include/myfont/hmtx.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,7 +45,7 @@ typedef myfont_table_hmtx_t; struct myfont_font; -myfont_status_t myfont_load_table_hmtx(struct myfont_font *mf); +mystatus_t myfont_load_table_hmtx(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/loca.h b/include/myfont/loca.h index 2419f52..8dd8db6 100644 --- a/include/myfont/loca.h +++ b/include/myfont/loca.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -38,9 +38,9 @@ typedef myfont_table_loca_t; struct myfont_font; -myfont_status_t myfont_load_table_loca(struct myfont_font *mf); +mystatus_t myfont_load_table_loca(myfont_font_t *mf, uint8_t* data, size_t data_size); -uint32_t myfont_loca_get_offset(struct myfont_font *mf, uint16_t glyph_index); +uint32_t myfont_loca_get_offset(myfont_font_t *mf, uint16_t glyph_index); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/maxp.h b/include/myfont/maxp.h index c078be8..d151c3c 100644 --- a/include/myfont/maxp.h +++ b/include/myfont/maxp.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -51,7 +51,7 @@ typedef myfont_table_maxp_t; struct myfont_font; -myfont_status_t myfont_load_table_maxp(struct myfont_font *mf); +mystatus_t myfont_load_table_maxp(myfont_font_t *mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/myfont.h b/include/myfont/myfont.h index a51c4b8..5f1e0a2 100644 --- a/include/myfont/myfont.h +++ b/include/myfont/myfont.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,8 @@ #define MyFONT_MyFONT_H #pragma once +#include + #include #include #include @@ -36,7 +38,13 @@ #include #include -#include +#include + +#define MyFONT_VERSION_MAJOR 0 +#define MyFONT_VERSION_MINOR 0 +#define MyFONT_VERSION_PATCH 2 + +#define MyFONT_VERSION_STRING MyCORE_STR(MyFONT_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyFONT_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyFONT_VERSION_PATCH) #ifdef __cplusplus extern "C" { @@ -83,16 +91,12 @@ struct myfont_font { myfont_table_pclt_t table_pclt; myfont_table_loca_t table_loca; - char* file_path; - size_t file_size; - uint8_t* file_data; - mchar_async_t* mchar; size_t mchar_node_id; }; myfont_font_t * myfont_create(void); -myfont_status_t myfont_init(myfont_font_t *mf); +mystatus_t myfont_init(myfont_font_t *mf); void myfont_clean(myfont_font_t *mf); myfont_font_t * myfont_destroy(myfont_font_t *mf, bool self_destroy); @@ -100,10 +104,11 @@ void * myfont_malloc(myfont_font_t* mf, size_t size); void * myfont_calloc(myfont_font_t* mf, size_t count, size_t size); void myfont_free(myfont_font_t *mf, void* data); -myfont_status_t myfont_load(myfont_font_t *mf, const char *filepath); +mystatus_t myfont_load(myfont_font_t* mf, uint8_t* data, size_t data_size); +mystatus_t myfont_load_from_file(myfont_font_t* mf, const char* filepath, uint8_t** return_data, size_t* data_size); +void * myfont_destroy_font_data(myfont_font_t* mf, uint8_t* return_data); -void myfont_font_print_exists_table(myfont_font_t *mf, FILE *file); -myfont_status_t myfont_check_required_tables(myfont_font_t *mf); +mystatus_t myfont_check_required_tables(myfont_font_t *mf); float myfont_metrics_baseline(myfont_font_t *mf, float font_size); float myfont_metrics_ascender(myfont_font_t *mf, float font_size); @@ -113,11 +118,11 @@ float myfont_metrics_x_height(myfont_font_t *mf, float font_size); float myfont_metrics_cap_height(myfont_font_t *mf, float font_size); float myfont_metrics_font_height(myfont_font_t *mf, float font_size); -float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status); -float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status); -float myfont_metrics_glyph_offset_y(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status); +float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status); +float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status); +float myfont_metrics_glyph_offset_y(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status); -myfont_status_t myfont_load_table(myfont_font_t *mf, void *table, size_t size, enum myfont_table_key tkey); +mystatus_t myfont_load_table(myfont_font_t *mf, void *table, size_t size, enum myfont_table_key tkey); int16_t myfont_table_version_major(uint32_t version); int16_t myfont_table_version_minor(uint32_t version); diff --git a/include/myfont/myosi.h b/include/myfont/myosi.h index 410f1f2..caecfc4 100644 --- a/include/myfont/myosi.h +++ b/include/myfont/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -85,7 +85,6 @@ extern "C" { // base /* Very important!!! - see modest/myosi.h:modest_status_t */ enum myfont_status { MyFONT_STATUS_OK = 0x000000, diff --git a/include/myfont/name.h b/include/myfont/name.h index e3a7010..153f596 100644 --- a/include/myfont/name.h +++ b/include/myfont/name.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -60,8 +60,8 @@ typedef myfont_table_name_t; struct myfont_font; -myfont_status_t myfont_load_table_name(struct myfont_font *mf); - +mystatus_t myfont_load_table_name(myfont_font_t *mf, uint8_t* data, size_t data_size); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/myfont/os_2.h b/include/myfont/os_2.h index f7462cc..52468a3 100644 --- a/include/myfont/os_2.h +++ b/include/myfont/os_2.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -90,9 +90,9 @@ typedef myfont_table_os_2_t; struct myfont_font; -myfont_status_t myfont_load_table_os_2(struct myfont_font *mf); +mystatus_t myfont_load_table_os_2(myfont_font_t* mf, uint8_t* data, size_t data_size); -int8_t myfont_os_2_panose(struct myfont_font *mf, myfont_table_os_2_panose_t id); +int8_t myfont_os_2_panose(myfont_font_t* mf, myfont_table_os_2_panose_t id); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/pclt.h b/include/myfont/pclt.h index 9ea8343..c37fd8c 100644 --- a/include/myfont/pclt.h +++ b/include/myfont/pclt.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -52,7 +52,7 @@ typedef myfont_table_pclt_t; struct myfont_font; -myfont_status_t myfont_load_table_pclt(struct myfont_font *mf); +mystatus_t myfont_load_table_pclt(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/vhea.h b/include/myfont/vhea.h index 0735be1..e2a1faf 100644 --- a/include/myfont/vhea.h +++ b/include/myfont/vhea.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -54,7 +54,7 @@ typedef myfont_table_vhea_t; struct myfont_font; -myfont_status_t myfont_load_table_vhea(struct myfont_font *mf); +mystatus_t myfont_load_table_vhea(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myfont/vmtx.h b/include/myfont/vmtx.h index 2d8cbe5..bd4645d 100644 --- a/include/myfont/vmtx.h +++ b/include/myfont/vmtx.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,7 +45,7 @@ typedef myfont_table_vmtx_t; struct myfont_font; -myfont_status_t myfont_load_table_vmtx(struct myfont_font *mf); +mystatus_t myfont_load_table_vmtx(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myhtml/api.h b/include/myhtml/api.h index e7eb4a6..9599750 100755 --- a/include/myhtml/api.h +++ b/include/myhtml/api.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -34,14 +34,22 @@ * */ -#define MyHTML_VERSION_MAJOR 3 +#define MyHTML_VERSION_MAJOR 4 #define MyHTML_VERSION_MINOR 0 #define MyHTML_VERSION_PATCH 0 +#define MyHTML_VERSION_STRING MyCORE_STR(MyHTML_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_PATCH) + #include #include #include +#include +#include +#include +#include +#include + #if defined(_MSC_VER) # define MyHTML_DEPRECATED(func) __declspec(deprecated) func #elif defined(__GNUC__) || defined(__INTEL_COMPILER) @@ -54,56 +62,6 @@ extern "C" { #endif -/** - * encodings type - */ -enum myhtml_encoding_list { - MyHTML_ENCODING_DEFAULT = 0x00, -// MyHTML_ENCODING_AUTO = 0x01, // future - MyHTML_ENCODING_NOT_DETERMINED = 0x02, - MyHTML_ENCODING_UTF_8 = 0x00, // default encoding - MyHTML_ENCODING_UTF_16LE = 0x04, - MyHTML_ENCODING_UTF_16BE = 0x05, - MyHTML_ENCODING_X_USER_DEFINED = 0x06, - MyHTML_ENCODING_BIG5 = 0x07, - MyHTML_ENCODING_EUC_JP = 0x08, - MyHTML_ENCODING_EUC_KR = 0x09, - MyHTML_ENCODING_GB18030 = 0x0a, - MyHTML_ENCODING_GBK = 0x0b, - MyHTML_ENCODING_IBM866 = 0x0c, - MyHTML_ENCODING_ISO_2022_JP = 0x0d, - MyHTML_ENCODING_ISO_8859_10 = 0x0e, - MyHTML_ENCODING_ISO_8859_13 = 0x0f, - MyHTML_ENCODING_ISO_8859_14 = 0x10, - MyHTML_ENCODING_ISO_8859_15 = 0x11, - MyHTML_ENCODING_ISO_8859_16 = 0x12, - MyHTML_ENCODING_ISO_8859_2 = 0x13, - MyHTML_ENCODING_ISO_8859_3 = 0x14, - MyHTML_ENCODING_ISO_8859_4 = 0x15, - MyHTML_ENCODING_ISO_8859_5 = 0x16, - MyHTML_ENCODING_ISO_8859_6 = 0x17, - MyHTML_ENCODING_ISO_8859_7 = 0x18, - MyHTML_ENCODING_ISO_8859_8 = 0x19, - MyHTML_ENCODING_ISO_8859_8_I = 0x1a, - MyHTML_ENCODING_KOI8_R = 0x1b, - MyHTML_ENCODING_KOI8_U = 0x1c, - MyHTML_ENCODING_MACINTOSH = 0x1d, - MyHTML_ENCODING_SHIFT_JIS = 0x1e, - MyHTML_ENCODING_WINDOWS_1250 = 0x1f, - MyHTML_ENCODING_WINDOWS_1251 = 0x20, - MyHTML_ENCODING_WINDOWS_1252 = 0x21, - MyHTML_ENCODING_WINDOWS_1253 = 0x22, - MyHTML_ENCODING_WINDOWS_1254 = 0x23, - MyHTML_ENCODING_WINDOWS_1255 = 0x24, - MyHTML_ENCODING_WINDOWS_1256 = 0x25, - MyHTML_ENCODING_WINDOWS_1257 = 0x26, - MyHTML_ENCODING_WINDOWS_1258 = 0x27, - MyHTML_ENCODING_WINDOWS_874 = 0x28, - MyHTML_ENCODING_X_MAC_CYRILLIC = 0x29, - MyHTML_ENCODING_LAST_ENTRY = 0x2a -} -typedef myhtml_encoding_t; - /** * @struct basic tag ids */ @@ -384,54 +342,27 @@ enum myhtml_status { MyHTML_STATUS_OK = 0x0000, MyHTML_STATUS_ERROR = 0x0001, MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0002, - MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, - MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, - MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, - MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, - MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, - MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, - MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, - MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, - MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, - MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, - MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, - MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, - MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, - MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, - MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, - MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, - MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, - MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, - MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, - MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, - MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, - MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, - MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, - MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, - MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, - MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, - MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, - MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, - MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, - MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, - MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, - MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, - MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, - MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x9064, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x912c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x912d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x9190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x9191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x9192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x9193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x9194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x9195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x91f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x91f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x91f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x91f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x91f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x9258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x9259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x9300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x9301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x9302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x9303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x9304 } typedef myhtml_status_t; @@ -492,6 +423,11 @@ typedef struct myhtml myhtml_t; */ typedef struct myhtml_tree myhtml_tree_t; +/** + * @struct myhtml_token_t MyHTML_TOKEN + */ +typedef struct myhtml_token myhtml_token_t; + typedef struct myhtml_token_attr myhtml_tree_attr_t; typedef struct myhtml_tree_node myhtml_tree_node_t; @@ -502,39 +438,6 @@ typedef struct myhtml_tree_node myhtml_tree_node_t; typedef size_t myhtml_tag_id_t; typedef struct myhtml_tag myhtml_tag_t; -/** - * MCHAR_ASYNC structures - * - */ -typedef struct mchar_async mchar_async_t; - -/** - * MyHTML_INCOMING structures - * - */ -typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; - -/** - * MyHTML_STRING structures - * - */ -struct myhtml_string { - char* data; - size_t size; - size_t length; - - mchar_async_t *mchar; - size_t node_idx; -} -typedef myhtml_string_t; - -struct myhtml_string_raw { - char* data; - size_t size; - size_t length; -} -typedef myhtml_string_raw_t; - /** * @struct myhtml_collection_t */ @@ -572,7 +475,6 @@ typedef myhtml_version_t; // callback functions typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); -typedef void (*myhtml_callback_serialize_f)(const char* buffer, size_t size, void* ctx); /*********************************************************************************** * @@ -602,7 +504,7 @@ myhtml_create(void); * * @return MyHTML_STATUS_OK if successful, otherwise an error status value. */ -myhtml_status_t +mystatus_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); @@ -627,7 +529,7 @@ myhtml_destroy(myhtml_t* myhtml); * Parsing HTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @@ -635,15 +537,15 @@ myhtml_destroy(myhtml_t* myhtml); * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); /** * Parsing fragment of HTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 @@ -653,8 +555,8 @@ myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse_fragment(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -663,7 +565,7 @@ myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, * No matter what was said during initialization MyHTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @@ -671,8 +573,8 @@ myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); /** @@ -680,7 +582,7 @@ myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, * No matter what was said during initialization MyHTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 @@ -690,8 +592,8 @@ myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse_fragment_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -704,7 +606,7 @@ myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); /** @@ -718,7 +620,7 @@ myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html,size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -732,7 +634,7 @@ myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html,size_t html_si * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); /** @@ -747,7 +649,7 @@ myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_siz * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -758,7 +660,7 @@ myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_end(myhtml_tree_t* tree); /*********************************************************************************** @@ -783,7 +685,7 @@ myhtml_tree_create(void); * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); /** @@ -935,48 +837,14 @@ myhtml_tree_get_mchar(myhtml_tree_t* tree); size_t myhtml_tree_get_mchar_node_id(myhtml_tree_t* tree); -/** - * Print tree of a node. Print including current node - * - * @param[in] myhtml_tree_t* - * @param[in] myhtml_tree_node_t* - * @param[in] file handle, for example use stdout - * @param[in] tab (\t) increment for pretty print, set 0 - */ -void -myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, - FILE* out, size_t inc); - -/** - * Print tree of a node. Print excluding current node - * - * @param[in] myhtml_tree_t* - * @param[in] myhtml_tree_node_t* - * @param[in] file handle, for example use stdout - * @param[in] tab (\t) increment for pretty print, set 0 - */ -void -myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, - FILE* out, size_t inc); - -/** - * Print a node - * - * @param[in] myhtml_tree_t* - * @param[in] myhtml_tree_node_t* - * @param[in] file handle, for example use stdout - */ -void -myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); - /** * Get first Incoming Buffer * * @param[in] myhtml_tree_t* * - * @return myhtml_incoming_buffer_t* if successful, otherwise a NULL value + * @return mycore_incoming_buffer_t* if successful, otherwise a NULL value */ -myhtml_incoming_buffer_t* +mycore_incoming_buffer_t* myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); /*********************************************************************************** @@ -1007,7 +875,7 @@ myhtml_node_first(myhtml_tree_t* tree); */ myhtml_collection_t* myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, - myhtml_tag_id_t tag_id, myhtml_status_t *status); + myhtml_tag_id_t tag_id, mystatus_t *status); /** * Get nodes by tag name @@ -1022,7 +890,7 @@ myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, */ myhtml_collection_t* myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, - const char* name, size_t length, myhtml_status_t *status); + const char* name, size_t length, mystatus_t *status); /** * Get nodes by attribute key @@ -1039,7 +907,7 @@ myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_collection_t* myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, - const char* key, size_t key_len, myhtml_status_t* status); + const char* key, size_t key_len, mystatus_t* status); /** * Get nodes by attribute value; exactly equal; like a [foo="bar"] @@ -1063,7 +931,7 @@ myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; whitespace separated; like a [foo~="bar"] @@ -1089,7 +957,7 @@ myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; value begins exactly with the string; like a [foo^="bar"] @@ -1115,7 +983,7 @@ myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** @@ -1142,7 +1010,7 @@ myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; value contains the substring; like a [foo*="bar"] @@ -1168,7 +1036,7 @@ myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; attribute value is a hyphen-separated list of values beginning; @@ -1193,7 +1061,7 @@ myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by tag id in node scope @@ -1209,7 +1077,7 @@ myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, - myhtml_status_t *status); + mystatus_t *status); /** * Get nodes by tag name in node scope @@ -1226,7 +1094,7 @@ myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *co myhtml_collection_t* myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, - myhtml_status_t *status); + mystatus_t *status); /** * Get next sibling node @@ -1378,11 +1246,11 @@ myhtml_node_insert_before(myhtml_tree_node_t *target, myhtml_tree_node_t *node); * @param[in] text length * @param[in] character encoding * - * @return myhtml_string_t* if successful, otherwise a NULL value + * @return mycore_string_t* if successful, otherwise a NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, - myhtml_encoding_t encoding); + myencoding_t encoding); /** * Add text for a node with convert character encoding. @@ -1392,11 +1260,11 @@ myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, * @param[in] text length * @param[in] character encoding * - * @return myhtml_string_t* if successful, otherwise a NULL value + * @return mycore_string_t* if successful, otherwise a NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, - myhtml_encoding_t encoding); + myencoding_t encoding); /** * Get token node @@ -1479,13 +1347,13 @@ const char* myhtml_node_text(myhtml_tree_node_t *node, size_t *length); /** - * Get myhtml_string_t object by Tree node + * Get mycore_string_t object by Tree node * * @param[in] myhtml_tree_node_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_node_string(myhtml_tree_node_t *node); /** @@ -1613,9 +1481,9 @@ myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); * * @param[in] myhtml_tree_attr_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_attribute_key_string(myhtml_tree_attr_t* attr); /** @@ -1623,9 +1491,9 @@ myhtml_attribute_key_string(myhtml_tree_attr_t* attr); * * @param[in] myhtml_tree_attr_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_attribute_value_string(myhtml_tree_attr_t* attr); /** @@ -1649,7 +1517,7 @@ myhtml_attribute_by_key(myhtml_tree_node_t *node, * @param[in] attr key name length * @param[in] attr value name * @param[in] attr value name length - * @param[in] character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * * @return created myhtml_tree_attr_t* if successful, otherwise a NULL value */ @@ -1657,7 +1525,7 @@ myhtml_tree_attr_t* myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, - myhtml_encoding_t encoding); + myencoding_t encoding); /** * Remove attribute reference. Not release the resources @@ -1797,13 +1665,13 @@ const char* myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); /** - * Get myhtml_string_t object by token node + * Get mycore_string_t object by token node * * @param[in] myhtml_token_node_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_token_node_string(myhtml_token_node_t *token_node); /** @@ -1829,10 +1697,11 @@ myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); /** * Wait for process token all parsing stage. Need if you use thread mode * + * @param[in] myhtml_token_t* * @param[in] myhtml_token_node_t* */ void -myhtml_token_node_wait_for_done(myhtml_token_node_t* node); +myhtml_token_node_wait_for_done(myhtml_token_t* token, myhtml_token_node_t* node); /*********************************************************************************** * @@ -1881,7 +1750,7 @@ myhtml_tag_id_by_name(myhtml_tree_t* tree, * @return myhtml_collection_t* if successful, otherwise an NULL value */ myhtml_collection_t* -myhtml_collection_create(size_t size, myhtml_status_t *status); +myhtml_collection_create(size_t size, mystatus_t *status); /** * Clears collection @@ -1911,7 +1780,7 @@ myhtml_collection_destroy(myhtml_collection_t *collection); * * @return NULL if successful, otherwise an myhtml_collection_t* structure */ -myhtml_status_t +mystatus_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); /*********************************************************************************** @@ -1928,16 +1797,16 @@ myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_ * */ void -myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); +myhtml_encoding_set(myhtml_tree_t* tree, myencoding_t encoding); /** * Get character encoding for current stream * * @param[in] myhtml_tree_t* * - * @return myhtml_encoding_t + * @return myencoding_t */ -myhtml_encoding_t +myencoding_t myhtml_encoding_get(myhtml_tree_t* tree); /** @@ -1950,7 +1819,7 @@ myhtml_encoding_get(myhtml_tree_t* tree); * @return size character set */ size_t -myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); +myencoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); /** * Convert Unicode Codepoint to UTF-16LE @@ -1964,7 +1833,7 @@ myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); * @return size character set */ size_t -myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); +myencoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); /** * Detect character encoding @@ -1980,7 +1849,7 @@ myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect(const char *text, size_t length, myencoding_t *encoding); /** * Detect Russian character encoding @@ -1994,7 +1863,7 @@ myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encod * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect_russian(const char *text, size_t length, myencoding_t *encoding); /** * Detect Unicode character encoding @@ -2008,7 +1877,7 @@ myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_ * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect_unicode(const char *text, size_t length, myencoding_t *encoding); /** * Detect Unicode character encoding by BOM @@ -2022,7 +1891,7 @@ myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_ * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect_bom(const char *text, size_t length, myencoding_t *encoding); /** * Detect Unicode character encoding by BOM. Cut BOM if will be found @@ -2038,13 +1907,13 @@ myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *e * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, +myencoding_detect_and_cut_bom(const char *text, size_t length, myencoding_t *encoding, const char **new_text, size_t *new_size); /** * Detect encoding by name - * Names like: windows-1258 return MyHTML_ENCODING_WINDOWS_1258 - * cp1251 or windows-1251 return MyHTML_ENCODING_WINDOWS_1251 + * Names like: windows-1258 return MyENCODING_WINDOWS_1258 + * cp1251 or windows-1251 return MyENCODING_WINDOWS_1251 * * See https://encoding.spec.whatwg.org/#names-and-labels * @@ -2055,18 +1924,18 @@ myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encod * @return true if encoding found, otherwise false */ bool -myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); +myencoding_by_name(const char *name, size_t length, myencoding_t *encoding); /** - * Get Encoding name by myhtml_encoding_t (by id) + * Get Encoding name by myencoding_t (by id) * - * @param[in] myhtml_encoding_t, encoding id + * @param[in] myencoding_t, encoding id * @param[out] return name length * * @return encoding name, otherwise NULL value */ const char* -myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length); +myencoding_name_by_id(myencoding_t encoding, size_t *length); /** * Detect encoding in meta tag () before start parsing @@ -2076,10 +1945,27 @@ myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length); * @param[in] html data bytes * @param[in] html data length * - * @return detected encoding if encoding found, otherwise MyHTML_ENCODING_NOT_DETERMINED + * @return detected encoding if encoding found, otherwise MyENCODING_NOT_DETERMINED */ -myhtml_encoding_t -myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); +myencoding_t +myencoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); + +/** + * Extracting character encoding from string. Find "charset=" and see encoding. + * For example: "text/html; charset=windows-1251". Return MyENCODING_WINDOWS_1251 + * + * + * See https://html.spec.whatwg.org/multipage/infrastructure.html#algorithm-for-extracting-a-character-encoding-from-a-meta-element + * + * @param[in] data + * @param[in] data length + * @param[out] return encoding + * + * @return true if encoding found + */ +bool +myencoding_extracting_character_encoding_from_charset(const char *data, size_t data_size, + myencoding_t *encoding); /*********************************************************************************** * @@ -2088,7 +1974,7 @@ myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t da ***********************************************************************************/ /** - * Init myhtml_string_t structure + * Init mycore_string_t structure * * @param[in] mchar_async_t*. It can be obtained from myhtml_tree_t object * (see myhtml_tree_get_mchar function) or create manualy @@ -2098,7 +1984,7 @@ myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t da * if created mchar_async_t object manually you know it, if not then take from the Tree * (see myhtml_tree_get_mchar_node_id) * - * @param[in] myhtml_string_t*. It can be obtained from myhtml_tree_node_t object + * @param[in] mycore_string_t*. It can be obtained from myhtml_tree_node_t object * (see myhtml_node_string function) or create manualy * * @param[in] data size. Set the size you want for char* @@ -2106,137 +1992,137 @@ myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t da * @return char* of the size if successful, otherwise a NULL value */ char* -myhtml_string_init(mchar_async_t *mchar, size_t node_id, - myhtml_string_t* str, size_t size); +mycore_string_init(mchar_async_t *mchar, size_t node_id, + mycore_string_t* str, size_t size); /** - * Increase the current size for myhtml_string_t object + * Increase the current size for mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function - * @param[in] data size. Set the new size you want for myhtml_string_t object + * @param[in] mycore_string_t*. See description for mycore_string_init function + * @param[in] data size. Set the new size you want for mycore_string_t object * * @return char* of the size if successful, otherwise a NULL value */ char* -myhtml_string_realloc(myhtml_string_t *str, size_t new_size); +mycore_string_realloc(mycore_string_t *str, size_t new_size); /** - * Clean myhtml_string_t object. In reality, data length set to 0 - * Equivalently: myhtml_string_length_set(str, 0); + * Clean mycore_string_t object. In reality, data length set to 0 + * Equivalently: mycore_string_length_set(str, 0); * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function */ void -myhtml_string_clean(myhtml_string_t* str); +mycore_string_clean(mycore_string_t* str); /** - * Clean myhtml_string_t object. Equivalently: memset(str, 0, sizeof(myhtml_string_t)) + * Clean mycore_string_t object. Equivalently: memset(str, 0, sizeof(mycore_string_t)) * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function */ void -myhtml_string_clean_all(myhtml_string_t* str); +mycore_string_clean_all(mycore_string_t* str); /** - * Release all resources for myhtml_string_t object + * Release all resources for mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] call free function for current object or not * - * @return NULL if destroy_obj set true, otherwise a current myhtml_string_t object + * @return NULL if destroy_obj set true, otherwise a current mycore_string_t object */ -myhtml_string_t* -myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); +mycore_string_t* +mycore_string_destroy(mycore_string_t* str, bool destroy_obj); /** - * Get data (char*) from a myhtml_string_t object + * Get data (char*) from a mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * * @return char* if exists, otherwise a NULL value */ char* -myhtml_string_data(myhtml_string_t *str); +mycore_string_data(mycore_string_t *str); /** - * Get data length from a myhtml_string_t object + * Get data length from a mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * * @return data length */ size_t -myhtml_string_length(myhtml_string_t *str); +mycore_string_length(mycore_string_t *str); /** - * Get data size from a myhtml_string_t object + * Get data size from a mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * * @return data size */ size_t -myhtml_string_size(myhtml_string_t *str); +mycore_string_size(mycore_string_t *str); /** - * Set data (char *) for a myhtml_string_t object. + * Set data (char *) for a mycore_string_t object. * * Attention!!! Attention!!! Attention!!! * * You can assign only that it has been allocated from functions: - * myhtml_string_data_alloc - * myhtml_string_data_realloc + * mycore_string_data_alloc + * mycore_string_data_realloc * or obtained manually created from mchar_async_t object * * Attention!!! Do not try set chat* from allocated by malloc or realloc!!! * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] you data to want assign * * @return assigned data if successful, otherwise a NULL value */ char* -myhtml_string_data_set(myhtml_string_t *str, char *data); +mycore_string_data_set(mycore_string_t *str, char *data); /** - * Set data size for a myhtml_string_t object. + * Set data size for a mycore_string_t object. * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] you size to want assign * * @return assigned size */ size_t -myhtml_string_size_set(myhtml_string_t *str, size_t size); +mycore_string_size_set(mycore_string_t *str, size_t size); /** - * Set data length for a myhtml_string_t object. + * Set data length for a mycore_string_t object. * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] you length to want assign * * @return assigned length */ size_t -myhtml_string_length_set(myhtml_string_t *str, size_t length); +mycore_string_length_set(mycore_string_t *str, size_t length); /** * Allocate data (char*) from a mchar_async_t object * - * @param[in] mchar_async_t*. See description for myhtml_string_init function - * @param[in] node id. See description for myhtml_string_init function + * @param[in] mchar_async_t*. See description for mycore_string_init function + * @param[in] node id. See description for mycore_string_init function * @param[in] you size to want assign * * @return data if successful, otherwise a NULL value */ char* -myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); +mycore_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); /** * Allocate data (char*) from a mchar_async_t object * - * @param[in] mchar_async_t*. See description for myhtml_string_init function - * @param[in] node id. See description for myhtml_string_init function + * @param[in] mchar_async_t*. See description for mycore_string_init function + * @param[in] node id. See description for mycore_string_init function * @param[in] old data * @param[in] how much data is copied from the old data to new data * @param[in] new size @@ -2244,28 +2130,28 @@ myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); * @return data if successful, otherwise a NULL value */ char* -myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, +mycore_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); /** * Release allocated data * - * @param[in] mchar_async_t*. See description for myhtml_string_init function - * @param[in] node id. See description for myhtml_string_init function + * @param[in] mchar_async_t*. See description for mycore_string_init function + * @param[in] node id. See description for mycore_string_init function * @param[in] data to release * * @return data if successful, otherwise a NULL value */ void -myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); +mycore_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); /*********************************************************************************** * * MyHTML_STRING_RAW * - * All work with myhtml_string_raw_t object occurs through - * myhtml_malloc (standart malloc), myhtml_realloc (standart realloc), - * myhtml_free (standart free). + * All work with mycore_string_raw_t object occurs through + * mycore_malloc (standart malloc), mycore_realloc (standart realloc), + * mycore_free (standart free). * * You are free to change them on without fear that something will happen * You can call free for str_raw.data, or change str_raw.length = 0 @@ -2273,32 +2159,32 @@ myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); ***********************************************************************************/ /** - * Clean myhtml_string_raw_t object. In reality, data length set to 0 + * Clean mycore_string_raw_t object. In reality, data length set to 0 * - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* */ void -myhtml_string_raw_clean(myhtml_string_raw_t* str_raw); +mycore_string_raw_clean(mycore_string_raw_t* str_raw); /** - * Full clean myhtml_string_raw_t object. - * Equivalently: memset(str_raw, 0, sizeof(myhtml_string_raw_t)) + * Full clean mycore_string_raw_t object. + * Equivalently: memset(str_raw, 0, sizeof(mycore_string_raw_t)) * - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* */ void -myhtml_string_raw_clean_all(myhtml_string_raw_t* str_raw); +mycore_string_raw_clean_all(mycore_string_raw_t* str_raw); /** - * Free resources for myhtml_string_raw_t object + * Free resources for mycore_string_raw_t object * - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* * @param[in] call free function for current object or not * - * @return NULL if destroy_obj set true, otherwise a current myhtml_string_raw_t object + * @return NULL if destroy_obj set true, otherwise a current mycore_string_raw_t object */ -myhtml_string_raw_t* -myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj); +mycore_string_raw_t* +mycore_string_raw_destroy(mycore_string_raw_t* str_raw, bool destroy_obj); /*********************************************************************************** @@ -2316,99 +2202,99 @@ myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj); /** * Get Incoming Buffer by position * - * @param[in] current myhtml_incoming_buffer_t* + * @param[in] current mycore_incoming_buffer_t* * @param[in] begin position * - * @return myhtml_incoming_buffer_t if successful, otherwise a NULL value + * @return mycore_incoming_buffer_t if successful, otherwise a NULL value */ -myhtml_incoming_buffer_t* -myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); +mycore_incoming_buffer_t* +mycore_incoming_buffer_find_by_position(mycore_incoming_buffer_t *inc_buf, size_t begin); /** * Get data of Incoming Buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return const char* if successful, otherwise a NULL value */ const char* -myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_data(mycore_incoming_buffer_t *inc_buf); /** * Get data length of Incoming Buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return size_t */ size_t -myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_length(mycore_incoming_buffer_t *inc_buf); /** * Get data size of Incoming Buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return size_t */ size_t -myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_size(mycore_incoming_buffer_t *inc_buf); /** * Get data offset of Incoming Buffer. Global position of begin Incoming Buffer. * See description for MyHTML_INCOMING title * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return size_t */ size_t -myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_offset(mycore_incoming_buffer_t *inc_buf); /** * Get Relative Position for Incoming Buffer. - * Incoming Buffer should be prepared by myhtml_incoming_buffer_find_by_position + * Incoming Buffer should be prepared by mycore_incoming_buffer_find_by_position * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * @param[in] global begin * * @return size_t */ size_t -myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); +mycore_incoming_buffer_relative_begin(mycore_incoming_buffer_t *inc_buf, size_t begin); /** * This function returns number of available data by Incoming Buffer - * Incoming buffer may be incomplete. See myhtml_incoming_buffer_next + * Incoming buffer may be incomplete. See mycore_incoming_buffer_next * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * @param[in] global begin * * @return size_t */ size_t -myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, +mycore_incoming_buffer_available_length(mycore_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); /** * Get next buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * - * @return myhtml_incoming_buffer_t* + * @return mycore_incoming_buffer_t* */ -myhtml_incoming_buffer_t* -myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_t* +mycore_incoming_buffer_next(mycore_incoming_buffer_t *inc_buf); /** * Get prev buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * - * @return myhtml_incoming_buffer_t* + * @return mycore_incoming_buffer_t* */ -myhtml_incoming_buffer_t* -myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_t* +mycore_incoming_buffer_prev(mycore_incoming_buffer_t *inc_buf); /*********************************************************************************** * @@ -2564,7 +2450,7 @@ myhtml_callback_tree_node_remove_set(myhtml_tree_t* tree, myhtml_callback_tree_n * @return 0 if match, otherwise index of break position */ size_t -myhtml_strcasecmp(const char* str1, const char* str2); +mycore_strcasecmp(const char* str1, const char* str2); /** * Compare two strings ignoring case of the first n characters @@ -2575,7 +2461,7 @@ myhtml_strcasecmp(const char* str1, const char* str2); * @return 0 if match, otherwise index of break position */ size_t -myhtml_strncasecmp(const char* str1, const char* str2, size_t size); +mycore_strncasecmp(const char* str1, const char* str2, size_t size); /*********************************************************************************** * @@ -2587,39 +2473,39 @@ myhtml_strncasecmp(const char* str1, const char* str2, size_t size); * Tree fragment serialization * The same as myhtml_serialization_tree_buffer function */ -bool -myhtml_serialization(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); /** * Only one tree node serialization * The same as myhtml_serialization_node_buffer function */ -bool -myhtml_serialization_node(myhtml_tree_node_t* node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization_node(myhtml_tree_node_t* node, mycore_string_raw_t* str); /** * Serialize tree to an output string * * @param[in] myhtml_tree_t* * @param[in] scope node - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* * * @return true if successful, otherwise false */ -bool -myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); /** * Serialize node to an output string * * @param[in] myhtml_tree_t* * @param[in] node - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* * * @return true if successful, otherwise false */ -bool -myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization_node_buffer(myhtml_tree_node_t* node, mycore_string_raw_t* str); /** * The serialize function for an entire tree @@ -2631,9 +2517,9 @@ myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* * * @return true if successful, otherwise false */ -bool +mystatus_t myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, - myhtml_callback_serialize_f callback, void* ptr); + mycore_callback_serialize_f callback, void* ptr); /** * The serialize function for a single node @@ -2645,9 +2531,9 @@ myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, * * @return true if successful, otherwise false */ -bool +mystatus_t myhtml_serialization_node_callback(myhtml_tree_node_t* node, - myhtml_callback_serialize_f callback, void* ptr); + mycore_callback_serialize_f callback, void* ptr); /*********************************************************************************** * diff --git a/include/myhtml/api_encoding.h b/include/myhtml/api_encoding.h deleted file mode 100644 index a8dff01..0000000 --- a/include/myhtml/api_encoding.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_API_ENCODING_H -#define MyHTML_API_ENCODING_H -#pragma once - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -enum myhtml_encoding_status { - MyHTML_ENCODING_STATUS_OK = 0x00, - MyHTML_ENCODING_STATUS_ERROR = 0x01, - MyHTML_ENCODING_STATUS_CONTINUE = 0x02, - MyHTML_ENCODING_STATUS_DONE = 0x04 -} -typedef myhtml_encoding_status_t; - -struct myhtml_encoding_result { - unsigned long first; - unsigned long second; - unsigned long third; - unsigned long result; - unsigned long result_aux; - unsigned long flag; -} -typedef myhtml_encoding_result_t; - -typedef myhtml_encoding_status_t -(*myhtml_encoding_custom_f)(unsigned const char byte, myhtml_encoding_result_t *res); - -/*********************************************************************************** - * - * MyHTML_ENCODING - * - ***********************************************************************************/ - -/** - * Clean myhtml_encoding_result_t. Use this function before and after text decode - * - * @param[in] myhtml_encoding_result_t* - */ -void -myhtml_encoding_result_clean(myhtml_encoding_result_t *res); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* api_encoding_h */ diff --git a/include/myhtml/callback.h b/include/myhtml/callback.h index c29dbe6..0379f0e 100644 --- a/include/myhtml/callback.h +++ b/include/myhtml/callback.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/charef.h b/include/myhtml/charef.h index d98dfc6..2293946 100644 --- a/include/myhtml/charef.h +++ b/include/myhtml/charef.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/charef_resource.h b/include/myhtml/charef_resource.h index 79c2086..59d93db 100644 --- a/include/myhtml/charef_resource.h +++ b/include/myhtml/charef_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/data_process.h b/include/myhtml/data_process.h index 64e7bd6..2dfd09c 100644 --- a/include/myhtml/data_process.h +++ b/include/myhtml/data_process.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -35,8 +35,8 @@ struct myhtml_data_process_entry { myhtml_data_process_state_f state; /* for encodings */ - myhtml_encoding_t encoding; - myhtml_encoding_result_t res; + myencoding_t encoding; + myencoding_result_t res; /* temp */ size_t tmp_str_pos_proc; @@ -53,16 +53,16 @@ struct myhtml_data_process_entry { void myhtml_data_process_entry_clean(myhtml_data_process_entry_t* proc_entry); -void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t size); -void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); +void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t size); +void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str); -size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char *data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); +size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char *data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myhtml/def.h b/include/myhtml/def.h index 389b198..8ec75e6 100644 --- a/include/myhtml/def.h +++ b/include/myhtml/def.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/encoding.h b/include/myhtml/encoding.h deleted file mode 100644 index 1ac3745..0000000 --- a/include/myhtml/encoding.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_ENCODING_H -#define MyHTML_ENCODING_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -enum myhtml_encoding_status { - MyHTML_ENCODING_STATUS_OK = 0x00, - MyHTML_ENCODING_STATUS_ERROR = 0x01, - MyHTML_ENCODING_STATUS_CONTINUE = 0x02, - MyHTML_ENCODING_STATUS_DONE = 0x04 -} -typedef myhtml_encoding_status_t; - -struct myhtml_encoding_result { - unsigned long first; - unsigned long second; - unsigned long third; - unsigned long result; - unsigned long result_aux; - unsigned long flag; -}; - -struct myhtml_encoding_trigram { - const unsigned char trigram[3]; - size_t value; -}; - -struct myhtml_encoding_trigram_result { - size_t count; - size_t value; -}; - -struct myhtml_encoding_unicode_result { - size_t count_ascii; - size_t count_good; - size_t count_bad; -}; - -struct myhtml_encoding_detect_name_entry { - const char* name; - size_t name_length; - const char* label; - size_t label_length; - - myhtml_encoding_t encoding; - - size_t next; - size_t curr; -}; - -struct myhtml_encoding_detect_attr { - size_t key_begin; - size_t key_length; - size_t value_begin; - size_t value_length; - - myhtml_encoding_detect_attr_t *next; -}; - -struct myhtml_encoding_entry_name_index { - const char *name; - size_t length; -}; - -typedef myhtml_encoding_status_t (*myhtml_encoding_custom_f)(unsigned const char data, myhtml_encoding_result_t *res); - -myhtml_encoding_custom_f myhtml_encoding_get_function_by_id(myhtml_encoding_t idx); - -enum myhtml_encoding_status myhtml_encoding_decode_utf_8(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_ibm866(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_2(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_3(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_4(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_5(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_6(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_7(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8_i(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_10(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_13(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_14(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_15(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_16(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_koi8_r(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_koi8_u(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_macintosh(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_874(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1250(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1251(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1252(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1253(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1254(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1255(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1256(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1257(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1258(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_x_mac_cyrillic(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_gbk(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_gb18030(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_big5(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_euc_jp(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_2022_jp(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_shift_jis(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_euc_kr(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_shared_utf_16(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_utf_16be(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_utf_16le(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_x_user_defined(unsigned const char data, myhtml_encoding_result_t *res); - -size_t myhtml_encoding_codepoint_ascii_length(size_t codepoint); -size_t myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); -size_t myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data); -size_t myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); -size_t myhtml_encoding_ascii_utf_8_to_codepoint(const unsigned char* data, size_t* codepoint); - -void myhtml_encoding_result_clean(myhtml_encoding_result_t *res); - -bool myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, const char **new_text, size_t *new_size); - -size_t myhtml_encoding_convert_to_ascii_utf_8(myhtml_string_raw_t* raw_str, const char* buff, size_t length, myhtml_encoding_t encoding); - -const myhtml_encoding_detect_name_entry_t * myhtml_encoding_name_entry_by_name(const char* name, size_t length); -bool myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); -const char * myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length); - -myhtml_encoding_t myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* encoding_h */ diff --git a/include/myhtml/encoding_detect_resource.h b/include/myhtml/encoding_detect_resource.h deleted file mode 100644 index 5fdea8b..0000000 --- a/include/myhtml/encoding_detect_resource.h +++ /dev/null @@ -1,5626 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_ENCODING_DETECT_RESOURCE_H -#define MyHTML_ENCODING_DETECT_RESOURCE_H -#pragma once - -#ifdef __cplusplus -//extern "C" { -#endif - -#define MyHTML_ENCODING_DETECT_NAME_STATIC_SIZE 419 - -#include - -static const myhtml_encoding_detect_name_entry_t myhtml_encoding_detect_name_entry_static_list_index[] = -{ - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1257", 12, "x-cp1257", 8, MyHTML_ENCODING_WINDOWS_1257, 0, 7}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-874", 11, "tis-620", 7, MyHTML_ENCODING_WINDOWS_874, 0, 10}, - {"iso-8859-3", 10, "iso8859-3", 9, MyHTML_ENCODING_ISO_8859_3, 420, 11}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"shift_jis", 9, "ms932", 5, MyHTML_ENCODING_SHIFT_JIS, 0, 16}, - {"gbk", 3, "gb_2312", 7, MyHTML_ENCODING_GBK, 421, 17}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-7", 10, "iso8859-7", 9, MyHTML_ENCODING_ISO_8859_7, 422, 20}, - {"windows-1250", 12, "cp1250", 6, MyHTML_ENCODING_WINDOWS_1250, 423, 21}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"shift_jis", 9, "shift-jis", 9, MyHTML_ENCODING_SHIFT_JIS, 424, 30}, - {"ibm866", 6, "csibm866", 8, MyHTML_ENCODING_IBM866, 425, 31}, - {"euc-kr", 6, "windows-949", 11, MyHTML_ENCODING_EUC_KR, 0, 32}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-2022-jp", 11, "csiso2022jp", 11, MyHTML_ENCODING_ISO_2022_JP, 0, 40}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-15", 11, "iso-8859-15", 11, MyHTML_ENCODING_ISO_8859_15, 426, 42}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-kr", 6, "ksc_5601", 8, MyHTML_ENCODING_EUC_KR, 0, 45}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"gbk", 3, "csiso58gb231280", 15, MyHTML_ENCODING_GBK, 0, 51}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-5", 10, "cyrillic", 8, MyHTML_ENCODING_ISO_8859_5, 0, 56}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1255", 12, "cp1255", 6, MyHTML_ENCODING_WINDOWS_1255, 427, 58}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1254", 12, "x-cp1254", 8, MyHTML_ENCODING_WINDOWS_1254, 0, 60}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-15", 11, "csisolatin9", 11, MyHTML_ENCODING_ISO_8859_15, 0, 62}, - {"koi8-u", 6, "koi8-ru", 7, MyHTML_ENCODING_KOI8_U, 0, 63}, - {"iso-8859-4", 10, "csisolatin4", 11, MyHTML_ENCODING_ISO_8859_4, 0, 64}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"shift_jis", 9, "windows-31j", 11, MyHTML_ENCODING_SHIFT_JIS, 0, 66}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"utf-8", 5, "utf-8", 5, MyHTML_ENCODING_UTF_8, 0, 79}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"ibm866", 6, "ibm866", 6, MyHTML_ENCODING_IBM866, 0, 82}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"koi8-r", 6, "koi8", 4, MyHTML_ENCODING_KOI8_R, 0, 86}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"gbk", 3, "x-gbk", 5, MyHTML_ENCODING_GBK, 428, 94}, - {"iso-8859-7", 10, "csisolatingreek", 15, MyHTML_ENCODING_ISO_8859_7, 0, 95}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "iso88591", 8, MyHTML_ENCODING_WINDOWS_1252, 0, 99}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "iso88592", 8, MyHTML_ENCODING_ISO_8859_2, 0, 101}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-3", 10, "iso88593", 8, MyHTML_ENCODING_ISO_8859_3, 0, 103}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-4", 10, "iso88594", 8, MyHTML_ENCODING_ISO_8859_4, 0, 105}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"shift_jis", 9, "sjis", 4, MyHTML_ENCODING_SHIFT_JIS, 430, 107}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-6", 10, "iso88596", 8, MyHTML_ENCODING_ISO_8859_6, 431, 109}, - {"windows-1252", 12, "l1", 2, MyHTML_ENCODING_WINDOWS_1252, 432, 110}, - {"macintosh", 9, "mac", 3, MyHTML_ENCODING_MACINTOSH, 433, 111}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-8", 10, "iso88598", 8, MyHTML_ENCODING_ISO_8859_8, 435, 113}, - {"koi8-u", 6, "koi8-u", 6, MyHTML_ENCODING_KOI8_U, 0, 114}, - {"windows-1254", 12, "iso88599", 8, MyHTML_ENCODING_WINDOWS_1254, 0, 115}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-6", 10, "ecma-114", 8, MyHTML_ENCODING_ISO_8859_6, 0, 117}, - {"iso-8859-4", 10, "iso8859-4", 9, MyHTML_ENCODING_ISO_8859_4, 436, 118}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-4", 10, "iso-ir-110", 10, MyHTML_ENCODING_ISO_8859_4, 437, 121}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-3", 10, "l3", 2, MyHTML_ENCODING_ISO_8859_3, 0, 123}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "iso-8859-2", 10, MyHTML_ENCODING_ISO_8859_2, 439, 126}, - {"windows-1253", 12, "cp1253", 6, MyHTML_ENCODING_WINDOWS_1253, 440, 127}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1258", 12, "x-cp1258", 8, MyHTML_ENCODING_WINDOWS_1258, 0, 129}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-4", 10, "iso-8859-4", 10, MyHTML_ENCODING_ISO_8859_4, 443, 131}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-10", 11, "iso-8859-10", 11, MyHTML_ENCODING_ISO_8859_10, 0, 133}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1254", 12, "l5", 2, MyHTML_ENCODING_WINDOWS_1254, 446, 136}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "latin2", 6, MyHTML_ENCODING_ISO_8859_2, 0, 138}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-8", 10, "iso-8859-8", 10, MyHTML_ENCODING_ISO_8859_8, 449, 141}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "cp819", 5, MyHTML_ENCODING_WINDOWS_1252, 0, 143}, - {"iso-8859-14", 11, "iso-8859-14", 11, MyHTML_ENCODING_ISO_8859_14, 0, 144}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-10", 11, "csisolatin6", 11, MyHTML_ENCODING_ISO_8859_10, 0, 147}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "csisolatin1", 11, MyHTML_ENCODING_WINDOWS_1252, 0, 149}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-15", 11, "l9", 2, MyHTML_ENCODING_ISO_8859_15, 0, 162}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1258", 12, "cp1258", 6, MyHTML_ENCODING_WINDOWS_1258, 0, 164}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "windows-1252", 12, MyHTML_ENCODING_WINDOWS_1252, 0, 171}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-7", 10, "sun_eu_greek", 12, MyHTML_ENCODING_ISO_8859_7, 0, 173}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-jp", 6, "cseucpkdfmtjapanese", 19, MyHTML_ENCODING_EUC_JP, 0, 175}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-4", 10, "latin4", 6, MyHTML_ENCODING_ISO_8859_4, 0, 177}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1255", 12, "x-cp1255", 8, MyHTML_ENCODING_WINDOWS_1255, 452, 182}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"koi8-r", 6, "koi", 3, MyHTML_ENCODING_KOI8_R, 0, 186}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1257", 12, "windows-1257", 12, MyHTML_ENCODING_WINDOWS_1257, 0, 188}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-874", 11, "windows-874", 11, MyHTML_ENCODING_WINDOWS_874, 0, 191}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1251", 12, "cp1251", 6, MyHTML_ENCODING_WINDOWS_1251, 0, 196}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"utf-16le", 8, "utf-16", 6, MyHTML_ENCODING_UTF_16LE, 0, 199}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-8", 10, "visual", 6, MyHTML_ENCODING_ISO_8859_8, 0, 207}, - {"macintosh", 9, "macintosh", 9, MyHTML_ENCODING_MACINTOSH, 0, 208}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "ansi_x3.4-1968", 14, MyHTML_ENCODING_WINDOWS_1252, 0, 210}, - {"iso-8859-3", 10, "iso_8859-3:1988", 15, MyHTML_ENCODING_ISO_8859_3, 453, 211}, - {"iso-8859-6", 10, "csiso88596e", 11, MyHTML_ENCODING_ISO_8859_6, 456, 212}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"gbk", 3, "csgb2312", 8, MyHTML_ENCODING_GBK, 0, 215}, - {"iso-8859-6", 10, "arabic", 6, MyHTML_ENCODING_ISO_8859_6, 457, 216}, - {"iso-8859-7", 10, "greek", 5, MyHTML_ENCODING_ISO_8859_7, 0, 217}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"shift_jis", 9, "ms_kanji", 8, MyHTML_ENCODING_SHIFT_JIS, 0, 219}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-5", 10, "iso8859-5", 9, MyHTML_ENCODING_ISO_8859_5, 460, 225}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "ascii", 5, MyHTML_ENCODING_WINDOWS_1252, 461, 227}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-kr", 6, "korean", 6, MyHTML_ENCODING_EUC_KR, 0, 229}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"utf-8", 5, "utf8", 4, MyHTML_ENCODING_UTF_8, 462, 231}, - {"iso-8859-3", 10, "csisolatin3", 11, MyHTML_ENCODING_ISO_8859_3, 0, 232}, - {"windows-1256", 12, "cp1256", 6, MyHTML_ENCODING_WINDOWS_1256, 464, 233}, - {"windows-1254", 12, "iso8859-9", 9, MyHTML_ENCODING_WINDOWS_1254, 0, 234}, - {"windows-1252", 12, "us-ascii", 8, MyHTML_ENCODING_WINDOWS_1252, 465, 235}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"big5", 4, "big5", 4, MyHTML_ENCODING_BIG5, 466, 246}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1250", 12, "windows-1250", 12, MyHTML_ENCODING_WINDOWS_1250, 0, 248}, - {"euc-kr", 6, "ksc5601", 7, MyHTML_ENCODING_EUC_KR, 0, 249}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-7", 10, "greek8", 6, MyHTML_ENCODING_ISO_8859_7, 467, 251}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-jp", 6, "x-euc-jp", 8, MyHTML_ENCODING_EUC_JP, 0, 257}, - {"shift_jis", 9, "x-sjis", 6, MyHTML_ENCODING_SHIFT_JIS, 0, 258}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"utf-16be", 8, "utf-16be", 8, MyHTML_ENCODING_UTF_16BE, 468, 262}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1255", 12, "windows-1255", 12, MyHTML_ENCODING_WINDOWS_1255, 0, 265}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-kr", 6, "ks_c_5601-1987", 14, MyHTML_ENCODING_EUC_KR, 0, 267}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"ibm866", 6, "866", 3, MyHTML_ENCODING_IBM866, 0, 274}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"big5", 4, "cn-big5", 7, MyHTML_ENCODING_BIG5, 0, 277}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"koi8-r", 6, "koi8-r", 6, MyHTML_ENCODING_KOI8_R, 469, 283}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "ibm819", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 296}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-6", 10, "asmo-708", 8, MyHTML_ENCODING_ISO_8859_6, 0, 300}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1254", 12, "cp1254", 6, MyHTML_ENCODING_WINDOWS_1254, 470, 302}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1256", 12, "x-cp1256", 8, MyHTML_ENCODING_WINDOWS_1256, 471, 304}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-2022-jp", 11, "iso-2022-jp", 11, MyHTML_ENCODING_ISO_2022_JP, 0, 309}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "iso_8859-2:1987", 15, MyHTML_ENCODING_ISO_8859_2, 473, 312}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"gbk", 3, "gb2312", 6, MyHTML_ENCODING_GBK, 0, 314}, - {"windows-1254", 12, "csisolatin5", 11, MyHTML_ENCODING_WINDOWS_1254, 0, 315}, - {"iso-8859-6", 10, "iso-8859-6-i", 12, MyHTML_ENCODING_ISO_8859_6, 476, 316}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "iso8859-2", 9, MyHTML_ENCODING_ISO_8859_2, 0, 323}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "l2", 2, MyHTML_ENCODING_ISO_8859_2, 0, 326}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "latin1", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 328}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-kr", 6, "ks_c_5601-1989", 14, MyHTML_ENCODING_EUC_KR, 0, 330}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-6", 10, "iso8859-6", 9, MyHTML_ENCODING_ISO_8859_6, 0, 332}, - {"iso-8859-2", 10, "iso-ir-101", 10, MyHTML_ENCODING_ISO_8859_2, 477, 333}, - {"ibm866", 6, "cp866", 5, MyHTML_ENCODING_IBM866, 0, 334}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-3", 10, "iso-8859-3", 10, MyHTML_ENCODING_ISO_8859_3, 480, 338}, - {"iso-8859-4", 10, "l4", 2, MyHTML_ENCODING_ISO_8859_4, 0, 339}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1253", 12, "windows-1253", 12, MyHTML_ENCODING_WINDOWS_1253, 0, 342}, - {"iso-8859-5", 10, "iso-8859-5", 10, MyHTML_ENCODING_ISO_8859_5, 482, 343}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-6", 10, "iso-ir-127", 10, MyHTML_ENCODING_ISO_8859_6, 484, 348}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"utf-8", 5, "unicode-1-1-utf-8", 17, MyHTML_ENCODING_UTF_8, 0, 350}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-10", 11, "l6", 2, MyHTML_ENCODING_ISO_8859_10, 0, 352}, - {"iso-8859-3", 10, "iso-ir-109", 10, MyHTML_ENCODING_ISO_8859_3, 487, 353}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1253", 12, "x-cp1253", 8, MyHTML_ENCODING_WINDOWS_1253, 0, 357}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-16", 11, "iso-8859-16", 11, MyHTML_ENCODING_ISO_8859_16, 490, 359}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-8-i", 12, "logical", 7, MyHTML_ENCODING_ISO_8859_8_I, 0, 363}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-8", 10, "csisolatinhebrew", 16, MyHTML_ENCODING_ISO_8859_8, 0, 366}, - {"iso-8859-3", 10, "latin3", 6, MyHTML_ENCODING_ISO_8859_3, 491, 367}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-kr", 6, "euc-kr", 6, MyHTML_ENCODING_EUC_KR, 0, 369}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1252", 12, "cp1252", 6, MyHTML_ENCODING_WINDOWS_1252, 0, 371}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-6", 10, "csiso88596i", 11, MyHTML_ENCODING_ISO_8859_6, 492, 378}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"gbk", 3, "gbk", 3, MyHTML_ENCODING_GBK, 0, 382}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-kr", 6, "csksc56011987", 13, MyHTML_ENCODING_EUC_KR, 0, 394}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"x-mac-cyrillic", 14, "x-mac-cyrillic", 14, MyHTML_ENCODING_X_MAC_CYRILLIC, 0, 397}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-2", 10, "csisolatin2", 11, MyHTML_ENCODING_ISO_8859_2, 0, 400}, - {"x-user-defined", 14, "x-user-defined", 14, MyHTML_ENCODING_X_USER_DEFINED, 0, 401}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1254", 12, "latin5", 6, MyHTML_ENCODING_WINDOWS_1254, 0, 406}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"windows-1257", 12, "cp1257", 6, MyHTML_ENCODING_WINDOWS_1257, 0, 408}, - {"big5", 4, "big5-hkscs", 10, MyHTML_ENCODING_BIG5, 0, 409}, - {"windows-1250", 12, "x-cp1250", 8, MyHTML_ENCODING_WINDOWS_1250, 0, 410}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"euc-jp", 6, "euc-jp", 6, MyHTML_ENCODING_EUC_JP, 0, 414}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"iso-8859-7", 10, "ecma-118", 8, MyHTML_ENCODING_ISO_8859_7, 493, 416}, - {NULL, 0, NULL, 0, 0, 0, 0}, - {"gbk", 3, "gb_2312-80", 10, MyHTML_ENCODING_GBK, 0, 418}, - {"windows-1251", 12, "windows-1251", 12, MyHTML_ENCODING_WINDOWS_1251, 0, 419}, - {"iso-8859-13", 11, "iso885913", 9, MyHTML_ENCODING_ISO_8859_13, 0, 420}, - {"windows-1256", 12, "windows-1256", 12, MyHTML_ENCODING_WINDOWS_1256, 0, 421}, - {"iso-8859-5", 10, "csisolatincyrillic", 18, MyHTML_ENCODING_ISO_8859_5, 0, 422}, - {"gbk", 3, "chinese", 7, MyHTML_ENCODING_GBK, 0, 423}, - {"shift_jis", 9, "shift_jis", 9, MyHTML_ENCODING_SHIFT_JIS, 0, 424}, - {"windows-874", 11, "iso-8859-11", 11, MyHTML_ENCODING_WINDOWS_874, 0, 425}, - {"iso-8859-15", 11, "iso_8859-15", 11, MyHTML_ENCODING_ISO_8859_15, 0, 426}, - {"big5", 4, "csbig5", 6, MyHTML_ENCODING_BIG5, 0, 427}, - {"iso-8859-8", 10, "hebrew", 6, MyHTML_ENCODING_ISO_8859_8, 429, 428}, - {"windows-1254", 12, "windows-1254", 12, MyHTML_ENCODING_WINDOWS_1254, 0, 429}, - {"iso-8859-5", 10, "iso88595", 8, MyHTML_ENCODING_ISO_8859_5, 0, 430}, - {"iso-8859-10", 11, "iso885910", 9, MyHTML_ENCODING_ISO_8859_10, 0, 431}, - {"windows-1254", 12, "iso_8859-9:1989", 15, MyHTML_ENCODING_WINDOWS_1254, 0, 432}, - {"iso-8859-7", 10, "iso88597", 8, MyHTML_ENCODING_ISO_8859_7, 434, 433}, - {"iso-8859-6", 10, "csisolatinarabic", 16, MyHTML_ENCODING_ISO_8859_6, 0, 434}, - {"windows-1251", 12, "x-cp1251", 8, MyHTML_ENCODING_WINDOWS_1251, 0, 435}, - {"iso-8859-14", 11, "iso885914", 9, MyHTML_ENCODING_ISO_8859_14, 0, 436}, - {"iso-8859-10", 11, "iso8859-10", 10, MyHTML_ENCODING_ISO_8859_10, 438, 437}, - {"windows-1252", 12, "iso-ir-100", 10, MyHTML_ENCODING_WINDOWS_1252, 0, 438}, - {"iso-8859-2", 10, "iso_8859-2", 10, MyHTML_ENCODING_ISO_8859_2, 0, 439}, - {"iso-8859-8", 10, "iso8859-8", 9, MyHTML_ENCODING_ISO_8859_8, 441, 440}, - {"gbk", 3, "iso-ir-58", 9, MyHTML_ENCODING_GBK, 442, 441}, - {"macintosh", 9, "csmacintosh", 11, MyHTML_ENCODING_MACINTOSH, 0, 442}, - {"iso-8859-4", 10, "iso_8859-4", 10, MyHTML_ENCODING_ISO_8859_4, 444, 443}, - {"iso-8859-5", 10, "iso-ir-144", 10, MyHTML_ENCODING_ISO_8859_5, 445, 444}, - {"iso-8859-14", 11, "iso8859-14", 10, MyHTML_ENCODING_ISO_8859_14, 0, 445}, - {"iso-8859-6", 10, "iso-8859-6", 10, MyHTML_ENCODING_ISO_8859_6, 447, 446}, - {"iso-8859-6", 10, "iso_8859-6", 10, MyHTML_ENCODING_ISO_8859_6, 448, 447}, - {"iso-8859-7", 10, "iso-ir-126", 10, MyHTML_ENCODING_ISO_8859_7, 0, 448}, - {"iso-8859-8", 10, "iso-ir-138", 10, MyHTML_ENCODING_ISO_8859_8, 450, 449}, - {"iso-8859-8", 10, "iso_8859-8", 10, MyHTML_ENCODING_ISO_8859_8, 451, 450}, - {"windows-1254", 12, "iso-ir-148", 10, MyHTML_ENCODING_WINDOWS_1254, 0, 451}, - {"big5", 4, "x-x-big5", 8, MyHTML_ENCODING_BIG5, 0, 452}, - {"iso-8859-4", 10, "iso_8859-4:1988", 15, MyHTML_ENCODING_ISO_8859_4, 454, 453}, - {"iso-8859-5", 10, "iso_8859-5:1988", 15, MyHTML_ENCODING_ISO_8859_5, 455, 454}, - {"iso-8859-8", 10, "iso_8859-8:1988", 15, MyHTML_ENCODING_ISO_8859_8, 0, 455}, - {"iso-8859-8", 10, "csiso88598e", 11, MyHTML_ENCODING_ISO_8859_8, 0, 456}, - {"iso-8859-10", 11, "latin6", 6, MyHTML_ENCODING_ISO_8859_10, 458, 457}, - {"windows-874", 11, "iso885911", 9, MyHTML_ENCODING_WINDOWS_874, 459, 458}, - {"windows-1252", 12, "iso8859-1", 9, MyHTML_ENCODING_WINDOWS_1252, 0, 459}, - {"iso-8859-15", 11, "iso885915", 9, MyHTML_ENCODING_ISO_8859_15, 0, 460}, - {"macintosh", 9, "x-mac-roman", 11, MyHTML_ENCODING_MACINTOSH, 0, 461}, - {"koi8-r", 6, "cskoi8r", 7, MyHTML_ENCODING_KOI8_R, 463, 462}, - {"euc-kr", 6, "cseuckr", 7, MyHTML_ENCODING_EUC_KR, 0, 463}, - {"x-mac-cyrillic", 14, "x-mac-ukrainian", 15, MyHTML_ENCODING_X_MAC_CYRILLIC, 0, 464}, - {"windows-1252", 12, "x-cp1252", 8, MyHTML_ENCODING_WINDOWS_1252, 0, 465}, - {"iso-8859-13", 11, "iso-8859-13", 11, MyHTML_ENCODING_ISO_8859_13, 0, 466}, - {"gb18030", 7, "gb18030", 7, MyHTML_ENCODING_GB18030, 0, 467}, - {"utf-16le", 8, "utf-16le", 8, MyHTML_ENCODING_UTF_16LE, 0, 468}, - {"koi8-r", 6, "koi8_r", 6, MyHTML_ENCODING_KOI8_R, 0, 469}, - {"shift_jis", 9, "csshiftjis", 10, MyHTML_ENCODING_SHIFT_JIS, 0, 470}, - {"iso-8859-6", 10, "iso-8859-6-e", 12, MyHTML_ENCODING_ISO_8859_6, 472, 471}, - {"iso-8859-8", 10, "iso-8859-8-e", 12, MyHTML_ENCODING_ISO_8859_8, 0, 472}, - {"iso-8859-6", 10, "iso_8859-6:1987", 15, MyHTML_ENCODING_ISO_8859_6, 474, 473}, - {"iso-8859-7", 10, "iso_8859-7:1987", 15, MyHTML_ENCODING_ISO_8859_7, 475, 474}, - {"windows-1252", 12, "iso_8859-1:1987", 15, MyHTML_ENCODING_WINDOWS_1252, 0, 475}, - {"iso-8859-8-i", 12, "iso-8859-8-i", 12, MyHTML_ENCODING_ISO_8859_8_I, 0, 476}, - {"windows-874", 11, "iso8859-11", 10, MyHTML_ENCODING_WINDOWS_874, 478, 477}, - {"windows-1252", 12, "iso-8859-1", 10, MyHTML_ENCODING_WINDOWS_1252, 479, 478}, - {"windows-1252", 12, "iso_8859-1", 10, MyHTML_ENCODING_WINDOWS_1252, 0, 479}, - {"iso-8859-3", 10, "iso_8859-3", 10, MyHTML_ENCODING_ISO_8859_3, 481, 480}, - {"iso-8859-13", 11, "iso8859-13", 10, MyHTML_ENCODING_ISO_8859_13, 0, 481}, - {"iso-8859-5", 10, "iso_8859-5", 10, MyHTML_ENCODING_ISO_8859_5, 483, 482}, - {"iso-8859-15", 11, "iso8859-15", 10, MyHTML_ENCODING_ISO_8859_15, 0, 483}, - {"iso-8859-7", 10, "iso-8859-7", 10, MyHTML_ENCODING_ISO_8859_7, 485, 484}, - {"iso-8859-7", 10, "iso_8859-7", 10, MyHTML_ENCODING_ISO_8859_7, 486, 485}, - {"iso-8859-10", 11, "iso-ir-157", 10, MyHTML_ENCODING_ISO_8859_10, 0, 486}, - {"windows-1254", 12, "iso-8859-9", 10, MyHTML_ENCODING_WINDOWS_1254, 488, 487}, - {"windows-1254", 12, "iso_8859-9", 10, MyHTML_ENCODING_WINDOWS_1254, 489, 488}, - {"euc-kr", 6, "iso-ir-149", 10, MyHTML_ENCODING_EUC_KR, 0, 489}, - {"windows-1258", 12, "windows-1258", 12, MyHTML_ENCODING_WINDOWS_1258, 0, 490}, - {"windows-874", 11, "dos-874", 7, MyHTML_ENCODING_WINDOWS_874, 0, 491}, - {"iso-8859-8-i", 12, "csiso88598i", 11, MyHTML_ENCODING_ISO_8859_8_I, 0, 492}, - {"iso-8859-7", 10, "elot_928", 8, MyHTML_ENCODING_ISO_8859_7, 0, 493}, -}; - -static const myhtml_encoding_entry_name_index_t myhtml_encoding_entry_name_index_static_list_index[(MyHTML_ENCODING_LAST_ENTRY + 1)] = -{ - {"UTF-8", 5}, - {"AUTO", 4}, - {"NOT-DETERMINED", 14}, - {"UTF-16LE", 8}, - {"UTF-16BE", 8}, - {"X-USER-DEFINED", 14}, - {"BIG5", 4}, - {"EUC-JP", 6}, - {"EUC-KR", 6}, - {"GB18030", 7}, - {"GBK", 3}, - {"IBM866", 6}, - {"ISO-2022-JP", 11}, - {"ISO-8859-10", 11}, - {"ISO-8859-13", 11}, - {"ISO-8859-14", 11}, - {"ISO-8859-15", 11}, - {"ISO-8859-16", 11}, - {"ISO-8859-2", 10}, - {"ISO-8859-3", 10}, - {"ISO-8859-4", 10}, - {"ISO-8859-5", 10}, - {"ISO-8859-6", 10}, - {"ISO-8859-7", 10}, - {"ISO-8859-8", 10}, - {"ISO-8859-8-I", 12}, - {"KOI8-R", 6}, - {"KOI8-U", 6}, - {"MACINTOSH", 9}, - {"SHIFT_JIS", 9}, - {"WINDOWS-1250", 12}, - {"WINDOWS-1251", 12}, - {"WINDOWS-1252", 12}, - {"WINDOWS-1253", 12}, - {"WINDOWS-1254", 12}, - {"WINDOWS-1255", 12}, - {"WINDOWS-1256", 12}, - {"WINDOWS-1257", 12}, - {"WINDOWS-1258", 12}, - {"WINDOWS-874", 11}, - {"X-MAC-CYRILLIC", 14}, - {"", 0}, -}; - -static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_ibm866[] = { - {{0xA5, 0xAD, 0xA8}, 991}, /* ени */ - {{0xAE, 0xA3, 0xAE}, 806}, /* ого */ - {{0xE1, 0xE2, 0xA2}, 659}, /* ств */ - {{0xAD, 0xA8, 0xEF}, 629}, /* ния */ - {{0xAE, 0xA2, 0xA0}, 566}, /* ова */ - {{0xE2, 0xA5, 0xAB}, 555}, /* тел */ - {{0xE0, 0xA5, 0xA4}, 507}, /* ред */ - {{0xA5, 0xAD, 0xAD}, 499}, /* енн */ - {{0xAE, 0xA2, 0xAE}, 443}, /* ово */ - {{0xA0, 0xAD, 0xA8}, 443}, /* ани */ - {{0xE2, 0xE0, 0xA0}, 429}, /* тра */ - {{0xAE, 0xE1, 0xE2}, 428}, /* ост */ - {{0xAD, 0xA8, 0xA5}, 419}, /* ние */ - {{0xAD, 0xAD, 0xAE}, 412}, /* нно */ - {{0xA0, 0xE5, 0xAE}, 396}, /* ахо */ - {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ - {{0xE0, 0xA0, 0xE5}, 386}, /* рах */ - {{0xE5, 0xAE, 0xA2}, 379}, /* хов */ - {{0xA5, 0xAB, 0xEC}, 365}, /* ель */ - {{0xA3, 0xAE, 0xA2}, 360}, /* гов */ - {{0xA2, 0xAE, 0xE0}, 356}, /* вор */ - {{0xA5, 0xE1, 0xE2}, 349}, /* ест */ - {{0xA0, 0xE2, 0xEC}, 345}, /* ать */ - {{0xE0, 0xA0, 0xA2}, 337}, /* рав */ - {{0xAF, 0xE0, 0xA8}, 330}, /* при */ - {{0xAF, 0xE0, 0xA5}, 323}, /* пре */ - {{0xA4, 0xAE, 0xA3}, 318}, /* дог */ - {{0xAD, 0xA5, 0xAD}, 310}, /* нен */ - {{0xAF, 0xE0, 0xA0}, 309}, /* пра */ - {{0xA2, 0xA0, 0xAD}, 304}, /* ван */ - {{0xA8, 0xE2, 0xA5}, 295}, /* ите */ - {{0xE2, 0xA2, 0xA5}, 281}, /* тве */ - {{0xAB, 0xA5, 0xAD}, 266}, /* лен */ - {{0xE1, 0xE2, 0xAE}, 261}, /* сто */ - {{0xE2, 0xA0, 0xE2}, 260}, /* тат */ - {{0xAD, 0xAD, 0xEB}, 260}, /* нны */ - {{0xAB, 0xEC, 0xAD}, 256}, /* льн */ - {{0xA2, 0xAE, 0xA7}, 255}, /* воз */ - {{0xA8, 0xAB, 0xA8}, 254}, /* или */ - {{0xA0, 0xE2, 0xA5}, 252}, /* ате */ - {{0xA5, 0xA3, 0xAE}, 241}, /* его */ - {{0xA5, 0xE2, 0xE1}, 238}, /* етс */ - {{0xAD, 0xAE, 0xE1}, 236}, /* нос */ - {{0xE9, 0xA5, 0xE1}, 235}, /* щес */ - {{0xAF, 0xAE, 0xAB}, 232}, /* пол */ - {{0xE0, 0xA0, 0xAD}, 231}, /* ран */ - {{0xAD, 0xAE, 0xA3}, 230}, /* ног */ - {{0xE1, 0xE2, 0xA0}, 229}, /* ста */ - {{0xE7, 0xA5, 0xAD}, 226}, /* чен */ - {{0xE2, 0xE0, 0xA5}, 224}, /* тре */ - {{0xA7, 0xAC, 0xA5}, 214}, /* зме */ - {{0xE3, 0xE9, 0xA5}, 212}, /* уще */ - {{0xE1, 0xE2, 0xA8}, 210}, /* сти */ - {{0xAA, 0xAE, 0xAC}, 207}, /* ком */ - {{0xAE, 0xE0, 0xAE}, 206}, /* оро */ - {{0xA2, 0xAB, 0xA5}, 195}, /* вле */ - {{0xA7, 0xA0, 0xAD}, 194}, /* зан */ - {{0xA0, 0xE1, 0xE2}, 193}, /* аст */ - {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ - {{0xE5, 0xE0, 0xA0}, 187}, /* хра */ - {{0xA0, 0xAD, 0xAD}, 182}, /* анн */ - {{0xA5, 0xE0, 0xA5}, 182}, /* ере */ - {{0xA2, 0xE0, 0xA5}, 178}, /* вре */ - {{0xAE, 0xA2, 0xA5}, 173}, /* ове */ - {{0xEC, 0xAD, 0xAE}, 173}, /* ьно */ - {{0xA2, 0xA5, 0xE0}, 172}, /* вер */ - {{0xAC, 0xA5, 0xAD}, 170}, /* мен */ - {{0xAB, 0xA8, 0xE6}, 168}, /* лиц */ - {{0xE2, 0xAE, 0xE0}, 167}, /* тор */ - {{0xE0, 0xA5, 0xAD}, 167}, /* рен */ - {{0xE9, 0xA5, 0xAD}, 165}, /* щен */ - {{0xAE, 0xA7, 0xAC}, 164}, /* озм */ - {{0xA5, 0xA4, 0xA0}, 163}, /* еда */ - {{0xE2, 0xA2, 0xA8}, 159}, /* тви */ - {{0xEF, 0xA7, 0xA0}, 159}, /* яза */ - {{0xA1, 0xEF, 0xA7}, 158}, /* бяз */ - {{0xAD, 0xA8, 0xA8}, 153}, /* нии */ - {{0xAD, 0xEB, 0xE5}, 153}, /* ных */ - {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ - {{0xAC, 0xA5, 0xE0}, 153}, /* мер */ - {{0xE1, 0xAB, 0xA8}, 150}, /* сли */ - {{0xE2, 0xAE, 0xA2}, 148}, /* тов */ - {{0xE2, 0xA2, 0xA0}, 147}, /* тва */ - {{0xAE, 0xE0, 0xA0}, 146}, /* ора */ - {{0xAD, 0xAE, 0xAC}, 144}, /* ном */ - {{0xA4, 0xA5, 0xAD}, 144}, /* ден */ - {{0xA0, 0xAD, 0xA5}, 142}, /* ане */ - {{0xAA, 0xAE, 0xAD}, 141}, /* кон */ - {{0xAB, 0xE3, 0xE7}, 141}, /* луч */ - {{0xAC, 0xE3, 0xE9}, 140}, /* мущ */ - {{0xAE, 0xA1, 0xEF}, 140}, /* обя */ - {{0xA2, 0xA0, 0xE2}, 138}, /* ват */ - {{0xA2, 0xA0, 0xE0}, 137}, /* вар */ - {{0xA5, 0xE9, 0xA5}, 137}, /* еще */ - {{0xAE, 0xE2, 0xE0}, 137}, /* отр */ - {{0xA4, 0xA5, 0xAB}, 137}, /* дел */ - {{0xAD, 0xEB, 0xAC}, 136}, /* ным */ - {{0xA8, 0xAC, 0xE3}, 136}, /* иму */ - {{0x91, 0xE2, 0xA0}, 134}, /* Ста */ - {{0xE3, 0xE7, 0xA0}, 133}, /* уча */ - {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ - {{0xA5, 0xAB, 0xEF}, 130}, /* еля */ - {{0xE1, 0xAB, 0xE3}, 130}, /* слу */ - {{0xA7, 0xA0, 0xAA}, 130}, /* зак */ - {{0xE2, 0xAE, 0xEF}, 129}, /* тоя */ - {{0xAE, 0xAC, 0xA8}, 128}, /* оми */ - {{0xAC, 0xA5, 0xE9}, 128}, /* мещ */ - {{0xA5, 0xA4, 0xE3}, 127}, /* еду */ - {{0xA2, 0xA5, 0xAD}, 127}, /* вен */ - {{0xAD, 0xAE, 0xA2}, 127}, /* нов */ - {{0xAD, 0xAE, 0xA5}, 126}, /* ное */ - {{0xAE, 0xE2, 0xA2}, 125}, /* отв */ - {{0xAA, 0xA0, 0xA7}, 125}, /* каз */ - {{0xA0, 0xA5, 0xE2}, 125}, /* ает */ - {{0xE1, 0xAA, 0xAE}, 125}, /* ско */ - {{0xA5, 0xAD, 0xE2}, 124}, /* ент */ - {{0xAC, 0xAE, 0xE2}, 123}, /* мот */ - {{0xA0, 0xA2, 0xAB}, 122}, /* авл */ - {{0xE1, 0xAC, 0xAE}, 122}, /* смо */ - {{0xA8, 0xE7, 0xA8}, 121}, /* ичи */ - {{0xA1, 0xEB, 0xE2}, 120}, /* быт */ - {{0xE3, 0xE1, 0xAC}, 118}, /* усм */ - {{0xE1, 0xE1, 0xA8}, 117}, /* сси */ - {{0xA4, 0xE3, 0xE1}, 117}, /* дус */ - {{0xE5, 0xAE, 0xA4}, 117}, /* ход */ - {{0xE0, 0xA8, 0xE7}, 117}, /* рич */ - {{0xE7, 0xA5, 0xE1}, 115}, /* чес */ - {{0xA3, 0xE0, 0xA0}, 114}, /* гра */ - {{0xAF, 0xE0, 0xAE}, 114}, /* про */ - {{0xA4, 0xAE, 0xA2}, 113}, /* дов */ - {{0xA2, 0xA5, 0xE2}, 112}, /* вет */ - {{0xA5, 0xA4, 0xA5}, 112}, /* еде */ - {{0xE8, 0xA5, 0xAD}, 111}, /* шен */ - {{0xE7, 0xA8, 0xAD}, 110}, /* чин */ - {{0xAD, 0xA0, 0xE1}, 109}, /* нас */ - {{0xA8, 0xE2, 0xEC}, 105}, /* ить */ - {{0xE2, 0xA2, 0xAE}, 105}, /* тво */ - {{0xAA, 0xAB, 0xEE}, 104}, /* клю */ - {{0xE0, 0xA8, 0xE2}, 104}, /* рит */ - {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ - {{0xAB, 0xEE, 0xE7}, 104}, /* люч */ - {{0xE2, 0xAE, 0xAC}, 104}, /* том */ - {{0xE1, 0xAB, 0xA5}, 103}, /* сле */ - {{0xE1, 0xAF, 0xAE}, 102}, /* спо */ - {{0xAE, 0xAB, 0xAD}, 102}, /* олн */ - {{0xA5, 0xE1, 0xAB}, 102}, /* есл */ - {{0xA5, 0xE0, 0xA8}, 101}, /* ери */ - {{0xAD, 0xAE, 0xA9}, 101}, /* ной */ - {{0xE0, 0xAE, 0xAC}, 101}, /* ром */ - {{0xAE, 0xE2, 0xAE}, 99}, /* ото */ - {{0xAD, 0xEB, 0xA5}, 99}, /* ные */ - {{0xA7, 0xAD, 0xA0}, 99}, /* зна */ - {{0xA2, 0xAB, 0xEF}, 99}, /* вля */ - {{0xE2, 0xA5, 0xE0}, 98}, /* тер */ - {{0xE3, 0xAF, 0xE0}, 97}, /* упр */ - {{0xA0, 0xAA, 0xAE}, 96}, /* ако */ - {{0xAA, 0xAE, 0xA3}, 96}, /* ког */ - {{0xAD, 0xEB, 0xA9}, 96}, /* ный */ - {{0xAE, 0xE0, 0xE3}, 96}, /* ору */ - {{0xA5, 0xAB, 0xA5}, 95}, /* еле */ - {{0xA5, 0xE1, 0xAA}, 95}, /* еск */ - {{0xA0, 0xA7, 0xA0}, 95}, /* аза */ - {{0xA9, 0xE1, 0xE2}, 93}, /* йст */ - {{0xAF, 0xAE, 0xE0}, 93}, /* пор */ - {{0xAE, 0xA6, 0xA5}, 92}, /* оже */ - {{0xA8, 0xAD, 0xA5}, 91}, /* ине */ - {{0xE9, 0xA5, 0xA9}, 90}, /* щей */ - {{0xA6, 0xA4, 0xA5}, 90}, /* жде */ - {{0xAF, 0xA5, 0xE0}, 89}, /* пер */ - {{0xAD, 0xA8, 0xE2}, 89}, /* нит */ - {{0xAE, 0xAB, 0xEC}, 89}, /* оль */ - {{0xA0, 0xA6, 0xA4}, 88}, /* ажд */ - {{0xA6, 0xA5, 0xAD}, 87}, /* жен */ - {{0xAB, 0xA0, 0xA4}, 87}, /* лад */ - {{0xA0, 0xAC, 0xA8}, 87}, /* ами */ - {{0xAA, 0xAE, 0xE2}, 86}, /* кот */ - {{0xE7, 0xA0, 0xA5}, 85}, /* чае */ - {{0xA2, 0xA5, 0xE9}, 85}, /* вещ */ - {{0xA2, 0xA8, 0xEF}, 85}, /* вия */ - {{0xEF, 0xE9, 0xA5}, 85}, /* яще */ - {{0xA8, 0xA5, 0xAC}, 85}, /* ием */ - {{0xAA, 0xAB, 0xA0}, 85}, /* кла */ - {{0xA5, 0xA9, 0xE1}, 84}, /* ейс */ - {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ - {{0xA0, 0xA2, 0xAE}, 84}, /* аво */ - {{0xE0, 0xA0, 0xA6}, 83}, /* раж */ - {{0xAB, 0xEC, 0xE1}, 83}, /* льс */ - {{0xAE, 0xEF, 0xE9}, 82}, /* оящ */ - {{0xA5, 0xAD, 0xAE}, 81}, /* ено */ - {{0xA4, 0xE1, 0xE2}, 81}, /* дст */ - {{0xA4, 0xA5, 0xA9}, 80}, /* дей */ - {{0xE0, 0xA5, 0xA1}, 80}, /* реб */ - {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ - {{0xA5, 0xA4, 0xE1}, 79}, /* едс */ - {{0xA0, 0xE0, 0xA8}, 79}, /* ари */ - {{0xA4, 0xA0, 0xAD}, 79}, /* дан */ - {{0xAC, 0xAE, 0xA6}, 78}, /* мож */ - {{0xA8, 0xAC, 0xA5}, 78}, /* име */ - {{0xA8, 0xAD, 0xAE}, 78}, /* ино */ - {{0xE0, 0xA8, 0xAD}, 77}, /* рин */ - {{0xA4, 0xAE, 0xE1}, 77}, /* дос */ - {{0xAF, 0xAE, 0xE1}, 77}, /* пос */ - {{0xE2, 0xA0, 0xAA}, 77}, /* так */ - {{0xE9, 0xA5, 0xA3}, 77}, /* щег */ - {{0xA4, 0xA0, 0xE2}, 77}, /* дат */ - {{0xAF, 0xAB, 0xA0}, 76}, /* пла */ - {{0xE3, 0xE1, 0xAB}, 76}, /* усл */ - {{0xA8, 0xE6, 0xA0}, 76}, /* ица */ - {{0xE0, 0xAE, 0xA2}, 75}, /* ров */ - {{0xED, 0xE2, 0xAE}, 75}, /* это */ - {{0xE3, 0xE7, 0xA5}, 74}, /* уче */ - {{0xA4, 0xAE, 0xAB}, 73}, /* дол */ - {{0xEC, 0xAD, 0xEB}, 73}, /* ьны */ - {{0xE0, 0xA0, 0xA7}, 73}, /* раз */ - {{0xAC, 0xA8, 0xE1}, 73}, /* мис */ - {{0xA0, 0xAD, 0xAE}, 72}, /* ано */ - {{0xE1, 0xE0, 0xAE}, 72}, /* сро */ - {{0xA0, 0xA2, 0xA8}, 72}, /* ави */ - {{0xE2, 0xEC, 0xA8}, 71}, /* тьи */ - {{0xEE, 0xE7, 0xA5}, 70}, /* юче */ - {{0xE1, 0xAA, 0xAB}, 70}, /* скл */ - {{0xA8, 0xE1, 0xE1}, 70}, /* исс */ - {{0xA6, 0xA5, 0xE2}, 69}, /* жет */ - {{0xA5, 0xA4, 0xAE}, 69}, /* едо */ - {{0xAB, 0xA5, 0xA4}, 69}, /* лед */ - {{0xAB, 0xAE, 0xA2}, 69}, /* лов */ - {{0xEE, 0xE9, 0xA8}, 68}, /* ющи */ - {{0xA8, 0xA1, 0xAE}, 68}, /* ибо */ - {{0xAB, 0xA0, 0xE2}, 67}, /* лат */ - {{0xE0, 0xAE, 0xAA}, 67}, /* рок */ - {{0xA0, 0xAA, 0xAB}, 67}, /* акл */ - {{0xE0, 0xA8, 0xE9}, 67}, /* рищ */ - {{0xA1, 0xAE, 0xA2}, 67}, /* бов */ - {{0xA8, 0xE1, 0xAA}, 67}, /* иск */ - {{0xA5, 0xA1, 0xAE}, 67}, /* ебо */ - {{0xAB, 0xEC, 0xA7}, 67}, /* льз */ - {{0xE3, 0xAA, 0xA0}, 67}, /* ука */ - {{0xAB, 0xA8, 0xA1}, 66}, /* либ */ - {{0xAE, 0xAC, 0xE3}, 66}, /* ому */ - {{0xAE, 0xA2, 0xAB}, 66}, /* овл */ - {{0xE2, 0xAD, 0xAE}, 65}, /* тно */ - {{0xA2, 0xAE, 0xA9}, 64}, /* вой */ - {{0xE2, 0xAE, 0xA3}, 64}, /* тог */ - {{0xE1, 0xAB, 0xAE}, 64}, /* сло */ - {{0xAE, 0xA7, 0xAD}, 64}, /* озн */ - {{0xE1, 0xAE, 0xAE}, 64}, /* соо */ - {{0xA7, 0xA0, 0xE2}, 63}, /* зат */ - {{0xA8, 0xE1, 0xAF}, 63}, /* исп */ - {{0xA0, 0xE7, 0xA5}, 63}, /* аче */ - {{0xAD, 0xA8, 0xEE}, 63}, /* нию */ - {{0xAE, 0xAD, 0xA5}, 63}, /* оне */ - {{0xAE, 0xAB, 0xA6}, 62}, /* олж */ - {{0xAE, 0xA2, 0xE9}, 61}, /* овщ */ - {{0xE0, 0xA0, 0xE1}, 61}, /* рас */ - {{0xA2, 0xA8, 0xA4}, 61}, /* вид */ - {{0xA2, 0xE9, 0xA8}, 61}, /* вщи */ - {{0xE1, 0xAD, 0xAE}, 61}, /* сно */ - {{0xA8, 0xE6, 0xAE}, 61}, /* ицо */ - {{0xA8, 0xE7, 0xA5}, 61}, /* иче */ - {{0xA0, 0xA2, 0xA5}, 61}, /* аве */ - {{0xA3, 0xAB, 0xA0}, 61}, /* гла */ - {{0xE7, 0xA5, 0xE2}, 61}, /* чет */ - {{0xE9, 0xA8, 0xAA}, 61}, /* щик */ - {{0xE0, 0xE3, 0xA3}, 60}, /* руг */ - {{0xE2, 0xA0, 0xAD}, 60}, /* тан */ - {{0xA8, 0xAC, 0xAE}, 60}, /* имо */ - {{0xA0, 0xAB, 0xEC}, 60}, /* аль */ - {{0xAE, 0xA2, 0xA8}, 60}, /* ови */ - {{0xA6, 0xA4, 0xA0}, 60}, /* жда */ - {{0xAF, 0xAE, 0xA2}, 60}, /* пов */ - {{0xA5, 0xAC, 0xE3}, 60}, /* ему */ - {{0xEF, 0xE2, 0xA5}, 60}, /* яте */ - {{0xE1, 0xA8, 0xA8}, 59}, /* сии */ - {{0xA1, 0xAE, 0xE2}, 59}, /* бот */ - {{0xA2, 0xEB, 0xAF}, 59}, /* вып */ - {{0xA0, 0xA1, 0xAE}, 59}, /* або */ - {{0xAB, 0xEF, 0xEE}, 59}, /* ляю */ - {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ - {{0xAE, 0xA4, 0xA5}, 58}, /* оде */ - {{0xA8, 0xAD, 0xA8}, 58}, /* ини */ - {{0xE0, 0xA0, 0xE2}, 58}, /* рат */ - {{0xEF, 0xA2, 0xAB}, 58}, /* явл */ - {{0xAD, 0xA0, 0xA3}, 57}, /* наг */ - {{0xA4, 0xE0, 0xE3}, 57}, /* дру */ - {{0xE0, 0xA0, 0xA1}, 57}, /* раб */ - {{0xA0, 0xA3, 0xE0}, 57}, /* агр */ - {{0xA8, 0xAE, 0xAD}, 57}, /* ион */ - {{0xAC, 0xA5, 0xE1}, 57}, /* мес */ - {{0xA0, 0xE6, 0xA8}, 56}, /* аци */ - {{0xAE, 0xE1, 0xE3}, 56}, /* осу */ - {{0xAA, 0xAE, 0xA9}, 55}, /* кой */ - {{0xE1, 0xA2, 0xAE}, 55}, /* сво */ - {{0xA7, 0xAE, 0xA2}, 55}, /* зов */ - {{0xAE, 0xAF, 0xE0}, 54}, /* опр */ - {{0xE1, 0xAE, 0xA1}, 54}, /* соб */ - {{0xA2, 0xAF, 0xE0}, 54}, /* впр */ - {{0xAB, 0xAD, 0xA5}, 54}, /* лне */ - {{0xAE, 0xAC, 0xAC}, 54}, /* омм */ - {{0xA5, 0xE0, 0xA0}, 54}, /* ера */ - {{0xE7, 0xA8, 0xE2}, 54}, /* чит */ - {{0xA5, 0xE0, 0xE7}, 54}, /* ерч */ - {{0xE0, 0xE7, 0xA5}, 54}, /* рче */ - {{0xA0, 0xE2, 0xA8}, 54}, /* ати */ - {{0xAD, 0xA8, 0xAA}, 54}, /* ник */ - {{0xAC, 0xAC, 0xA5}, 54}, /* мме */ - {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ - {{0xE2, 0xA5, 0xAD}, 53}, /* тен */ - {{0xA2, 0xA5, 0xA4}, 53}, /* вед */ - {{0xE1, 0xAE, 0xA2}, 52}, /* сов */ - {{0xA0, 0xA6, 0xA5}, 52}, /* аже */ - {{0xAE, 0xAA, 0xA0}, 52}, /* ока */ - {{0xEB, 0xAC, 0xA8}, 52}, /* ыми */ - {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ - {{0xAE, 0xAE, 0xE2}, 52}, /* оот */ - {{0xAC, 0xA8, 0xE2}, 52}, /* мит */ - {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ - {{0xA2, 0xE8, 0xA5}, 51}, /* вше */ - {{0xE1, 0xA8, 0xAE}, 51}, /* сио */ - {{0xAE, 0xAD, 0xAE}, 51}, /* оно */ - {{0xA0, 0xA2, 0xA0}, 51}, /* ава */ - {{0xA0, 0xE9, 0xA5}, 51}, /* аще */ - {{0xAB, 0xEF, 0xA5}, 50}, /* ляе */ - {{0xA5, 0xAD, 0xA5}, 50}, /* ене */ - {{0xAE, 0xA4, 0xA8}, 50}, /* оди */ - {{0xAF, 0xE3, 0xAD}, 49}, /* пун */ - {{0xAB, 0xA8, 0xE7}, 49}, /* лич */ - {{0xA2, 0xAE, 0xAC}, 49}, /* вом */ - {{0xAD, 0xAA, 0xE2}, 49}, /* нкт */ - {{0xAD, 0xA5, 0xE1}, 49}, /* нес */ - {{0xA2, 0xA8, 0xAB}, 49}, /* вил */ - {{0xA5, 0xA6, 0xA4}, 49}, /* ежд */ - {{0xE0, 0xA5, 0xE1}, 49}, /* рес */ - {{0xEE, 0xE9, 0xA5}, 49}, /* юще */ - {{0xEC, 0xA7, 0xAE}, 49}, /* ьзо */ - {{0xAF, 0xAE, 0xE2}, 49}, /* пот */ - {{0xE3, 0xAD, 0xAA}, 49}, /* унк */ - {{0xE1, 0xE2, 0xA5}, 49}, /* сте */ - {{0xAA, 0xAE, 0xA2}, 49}, /* ков */ - {{0xAE, 0xE1, 0xAB}, 48}, /* осл */ - {{0xEF, 0xA5, 0xE2}, 48}, /* яет */ - {{0x85, 0xE1, 0xAB}, 48}, /* Есл */ - {{0x8F, 0xE0, 0xA8}, 48}, /* При */ - {{0xE2, 0xA0, 0xA2}, 48}, /* тав */ - {{0xAD, 0xA5, 0xE0}, 48}, /* нер */ - {{0xE7, 0xAD, 0xAE}, 47}, /* чно */ - {{0xAF, 0xAE, 0xA4}, 47}, /* под */ - {{0xAD, 0xE2, 0xA0}, 47}, /* нта */ - {{0xA8, 0xE9, 0xA5}, 47}, /* ище */ - {{0xAE, 0xA1, 0xE9}, 47}, /* общ */ - {{0xA0, 0xA7, 0xAC}, 47}, /* азм */ - {{0xA6, 0xAD, 0xAE}, 47}, /* жно */ - {{0xA2, 0xA8, 0xA8}, 46}, /* вии */ - {{0xE0, 0xA0, 0xE9}, 46}, /* ращ */ - {{0xAE, 0xE0, 0xA5}, 46}, /* оре */ - {{0xA2, 0xE8, 0xA8}, 46}, /* вши */ - {{0xA5, 0xAA, 0xE1}, 46}, /* екс */ - {{0xA2, 0xAE, 0xA3}, 46}, /* вог */ - {{0xE7, 0xE2, 0xAE}, 46}, /* что */ - {{0xA8, 0xE7, 0xAD}, 45}, /* ичн */ - {{0xAB, 0xA5, 0xAC}, 45}, /* лем */ - {{0xAC, 0xAE, 0xA3}, 45}, /* мог */ - {{0xE2, 0xA2, 0xAB}, 45}, /* твл */ - {{0xA4, 0xAB, 0xA5}, 45}, /* дле */ - {{0xA4, 0xAB, 0xEF}, 45}, /* для */ - {{0xE0, 0xA5, 0xE2}, 45}, /* рет */ - {{0xA0, 0xE0, 0xA0}, 45}, /* ара */ - {{0xAD, 0xEF, 0xE2}, 44}, /* нят */ - {{0xA5, 0xE7, 0xA5}, 44}, /* ече */ - {{0xAE, 0xE2, 0xA5}, 44}, /* оте */ - {{0xAE, 0xE0, 0xEB}, 44}, /* оры */ - {{0xAE, 0xE1, 0xAD}, 43}, /* осн */ - {{0xAE, 0xA1, 0xAE}, 43}, /* обо */ - {{0xAE, 0xA3, 0xAB}, 43}, /* огл */ - {{0xA8, 0xAD, 0xEB}, 43}, /* ины */ - {{0xA5, 0xE1, 0xE1}, 43}, /* есс */ - {{0xAE, 0xA1, 0xE0}, 43}, /* обр */ - {{0xAA, 0xE0, 0xA0}, 43}, /* кра */ - {{0xA8, 0xEF, 0xAC}, 43}, /* иям */ - {{0xA0, 0xAB, 0xAE}, 43}, /* ало */ - {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ - {{0xAE, 0xE0, 0xA3}, 43}, /* орг */ - {{0xE7, 0xA0, 0xEF}, 42}, /* чая */ - {{0xAD, 0xA8, 0xAC}, 42}, /* ним */ - {{0xA8, 0xA7, 0xAD}, 42}, /* изн */ - {{0xAF, 0xAE, 0xAA}, 42}, /* пок */ - {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ - {{0xA5, 0xAB, 0xEE}, 42}, /* елю */ - {{0xE2, 0xA8, 0xE2}, 42}, /* тит */ - {{0xE6, 0xA5, 0xAD}, 42}, /* цен */ - {{0xE7, 0xA0, 0xE1}, 42}, /* час */ - {{0xA3, 0xA0, 0xAD}, 42}, /* ган */ - {{0xE0, 0xA3, 0xA0}, 42}, /* рга */ - {{0xE1, 0xE2, 0xAD}, 42}, /* стн */ - {{0xE0, 0xA5, 0xA6}, 42}, /* реж */ - {{0xE3, 0xAC, 0xAC}, 42}, /* умм */ - {{0xE2, 0xA2, 0xE3}, 41}, /* тву */ - {{0xE2, 0xE3, 0xAF}, 41}, /* туп */ - {{0xE1, 0xAA, 0xA8}, 40}, /* ски */ - {{0xA4, 0xA5, 0xAA}, 40}, /* дек */ - {{0xAB, 0xA5, 0xA6}, 40}, /* леж */ - {{0xA5, 0xE1, 0xA5}, 40}, /* есе */ - {{0xA2, 0xA8, 0xA5}, 40}, /* вие */ - {{0xE2, 0xAA, 0xA0}, 40}, /* тка */ - {{0xA5, 0xAA, 0xE0}, 40}, /* екр */ - {{0xAE, 0xA4, 0xAE}, 40}, /* одо */ - {{0xAA, 0xE1, 0xA0}, 40}, /* кса */ - {{0xE0, 0xA5, 0xAA}, 40}, /* рек */ - {{0xAD, 0xE2, 0xA5}, 40}, /* нте */ - {{0xE3, 0xA3, 0xA8}, 40}, /* уги */ - {{0xA1, 0xEB, 0xAB}, 40}, /* был */ - {{0xA8, 0xAD, 0xEF}, 40}, /* иня */ - {{0xA5, 0xE9, 0xA8}, 39}, /* ещи */ - {{0xA3, 0xA5, 0xAD}, 39}, /* ген */ - {{0x8A, 0xAE, 0xA4}, 39}, /* Код */ - {{0xA4, 0xA8, 0xE2}, 39}, /* дит */ - {{0xE1, 0xE5, 0xAE}, 39}, /* схо */ - {{0xA8, 0xAD, 0xE2}, 39}, /* инт */ - {{0xE1, 0xE3, 0xAC}, 39}, /* сум */ - {{0xE0, 0xAE, 0xAD}, 39}, /* рон */ - {{0xAE, 0xE2, 0xAA}, 39}, /* отк */ - {{0xA4, 0xAE, 0xAA}, 39}, /* док */ - {{0xA8, 0xAB, 0xA0}, 38}, /* ила */ - {{0xE6, 0xA5, 0xE1}, 38}, /* цес */ - {{0xA8, 0xAA, 0xA0}, 38}, /* ика */ - {{0xA7, 0xAD, 0xA8}, 38}, /* зни */ - {{0xAE, 0xA2, 0xEB}, 38}, /* овы */ - {{0xAB, 0xA6, 0xAD}, 38}, /* лжн */ - {{0xE3, 0xAF, 0xAB}, 38}, /* упл */ - {{0xA3, 0xA4, 0xA0}, 37}, /* гда */ - {{0xAB, 0xA0, 0xA6}, 37}, /* лаж */ - {{0xA6, 0xA5, 0xA4}, 37}, /* жед */ - {{0xA1, 0xA5, 0xA7}, 37}, /* без */ - {{0xA4, 0xA5, 0xE2}, 37}, /* дет */ - {{0xAE, 0xE0, 0xEF}, 37}, /* оря */ - {{0xE0, 0xAE, 0xE1}, 37}, /* рос */ - {{0xAE, 0xA1, 0xAB}, 37}, /* обл */ - {{0xE6, 0xA8, 0xA8}, 37}, /* ции */ - {{0xA4, 0xAE, 0xAC}, 37}, /* дом */ - {{0xAD, 0xE6, 0xA5}, 37}, /* нце */ - {{0xE8, 0xA5, 0xA3}, 37}, /* шег */ - {{0xAB, 0xAE, 0xA6}, 37}, /* лож */ - {{0xAE, 0xAD, 0xA0}, 37}, /* она */ - {{0xAE, 0xAA, 0xAB}, 37}, /* окл */ - {{0xAE, 0xA3, 0xA4}, 37}, /* огд */ - {{0xE0, 0xAE, 0xA4}, 37}, /* род */ - {{0xA5, 0xAD, 0xA0}, 37}, /* ена */ - {{0xAE, 0xAD, 0xE6}, 37}, /* онц */ - {{0xAE, 0xE2, 0xAD}, 37}, /* отн */ - {{0xE1, 0xAE, 0xA3}, 37}, /* сог */ - {{0xA5, 0xA2, 0xE8}, 37}, /* евш */ - {{0xA2, 0xA8, 0xE2}, 36}, /* вит */ - {{0xA5, 0xE0, 0xAF}, 36}, /* ерп */ - {{0xAE, 0xA4, 0xA0}, 36}, /* ода */ - {{0xA5, 0xE2, 0xA5}, 36}, /* ете */ - {{0xAD, 0xA5, 0xAE}, 36}, /* нео */ - {{0xE0, 0xAF, 0xA5}, 36}, /* рпе */ - {{0xA5, 0xE0, 0xE8}, 36}, /* ерш */ - {{0xA8, 0xAC, 0xA8}, 36}, /* ими */ - {{0xA8, 0xA2, 0xE8}, 36}, /* ивш */ - {{0xEB, 0xAF, 0xAB}, 36}, /* ыпл */ - {{0xAF, 0xA5, 0xA2}, 36}, /* пев */ - {{0xA0, 0xA4, 0xA0}, 36}, /* ада */ - {{0xAC, 0xAE, 0xE1}, 35}, /* мос */ - {{0xAE, 0xA1, 0xE1}, 35}, /* обс */ - {{0xAD, 0xA5, 0xA4}, 34}, /* нед */ - {{0xA8, 0xAA, 0xAE}, 34}, /* ико */ - {{0xE9, 0xA8, 0xAC}, 34}, /* щим */ - {{0xA4, 0xA5, 0xE0}, 34}, /* дер */ - {{0xE1, 0xAA, 0xA0}, 34}, /* ска */ - {{0xAE, 0xE0, 0xAC}, 34}, /* орм */ - {{0xE3, 0xAC, 0xA5}, 34}, /* уме */ - {{0xAE, 0xAE, 0xA1}, 34}, /* ооб */ - {{0xE0, 0xA8, 0xE1}, 34}, /* рис */ - {{0xAE, 0xA1, 0xEA}, 33}, /* объ */ - {{0xAE, 0xAB, 0xE3}, 33}, /* олу */ - {{0xEA, 0xEF, 0xA2}, 33}, /* ъяв */ - {{0xE0, 0xA5, 0xAC}, 33}, /* рем */ - {{0xE9, 0xA8, 0xE5}, 33}, /* щих */ - {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ - {{0xAA, 0xA6, 0xA5}, 33}, /* кже */ - {{0xA8, 0xA4, 0xA5}, 33}, /* иде */ - {{0xA1, 0xE1, 0xE2}, 33}, /* бст */ - {{0xA0, 0xAA, 0xA6}, 33}, /* акж */ - {{0xA2, 0xE3, 0xEE}, 33}, /* вую */ - {{0xA0, 0xE1, 0xE5}, 33}, /* асх */ - {{0xA0, 0xAD, 0xA0}, 32}, /* ана */ - {{0xAD, 0xA0, 0xA4}, 32}, /* над */ - {{0xAE, 0xA1, 0xA5}, 32}, /* обе */ - {{0xEB, 0xE2, 0xAA}, 32}, /* ытк */ - {{0xED, 0xE2, 0xA8}, 32}, /* эти */ - {{0xAE, 0xA6, 0xAD}, 32}, /* ожн */ - {{0xA0, 0xE2, 0xEB}, 31}, /* аты */ - {{0xE1, 0xA4, 0xA5}, 31}, /* сде */ - {{0xA0, 0xEE, 0xE2}, 31}, /* ают */ - {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ - {{0xAE, 0xEF, 0xE2}, 31}, /* оят */ - {{0xA5, 0xE2, 0xEC}, 31}, /* еть */ - {{0xA0, 0xA3, 0xA5}, 31}, /* аге */ - {{0xE7, 0xE0, 0xA5}, 31}, /* чре */ - {{0xA5, 0xAD, 0xEB}, 31}, /* ены */ - {{0xE3, 0xA1, 0xEB}, 31}, /* убы */ - {{0xA8, 0xE1, 0xE2}, 30}, /* ист */ - {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ - {{0xE0, 0xEF, 0xA4}, 30}, /* ряд */ - {{0xA3, 0xAE, 0xE1}, 30}, /* гос */ - {{0xA8, 0xAC, 0xA0}, 30}, /* има */ - {{0xA7, 0xA0, 0xE1}, 30}, /* зас */ - {{0xA0, 0xEE, 0xE9}, 30}, /* ающ */ - {{0xAE, 0xA7, 0xA2}, 30}, /* озв */ - {{0xA5, 0xA4, 0xA8}, 30}, /* еди */ - {{0xAE, 0xAC, 0xA5}, 30}, /* оме */ - {{0xAD, 0xA8, 0xA9}, 30}, /* ний */ - {{0xE1, 0xE3, 0xA4}, 30}, /* суд */ - {{0xA7, 0xA4, 0xAE}, 29}, /* здо */ - {{0xE1, 0xA2, 0xA8}, 29}, /* сви */ - {{0xAE, 0xAB, 0xA8}, 29}, /* оли */ - {{0xAE, 0xA2, 0xEC}, 29}, /* овь */ - {{0xA2, 0xA8, 0xA9}, 29}, /* вий */ - {{0xA4, 0xAE, 0xE0}, 29}, /* дор */ - {{0xA4, 0xA5, 0xEF}, 29}, /* дея */ - {{0xA5, 0xEF, 0xE2}, 29}, /* еят */ - {{0xE6, 0xAE, 0xAC}, 29}, /* цом */ - {{0xA8, 0xA7, 0xA0}, 28}, /* иза */ - {{0xE1, 0xE7, 0xA5}, 28}, /* сче */ - {{0xAA, 0xE2, 0xA0}, 28}, /* кта */ - {{0xAE, 0xA4, 0xAD}, 28}, /* одн */ - {{0xA1, 0xAB, 0xA0}, 28}, /* бла */ - {{0xAE, 0xA4, 0xAB}, 28}, /* одл */ - {{0xA8, 0xE2, 0xA0}, 28}, /* ита */ - {{0x84, 0xAE, 0xA3}, 28}, /* Дог */ - {{0xAE, 0xE1, 0xAE}, 28}, /* осо */ - {{0xAD, 0xAE, 0xE8}, 28}, /* нош */ - {{0xAA, 0xE3, 0xE0}, 28}, /* кур */ - {{0xA8, 0xAD, 0xA0}, 28}, /* ина */ - {{0xAE, 0xE8, 0xA5}, 28}, /* оше */ - {{0xAD, 0xA0, 0xAB}, 28}, /* нал */ - {{0xAD, 0xA8, 0xA7}, 27}, /* низ */ - {{0xA7, 0xA2, 0xE0}, 27}, /* звр */ - {{0xA2, 0xE0, 0xA0}, 27}, /* вра */ - {{0xAB, 0xA5, 0xE2}, 27}, /* лет */ - {{0xA5, 0xE9, 0xEC}, 27}, /* ещь */ - {{0xE0, 0xA8, 0xA4}, 27}, /* рид */ - {{0xA4, 0xAD, 0xAE}, 27}, /* дно */ - {{0xE0, 0xA8, 0xAE}, 27}, /* рио */ - {{0xAE, 0xA8, 0xAC}, 27}, /* оим */ - {{0xA5, 0xE0, 0xA6}, 27}, /* ерж */ - {{0xE3, 0xA2, 0xA5}, 26}, /* уве */ - {{0xAE, 0xAD, 0xAA}, 26}, /* онк */ - {{0xA5, 0xAB, 0xAA}, 26}, /* елк */ - {{0xAB, 0xA0, 0xA2}, 26}, /* лав */ - {{0xA0, 0xE2, 0xAE}, 26}, /* ато */ - {{0xEF, 0xAC, 0xA8}, 26}, /* ями */ - {{0xAC, 0xAC, 0xEB}, 26}, /* ммы */ - {{0xA5, 0xE1, 0xAF}, 26}, /* есп */ - {{0xAD, 0xAA, 0xE3}, 26}, /* нку */ - {{0xA8, 0xE6, 0xE3}, 25}, /* ицу */ - {{0xA4, 0xE1, 0xAA}, 25}, /* дск */ - {{0xAD, 0xA8, 0xAD}, 25}, /* нин */ - {{0xAF, 0xAB, 0xA5}, 25}, /* пле */ - {{0xE4, 0xAE, 0xE0}, 25}, /* фор */ - {{0xAB, 0xA0, 0xE1}, 25}, /* лас */ - {{0xA4, 0xA8, 0xAC}, 25}, /* дим */ - {{0xA5, 0xE1, 0xEF}, 25}, /* еся */ - {{0xAD, 0xA8, 0xE7}, 25}, /* нич */ - {{0xAE, 0xA2, 0xE0}, 25}, /* овр */ - {{0xA2, 0xE1, 0xAB}, 25}, /* всл */ - {{0xE0, 0xE8, 0xA5}, 25}, /* рше */ - {{0xA5, 0xE9, 0xA0}, 25}, /* еща */ - {{0xA6, 0xAD, 0xEB}, 25}, /* жны */ - {{0xE0, 0xA8, 0xAC}, 25}, /* рим */ - {{0xA7, 0xA0, 0xE6}, 25}, /* зац */ - {{0xA1, 0xE9, 0xA5}, 25}, /* бще */ - {{0xA0, 0xAA, 0xE2}, 25}, /* акт */ - {{0xA0, 0xA4, 0xE1}, 25}, /* адс */ - {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ - {{0xE9, 0xA8, 0xA5}, 25}, /* щие */ - {{0xA6, 0xA8, 0xE2}, 24}, /* жит */ - {{0xA1, 0xE0, 0xA5}, 24}, /* бре */ - {{0xE3, 0xA3, 0xAE}, 24}, /* уго */ - {{0xA8, 0xEF, 0xE5}, 24}, /* иях */ - {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ - {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ - {{0xA2, 0xAE, 0xA2}, 24}, /* вов */ - {{0xAE, 0xE7, 0xAD}, 24}, /* очн */ - {{0xA2, 0xAE, 0xAE}, 24}, /* воо */ - {{0xAE, 0xA4, 0xEB}, 24}, /* оды */ - {{0xAB, 0xAE, 0xA3}, 24}, /* лог */ - {{0xA2, 0xA0, 0xA5}, 24}, /* вае */ - {{0xA0, 0xEF, 0xE5}, 24}, /* аях */ - {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ - {{0xA4, 0xA8, 0xE7}, 24}, /* дич */ - {{0xAA, 0xA8, 0xE5}, 24}, /* ких */ - {{0xE6, 0xA0, 0xAC}, 24}, /* цам */ - {{0xA8, 0xA7, 0xA2}, 24}, /* изв */ - {{0xE2, 0xA8, 0xA2}, 24}, /* тив */ - {{0xA5, 0xAE, 0xA1}, 24}, /* еоб */ - {{0xE1, 0xAE, 0xE1}, 24}, /* сос */ - {{0xE8, 0xA8, 0xAC}, 24}, /* шим */ - {{0xEB, 0xAF, 0xAE}, 24}, /* ыпо */ - {{0xA5, 0xA6, 0xA0}, 24}, /* ежа */ - {{0xE2, 0xAE, 0xA8}, 24}, /* тои */ - {{0xAA, 0xE2, 0xAE}, 24}, /* кто */ - {{0xA5, 0xE7, 0xA0}, 24}, /* еча */ - {{0xA8, 0xA4, 0xA8}, 24}, /* иди */ - {{0xA1, 0xE9, 0xA8}, 23}, /* бщи */ - {{0xE2, 0xEC, 0xA5}, 23}, /* тье */ - {{0xA1, 0xEA, 0xEF}, 23}, /* бъя */ - {{0xAD, 0xA0, 0xE7}, 23}, /* нач */ - {{0xE2, 0xA5, 0xE7}, 23}, /* теч */ - {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ - {{0xA2, 0xA5, 0xE7}, 23}, /* веч */ - {{0xA5, 0xAC, 0xA5}, 23}, /* еме */ - {{0xAE, 0xA1, 0xE5}, 23}, /* обх */ - {{0xA1, 0xE5, 0xAE}, 23}, /* бхо */ - {{0xA4, 0xA0, 0xA5}, 23}, /* дае */ - {{0xE0, 0xA5, 0xA7}, 23}, /* рез */ - {{0xAA, 0xA0, 0xA6}, 22}, /* каж */ - {{0xAE, 0xAA, 0xE3}, 22}, /* оку */ - {{0xA0, 0xAC, 0xA5}, 22}, /* аме */ - {{0xAD, 0xA5, 0xA7}, 22}, /* нез */ - {{0xEB, 0xA2, 0xA0}, 22}, /* ыва */ - {{0xE1, 0xA2, 0xEF}, 22}, /* свя */ - {{0xE0, 0xA0, 0xA4}, 22}, /* рад */ - {{0xA5, 0xA7, 0xA0}, 22}, /* еза */ - {{0xA8, 0xA2, 0xA0}, 22}, /* ива */ - {{0xAA, 0xA0, 0xAC}, 22}, /* кам */ - {{0xAD, 0xA5, 0xAC}, 22}, /* нем */ - {{0xE2, 0xAA, 0xAE}, 22}, /* тко */ - {{0xA7, 0xA2, 0xA5}, 22}, /* зве */ - {{0xA2, 0xEF, 0xA7}, 22}, /* вяз */ - {{0xEF, 0xE2, 0xA8}, 22}, /* яти */ - {{0xAE, 0xE5, 0xE0}, 22}, /* охр */ - {{0xE0, 0xAE, 0xE2}, 22}, /* рот */ - {{0xAE, 0xAB, 0xA5}, 22}, /* оле */ - {{0xA1, 0xE0, 0xA0}, 22}, /* бра */ - {{0xA0, 0xA5, 0xAC}, 22}, /* аем */ - {{0xAB, 0xA0, 0xE8}, 21}, /* лаш */ - {{0xA8, 0xA7, 0xAC}, 21}, /* изм */ - {{0xA3, 0xE3, 0xE2}, 21}, /* гут */ - {{0xAE, 0xA6, 0xA4}, 21}, /* ожд */ - {{0xAA, 0xA0, 0xAA}, 21}, /* как */ - {{0xAA, 0xA0, 0xE7}, 21}, /* кач */ - {{0xAD, 0xA0, 0xAC}, 21}, /* нам */ - {{0xA4, 0xAE, 0xE5}, 21}, /* дох */ - {{0xAE, 0xE5, 0xAE}, 21}, /* охо */ - {{0xEE, 0xE0, 0xA8}, 21}, /* юри */ - {{0xA2, 0xA0, 0xAC}, 21}, /* вам */ - {{0xA7, 0xAC, 0xAE}, 21}, /* змо */ - {{0xA4, 0xAA, 0xA5}, 21}, /* дке */ - {{0xA1, 0xA0, 0xAD}, 21}, /* бан */ - {{0xA5, 0xAB, 0xA8}, 21}, /* ели */ - {{0xE0, 0xA8, 0xA7}, 21}, /* риз */ - {{0xAB, 0xAD, 0xAE}, 21}, /* лно */ - {{0xA2, 0xEB, 0xE8}, 21}, /* выш */ - {{0xA4, 0xE6, 0xA0}, 21}, /* дца */ - {{0xEF, 0xA4, 0xAA}, 21}, /* ядк */ - {{0xAE, 0xE2, 0xE1}, 21}, /* отс */ - {{0xE2, 0xA5, 0xA9}, 21}, /* тей */ - {{0xA0, 0xAD, 0xAA}, 21}, /* анк */ - {{0xAD, 0xA5, 0xA3}, 21}, /* нег */ - {{0xE6, 0xA0, 0xE2}, 21}, /* цат */ - {{0xA5, 0xAC, 0xEB}, 21}, /* емы */ - {{0xA2, 0xAE, 0xA5}, 21}, /* вое */ - {{0xA4, 0xA0, 0xE7}, 21}, /* дач */ - {{0xAE, 0xA3, 0xE3}, 21}, /* огу */ - {{0xAB, 0xA6, 0xA5}, 21}, /* лже */ - {{0xE2, 0xAD, 0xA8}, 21}, /* тни */ - {{0xA7, 0xA0, 0xA2}, 21}, /* зав */ - {{0xA2, 0xA5, 0xE1}, 21}, /* вес */ - {{0xE1, 0xA0, 0xAC}, 20}, /* сам */ - {{0xA0, 0xE0, 0xAD}, 20}, /* арн */ - {{0xE7, 0xAD, 0xEB}, 20}, /* чны */ - {{0xE1, 0xE0, 0xA5}, 20}, /* сре */ - {{0xE2, 0xA8, 0xEF}, 20}, /* тия */ - {{0xA8, 0xE1, 0xAB}, 20}, /* исл */ - {{0x91, 0xE2, 0xE0}, 20}, /* Стр */ - {{0xAD, 0xE2, 0xAE}, 20}, /* нто */ - {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ - {{0xA0, 0xE8, 0xA5}, 20}, /* аше */ - {{0xA5, 0xAB, 0xA0}, 20}, /* ела */ - {{0xE3, 0xA4, 0xAE}, 20}, /* удо */ - {{0xA6, 0xA8, 0xA7}, 19}, /* жиз */ - {{0xAF, 0xA8, 0xE1}, 19}, /* пис */ - {{0xA0, 0xA8, 0xAC}, 19}, /* аим */ - {{0xE7, 0xA8, 0xE1}, 19}, /* чис */ - {{0xA5, 0xA6, 0xA8}, 19}, /* ежи */ - {{0xA2, 0xE1, 0xA5}, 19}, /* все */ - {{0xAB, 0xEC, 0xAA}, 19}, /* льк */ - {{0xA0, 0xE2, 0xE3}, 19}, /* ату */ - {{0xE3, 0xA4, 0xA0}, 19}, /* уда */ - {{0xE8, 0xA8, 0xA9}, 19}, /* ший */ - {{0xA7, 0xA0, 0xE0}, 19}, /* зар */ - {{0xA5, 0xA4, 0xAD}, 19}, /* едн */ - {{0xA0, 0xA2, 0xE8}, 19}, /* авш */ - {{0xE0, 0xAE, 0xA8}, 19}, /* рои */ - {{0xA8, 0xA4, 0xA0}, 19}, /* ида */ - {{0xA0, 0xE0, 0xAE}, 19}, /* аро */ - {{0xE2, 0xAE, 0xA9}, 19}, /* той */ - {{0xA6, 0xA0, 0xE9}, 19}, /* жащ */ - {{0xA5, 0xE1, 0xAE}, 19}, /* есо */ - {{0xAF, 0xA0, 0xAB}, 19}, /* пал */ - {{0xE9, 0xA0, 0xA5}, 19}, /* щае */ - {{0xE0, 0xEB, 0xA5}, 19}, /* рые */ - {{0xA5, 0xAD, 0xEF}, 19}, /* еня */ - {{0xE9, 0xA8, 0xA9}, 19}, /* щий */ - {{0xAB, 0xE3, 0xA3}, 19}, /* луг */ - {{0xEE, 0xE7, 0xA8}, 18}, /* ючи */ - {{0xE3, 0xAB, 0xEC}, 18}, /* уль */ - {{0xAC, 0xEB, 0xE5}, 18}, /* мых */ - {{0xE0, 0xAE, 0xA3}, 18}, /* рог */ - {{0xE1, 0xAE, 0xE5}, 18}, /* сох */ - {{0xAA, 0xAE, 0xA5}, 18}, /* кое */ - {{0xAD, 0xE2, 0xE1}, 18}, /* нтс */ - {{0xA0, 0xA7, 0xAD}, 18}, /* азн */ - {{0xE2, 0xAD, 0xEB}, 18}, /* тны */ - {{0xAE, 0xA4, 0xEF}, 18}, /* одя */ - {{0xAE, 0xA1, 0xAD}, 18}, /* обн */ - {{0xA2, 0xEB, 0xA4}, 18}, /* выд */ - {{0xAE, 0xE1, 0xEF}, 18}, /* ося */ - {{0xEC, 0xE2, 0xA0}, 18}, /* ьта */ - {{0xAD, 0xEF, 0xEE}, 18}, /* няю */ - {{0xAD, 0xA0, 0xE0}, 18}, /* нар */ - {{0xA5, 0xA7, 0xE3}, 18}, /* езу */ - {{0xA0, 0xE1, 0xAD}, 18}, /* асн */ - {{0xA7, 0xE3, 0xAB}, 18}, /* зул */ - {{0xE6, 0xA8, 0xAF}, 18}, /* цип */ - {{0xAA, 0xE2, 0xA5}, 18}, /* кте */ - {{0xA4, 0xAE, 0xAF}, 18}, /* доп */ - {{0xAD, 0xE6, 0xA8}, 18}, /* нци */ - {{0xE1, 0xAF, 0xA5}, 18}, /* спе */ - {{0xA8, 0xAC, 0xEB}, 18}, /* имы */ - {{0xAC, 0xAE, 0xAC}, 18}, /* мом */ - {{0xAF, 0xA5, 0xE7}, 18}, /* печ */ - {{0x8E, 0xA1, 0xEF}, 18}, /* Обя */ - {{0x8F, 0xE0, 0xA0}, 18}, /* Пра */ - {{0xAE, 0xAB, 0xAE}, 18}, /* оло */ - {{0xE2, 0xE1, 0xAA}, 18}, /* тск */ - {{0xAB, 0xAD, 0xA8}, 18}, /* лни */ - {{0xA5, 0xE0, 0xE2}, 18}, /* ерт */ - {{0xA8, 0xE1, 0xEC}, 18}, /* ись */ - {{0xAB, 0xEC, 0xE2}, 18}, /* льт */ - {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ - {{0xA2, 0xAE, 0xA1}, 17}, /* воб */ - {{0xE0, 0xAD, 0xEB}, 17}, /* рны */ - {{0xA1, 0xAD, 0xEB}, 17}, /* бны */ - {{0xEB, 0xA4, 0xA0}, 17}, /* ыда */ - {{0xEC, 0xA7, 0xE3}, 17}, /* ьзу */ - {{0xA5, 0xA4, 0xAF}, 17}, /* едп */ - {{0xA0, 0xA4, 0xA5}, 17}, /* аде */ - {{0xA8, 0xAF, 0xA0}, 17}, /* ипа */ - {{0xE1, 0xA5, 0xA9}, 17}, /* сей */ - {{0xA5, 0xA5, 0xE1}, 17}, /* еес */ - {{0xAE, 0xA8, 0xA7}, 17}, /* оиз */ - {{0xAE, 0xE1, 0xA2}, 17}, /* осв */ - {{0xA4, 0xA8, 0xA2}, 17}, /* див */ - {{0xAD, 0xA0, 0xAD}, 17}, /* нан */ - {{0xA5, 0xE2, 0xA0}, 17}, /* ета */ - {{0xA4, 0xAD, 0xA5}, 17}, /* дне */ - {{0xA8, 0xAE, 0xA1}, 17}, /* иоб */ - {{0xE3, 0xA5, 0xE2}, 17}, /* ует */ - {{0xAD, 0xA0, 0xE5}, 17}, /* нах */ - {{0xE1, 0xAC, 0xA5}, 17}, /* сме */ - {{0xA0, 0xAB, 0xA8}, 17}, /* али */ - {{0xA1, 0xEA, 0xA5}, 17}, /* бъе */ - {{0xAF, 0xA0, 0xE1}, 17}, /* пас */ - {{0xA7, 0xA0, 0xAB}, 17}, /* зал */ - {{0xE0, 0xA6, 0xA0}, 16}, /* ржа */ - {{0xEF, 0xA2, 0xA8}, 16}, /* яви */ - {{0xA6, 0xA0, 0xE2}, 16}, /* жат */ - {{0xA1, 0xAE, 0xA6}, 16}, /* бож */ - {{0xE1, 0xA8, 0xAB}, 16}, /* сил */ - {{0xAD, 0xE3, 0xEE}, 16}, /* ную */ - {{0xAF, 0xA5, 0xAD}, 16}, /* пен */ - {{0xAC, 0xA0, 0xE2}, 16}, /* мат */ - {{0xAE, 0xAD, 0xAD}, 16}, /* онн */ - {{0xA2, 0xA8, 0xAD}, 16}, /* вин */ - {{0xE2, 0xAA, 0xA8}, 16}, /* тки */ - {{0xE2, 0xAE, 0xE7}, 16}, /* точ */ - {{0xE1, 0xE7, 0xA8}, 16}, /* счи */ - {{0xAD, 0xA8, 0xE6}, 16}, /* ниц */ - {{0xE9, 0xA5, 0xA5}, 16}, /* щее */ - {{0xA1, 0xA5, 0xE1}, 16}, /* бес */ - {{0xA0, 0xA4, 0xE6}, 16}, /* адц */ - {{0x8A, 0xAE, 0xAC}, 16}, /* Ком */ - {{0xEC, 0xA8, 0xAC}, 16}, /* ьим */ - {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ - {{0xA0, 0xE7, 0xA8}, 16}, /* ачи */ - {{0xAF, 0xAE, 0xAD}, 16}, /* пон */ - {{0xAA, 0xA0, 0xA5}, 16}, /* кае */ - {{0xA8, 0xA3, 0xE0}, 16}, /* игр */ - {{0xA0, 0xAA, 0xA8}, 16}, /* аки */ - {{0xA0, 0xE9, 0xA8}, 16}, /* ащи */ - {{0xAB, 0xEC, 0xE6}, 16}, /* льц */ - {{0xA2, 0xAD, 0xAE}, 16}, /* вно */ - {{0xEB, 0xE8, 0xA5}, 15}, /* ыше */ - {{0x8B, 0xA8, 0xE6}, 15}, /* Лиц */ - {{0xEC, 0xA5, 0xA9}, 15}, /* ьей */ - {{0xE8, 0xA5, 0xAC}, 15}, /* шем */ - {{0xE3, 0xA1, 0xAB}, 15}, /* убл */ - {{0xE0, 0xA0, 0xE6}, 15}, /* рац */ - {{0xAA, 0xE3, 0xAC}, 15}, /* кум */ - {{0xE0, 0xA5, 0xA3}, 15}, /* рег */ - {{0xAE, 0xAF, 0xA0}, 15}, /* опа */ - {{0x82, 0xAE, 0xA7}, 15}, /* Воз */ - {{0xE2, 0xA0, 0xA5}, 15}, /* тае */ - {{0xAE, 0xA1, 0xEB}, 15}, /* обы */ - {{0xA1, 0xAB, 0xA8}, 15}, /* бли */ - {{0xE0, 0xAC, 0xA5}, 15}, /* рме */ - {{0xA2, 0xAE, 0xE1}, 15}, /* вос */ - {{0xA0, 0xE1, 0xA8}, 15}, /* аси */ - {{0xE2, 0xA0, 0xAC}, 15}, /* там */ - {{0xEC, 0xAC, 0xA5}, 15}, /* ьме */ - {{0xAE, 0xA3, 0xA0}, 15}, /* ога */ - {{0xA8, 0xAB, 0xAE}, 15}, /* ило */ - {{0xE1, 0xEC, 0xAC}, 15}, /* сьм */ - {{0xE0, 0xE2, 0xA8}, 15}, /* рти */ - {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ - {{0xE1, 0xA5, 0xAD}, 15}, /* сен */ - {{0xE2, 0xA0, 0xAB}, 15}, /* тал */ - {{0xA4, 0xA0, 0xE0}, 15}, /* дар */ - {{0xA0, 0xAC, 0xAE}, 15}, /* амо */ - {{0xA5, 0xA4, 0xAB}, 15}, /* едл */ - {{0xE1, 0xE3, 0xA1}, 15}, /* суб */ - {{0xA5, 0xA9, 0xE4}, 15}, /* ейф */ - {{0x95, 0xE0, 0xA0}, 15}, /* Хра */ - {{0xAB, 0xA0, 0xAC}, 14}, /* лам */ - {{0xA0, 0xE0, 0xE3}, 14}, /* ару */ - {{0xA3, 0xA8, 0xE5}, 14}, /* гих */ - {{0xE6, 0xA8, 0xEF}, 14}, /* ция */ - {{0xA4, 0xA0, 0xA2}, 14}, /* дав */ - {{0xAB, 0xA8, 0xE8}, 14}, /* лиш */ - {{0xEE, 0xE7, 0xA0}, 14}, /* юча */ - {{0xA0, 0xAD, 0xE1}, 14}, /* анс */ - {{0xAE, 0xA3, 0xE0}, 14}, /* огр */ - {{0xA8, 0xE9, 0xA0}, 14}, /* ища */ - {{0xA5, 0xAD, 0xEC}, 14}, /* ень */ - {{0xAE, 0xE2, 0xA8}, 14}, /* оти */ - {{0xA0, 0xA4, 0xEB}, 13}, /* ады */ - {{0xA0, 0xE9, 0xA0}, 13}, /* аща */ - {{0xA2, 0xAE, 0xA8}, 13}, /* вои */ - {{0xA2, 0xEB, 0xAC}, 13}, /* вым */ - {{0xA2, 0xEC, 0xEF}, 13}, /* вья */ - {{0xAA, 0xA8, 0xA5}, 13}, /* кие */ - {{0xAB, 0xA8, 0xE1}, 13}, /* лис */ - {{0xAC, 0xA5, 0xA4}, 13}, /* мед */ - {{0xE2, 0xA8, 0xE5}, 13}, /* тих */ - {{0xA5, 0xE2, 0xAE}, 13}, /* ето */ - {{0xA7, 0xAB, 0xAE}, 13}, /* зло */ - {{0xAE, 0xAF, 0xA5}, 13}, /* опе */ - {{0xE1, 0xA8, 0xAC}, 13}, /* сим */ - {{0xEF, 0xA7, 0xA8}, 13}, /* язи */ - {{0xA8, 0xAD, 0xA4}, 13}, /* инд */ - {{0xE7, 0xE3, 0xA6}, 13}, /* чуж */ - {{0xAB, 0xAA, 0xA8}, 13}, /* лки */ - {{0xA4, 0xAF, 0xE0}, 13}, /* дпр */ - {{0xAD, 0xA4, 0xA8}, 13}, /* нди */ - {{0xAE, 0xE2, 0xA0}, 13}, /* ота */ - {{0xAE, 0xE2, 0xEB}, 13}, /* оты */ - {{0xAB, 0xA0, 0xE7}, 13}, /* лач */ - {{0xAA, 0xA8, 0xAC}, 13}, /* ким */ - {{0xA8, 0xE1, 0xA8}, 13}, /* иси */ - {{0xA2, 0xA0, 0xAB}, 13}, /* вал */ - {{0xA5, 0xAC, 0xAE}, 13}, /* емо */ - {{0xAF, 0xE3, 0xA1}, 13}, /* пуб */ - {{0xEF, 0xA5, 0xAC}, 13}, /* яем */ - {{0xA1, 0xAE, 0xAB}, 13}, /* бол */ - {{0xAD, 0xE2, 0xE3}, 13}, /* нту */ - {{0xAD, 0xA5, 0xA9}, 13}, /* ней */ - {{0xAD, 0xA0, 0xEF}, 13}, /* ная */ - {{0xA5, 0xE1, 0xA0}, 13}, /* еса */ - {{0xE0, 0xAD, 0xAE}, 13}, /* рно */ - {{0xE9, 0xA5, 0xAC}, 13}, /* щем */ - {{0xA0, 0xAD, 0xEB}, 13}, /* аны */ - {{0x84, 0xAE, 0xA2}, 13}, /* Дов */ - {{0xE7, 0xA8, 0xA2}, 13}, /* чив */ - {{0xA2, 0xA8, 0xE1}, 13}, /* вис */ - {{0xAE, 0xAF, 0xAE}, 13}, /* опо */ - {{0xA2, 0xEC, 0xEE}, 13}, /* вью */ - {{0xA0, 0xAB, 0xA0}, 13}, /* ала */ - {{0xAB, 0xA5, 0xA9}, 12}, /* лей */ - {{0xA0, 0xE7, 0xA0}, 12}, /* ача */ - {{0xA5, 0xA7, 0xA2}, 12}, /* езв */ - {{0xA2, 0xA0, 0xEF}, 12}, /* вая */ - {{0xA5, 0xAE, 0xE1}, 12}, /* еос */ - {{0xEF, 0xE9, 0xA8}, 12}, /* ящи */ - {{0xA8, 0xA2, 0xA8}, 12}, /* иви */ - {{0xAD, 0xA5, 0xA5}, 12}, /* нее */ - {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ - {{0xE8, 0xA5, 0xA5}, 12}, /* шее */ - {{0xE1, 0xA0, 0xE5}, 12}, /* сах */ - {{0xA8, 0xAD, 0xE6}, 12}, /* инц */ - {{0xAE, 0xAC, 0xAF}, 12}, /* омп */ - {{0xE3, 0xA6, 0xAE}, 12}, /* ужо */ - {{0xE3, 0xA0, 0xAB}, 12}, /* уал */ - {{0xAD, 0xA0, 0xE2}, 12}, /* нат */ - {{0xA8, 0xA4, 0xE3}, 12}, /* иду */ - {{0xA2, 0xAB, 0xA0}, 12}, /* вла */ - {{0xA7, 0xA2, 0xA0}, 12}, /* зва */ - {{0xAB, 0xA5, 0xA5}, 12}, /* лее */ - {{0xE0, 0xA5, 0xE5}, 12}, /* рех */ - {{0xA6, 0xA4, 0xE3}, 12}, /* жду */ - {{0xAC, 0xA0, 0xAB}, 12}, /* мал */ - {{0xA5, 0xAD, 0xE1}, 12}, /* енс */ - {{0xA8, 0xA9, 0xE1}, 12}, /* ийс */ - {{0xAA, 0xAE, 0xAB}, 12}, /* кол */ - {{0xAD, 0xA0, 0xA7}, 12}, /* наз */ - {{0xA4, 0xE3, 0xA0}, 12}, /* дуа */ - {{0xAE, 0xAD, 0xA8}, 12}, /* они */ - {{0xE1, 0xA5, 0xAC}, 12}, /* сем */ - {{0xA3, 0xAE, 0xA4}, 12}, /* год */ - {{0xAC, 0xA5, 0xA6}, 12}, /* меж */ - {{0xAE, 0xA7, 0xAB}, 12}, /* озл */ - {{0xA2, 0xAC, 0xA5}, 12}, /* вме */ - {{0xE3, 0xA4, 0xA5}, 12}, /* уде */ - {{0xEC, 0xAA, 0xAE}, 12}, /* ько */ - {{0xA5, 0xA2, 0xEB}, 12}, /* евы */ - {{0xA7, 0xA0, 0xAC}, 12}, /* зам */ - {{0xE1, 0xAE, 0xA4}, 12}, /* сод */ - {{0xE0, 0xAE, 0xA5}, 11}, /* рое */ - {{0xAE, 0xE2, 0xA4}, 11}, /* отд */ - {{0xE1, 0xA8, 0xEF}, 11}, /* сия */ - {{0xA8, 0xAA, 0xE3}, 11}, /* ику */ - {{0xEB, 0xAB, 0xA8}, 11}, /* ыли */ - {{0xA3, 0xA8, 0xAC}, 11}, /* гим */ - {{0xAD, 0xEC, 0xE8}, 11}, /* ньш */ - {{0xE2, 0xA8, 0xE7}, 11}, /* тич */ - {{0xE0, 0xA0, 0xAB}, 11}, /* рал */ - {{0xE3, 0xE7, 0xA8}, 11}, /* учи */ - {{0xAC, 0xA5, 0xEE}, 11}, /* мею */ - {{0xE2, 0xA5, 0xAA}, 11}, /* тек */ - {{0xAE, 0xA1, 0xE3}, 11}, /* обу */ - {{0xAD, 0xAD, 0xE3}, 11}, /* нну */ - {{0xAD, 0xA5, 0xAF}, 11}, /* неп */ - {{0xA2, 0xA5, 0xAB}, 11}, /* вел */ - {{0xE2, 0xAC, 0xA5}, 11}, /* тме */ - {{0xA1, 0xAE, 0xA3}, 11}, /* бог */ - {{0xAE, 0xE0, 0xA8}, 11}, /* ори */ - {{0xA0, 0xA2, 0xAD}, 11}, /* авн */ - {{0xA4, 0xA5, 0xA5}, 11}, /* дее */ - {{0xA6, 0xAE, 0xAC}, 11}, /* жом */ - {{0x82, 0xE0, 0xA5}, 11}, /* Вре */ - {{0xAC, 0xEB, 0xA5}, 11}, /* мые */ - {{0xEC, 0xE6, 0xA0}, 11}, /* ьца */ - {{0xAE, 0xE6, 0xA5}, 11}, /* оце */ - {{0xA8, 0xE2, 0xEB}, 10}, /* иты */ - {{0xA7, 0xE0, 0xA0}, 10}, /* зра */ - {{0xAE, 0xAD, 0xEB}, 10}, /* оны */ - {{0xE0, 0xA5, 0xE8}, 10}, /* реш */ - {{0xE3, 0xE8, 0xA5}, 10}, /* уше */ - {{0xE0, 0xA5, 0xA2}, 10}, /* рев */ - {{0xAE, 0xAF, 0xE3}, 10}, /* опу */ - {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ - {{0xE2, 0xA0, 0xE7}, 10}, /* тач */ - {{0xA5, 0xE0, 0xAE}, 10}, /* еро */ - {{0xA2, 0xAA, 0xAB}, 10}, /* вкл */ - {{0xA7, 0xEB, 0xA2}, 10}, /* зыв */ - {{0xA0, 0xAF, 0xE0}, 10}, /* апр */ - {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ - {{0x8E, 0xE2, 0xA2}, 10}, /* Отв */ - {{0xE0, 0xE1, 0xA0}, 10}, /* рса */ - {{0xA5, 0xAA, 0xE2}, 10}, /* ект */ - {{0xAB, 0xA5, 0xAA}, 10}, /* лек */ - {{0xA5, 0xA5, 0xE2}, 10}, /* еет */ - {{0xAE, 0xAF, 0xAB}, 10}, /* опл */ - {{0xE2, 0xE7, 0xA5}, 10}, /* тче */ - {{0xA3, 0xAE, 0xAC}, 10}, /* гом */ - {{0xE2, 0xAE, 0xA6}, 10}, /* тож */ - {{0xAB, 0xA5, 0xE7}, 10}, /* леч */ - {{0xA5, 0xE2, 0xEB}, 10}, /* еты */ - {{0xAE, 0xA6, 0xA8}, 10}, /* ожи */ - {{0xAC, 0xAD, 0xAE}, 10}, /* мно */ - {{0xAC, 0xAE, 0xA9}, 10}, /* мой */ - {{0xE6, 0xA5, 0xAB}, 10}, /* цел */ - {{0xE3, 0xAF, 0xA8}, 10}, /* упи */ - {{0xA0, 0xA5, 0xA2}, 10}, /* аев */ - {{0xAF, 0xAE, 0xAC}, 10}, /* пом */ - {{0xA4, 0xEF, 0xE9}, 10}, /* дящ */ - {{0xE2, 0xE0, 0xA8}, 10}, /* три */ - {{0xE8, 0xA8, 0xA5}, 10}, /* шие */ - {{0xA5, 0xAA, 0xA0}, 10}, /* ека */ - {{0xA5, 0xE8, 0xA5}, 10}, /* еше */ - {{0xA7, 0xA0, 0xA8}, 10}, /* заи */ - {{0xA8, 0xE2, 0xAE}, 10}, /* ито */ - {{0xA7, 0xAD, 0xEB}, 10}, /* зны */ - {{0xAE, 0xEF, 0xAD}, 10}, /* оян */ - {{0xA8, 0xA6, 0xA5}, 10}, /* иже */ - {{0xA2, 0xAD, 0xA5}, 10}, /* вне */ - {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ - {{0xA5, 0xAC, 0xEF}, 10}, /* емя */ - {{0xAD, 0xA0, 0xA8}, 10}, /* наи */ - {{0xE2, 0xAE, 0xAB}, 10}, /* тол */ - {{0xAB, 0xA8, 0xE2}, 10}, /* лит */ - {{0xAE, 0xE1, 0xE0}, 10}, /* оср */ - {{0xE2, 0xA4, 0xA5}, 10}, /* тде */ - {{0xA5, 0xAC, 0xA8}, 10}, /* еми */ - {{0xAC, 0xA5, 0xA5}, 10}, /* мее */ - {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ - {{0xAD, 0xA8, 0xA2}, 10}, /* нив */ - {{0xA5, 0xE0, 0xE3}, 10}, /* еру */ - {{0xE7, 0xA5, 0xAC}, 10}, /* чем */ - {{0xA4, 0xAE, 0xA1}, 10}, /* доб */ - {{0xA5, 0xAB, 0xAE}, 10}, /* ело */ - {{0xA8, 0xAB, 0xE3}, 10}, /* илу */ - {{0xA0, 0xA4, 0xAB}, 10}, /* адл */ - {{0xA8, 0xE7, 0xE2}, 10}, /* ичт */ - {{0xAC, 0xAB, 0xA5}, 10}, /* мле */ -}; - -static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_iso_8859_5[] = { - {{0xD5, 0xDD, 0xD8}, 991}, /* ени */ - {{0xDE, 0xD3, 0xDE}, 806}, /* ого */ - {{0xE1, 0xE2, 0xD2}, 659}, /* ств */ - {{0xDD, 0xD8, 0xEF}, 629}, /* ния */ - {{0xDE, 0xD2, 0xD0}, 566}, /* ова */ - {{0xE2, 0xD5, 0xDB}, 555}, /* тел */ - {{0xE0, 0xD5, 0xD4}, 507}, /* ред */ - {{0xD5, 0xDD, 0xDD}, 499}, /* енн */ - {{0xDE, 0xD2, 0xDE}, 443}, /* ово */ - {{0xD0, 0xDD, 0xD8}, 443}, /* ани */ - {{0xE2, 0xE0, 0xD0}, 429}, /* тра */ - {{0xDE, 0xE1, 0xE2}, 428}, /* ост */ - {{0xDD, 0xD8, 0xD5}, 419}, /* ние */ - {{0xDD, 0xDD, 0xDE}, 412}, /* нно */ - {{0xD0, 0xE5, 0xDE}, 396}, /* ахо */ - {{0xE1, 0xE2, 0xE0}, 392}, /* стр */ - {{0xE0, 0xD0, 0xE5}, 386}, /* рах */ - {{0xE5, 0xDE, 0xD2}, 379}, /* хов */ - {{0xD5, 0xDB, 0xEC}, 365}, /* ель */ - {{0xD3, 0xDE, 0xD2}, 360}, /* гов */ - {{0xD2, 0xDE, 0xE0}, 356}, /* вор */ - {{0xD5, 0xE1, 0xE2}, 349}, /* ест */ - {{0xD0, 0xE2, 0xEC}, 345}, /* ать */ - {{0xE0, 0xD0, 0xD2}, 337}, /* рав */ - {{0xDF, 0xE0, 0xD8}, 330}, /* при */ - {{0xDF, 0xE0, 0xD5}, 323}, /* пре */ - {{0xD4, 0xDE, 0xD3}, 318}, /* дог */ - {{0xDD, 0xD5, 0xDD}, 310}, /* нен */ - {{0xDF, 0xE0, 0xD0}, 309}, /* пра */ - {{0xD2, 0xD0, 0xDD}, 304}, /* ван */ - {{0xD8, 0xE2, 0xD5}, 295}, /* ите */ - {{0xE2, 0xD2, 0xD5}, 281}, /* тве */ - {{0xDB, 0xD5, 0xDD}, 266}, /* лен */ - {{0xE1, 0xE2, 0xDE}, 261}, /* сто */ - {{0xE2, 0xD0, 0xE2}, 260}, /* тат */ - {{0xDD, 0xDD, 0xEB}, 260}, /* нны */ - {{0xDB, 0xEC, 0xDD}, 256}, /* льн */ - {{0xD2, 0xDE, 0xD7}, 255}, /* воз */ - {{0xD8, 0xDB, 0xD8}, 254}, /* или */ - {{0xD0, 0xE2, 0xD5}, 252}, /* ате */ - {{0xD5, 0xD3, 0xDE}, 241}, /* его */ - {{0xD5, 0xE2, 0xE1}, 238}, /* етс */ - {{0xDD, 0xDE, 0xE1}, 236}, /* нос */ - {{0xE9, 0xD5, 0xE1}, 235}, /* щес */ - {{0xDF, 0xDE, 0xDB}, 232}, /* пол */ - {{0xE0, 0xD0, 0xDD}, 231}, /* ран */ - {{0xDD, 0xDE, 0xD3}, 230}, /* ног */ - {{0xE1, 0xE2, 0xD0}, 229}, /* ста */ - {{0xE7, 0xD5, 0xDD}, 226}, /* чен */ - {{0xE2, 0xE0, 0xD5}, 224}, /* тре */ - {{0xD7, 0xDC, 0xD5}, 214}, /* зме */ - {{0xE3, 0xE9, 0xD5}, 212}, /* уще */ - {{0xE1, 0xE2, 0xD8}, 210}, /* сти */ - {{0xDA, 0xDE, 0xDC}, 207}, /* ком */ - {{0xDE, 0xE0, 0xDE}, 206}, /* оро */ - {{0xD2, 0xDB, 0xD5}, 195}, /* вле */ - {{0xD7, 0xD0, 0xDD}, 194}, /* зан */ - {{0xD0, 0xE1, 0xE2}, 193}, /* аст */ - {{0xE2, 0xE1, 0xEF}, 191}, /* тся */ - {{0xE5, 0xE0, 0xD0}, 187}, /* хра */ - {{0xD0, 0xDD, 0xDD}, 182}, /* анн */ - {{0xD5, 0xE0, 0xD5}, 182}, /* ере */ - {{0xD2, 0xE0, 0xD5}, 178}, /* вре */ - {{0xDE, 0xD2, 0xD5}, 173}, /* ове */ - {{0xEC, 0xDD, 0xDE}, 173}, /* ьно */ - {{0xD2, 0xD5, 0xE0}, 172}, /* вер */ - {{0xDC, 0xD5, 0xDD}, 170}, /* мен */ - {{0xDB, 0xD8, 0xE6}, 168}, /* лиц */ - {{0xE2, 0xDE, 0xE0}, 167}, /* тор */ - {{0xE0, 0xD5, 0xDD}, 167}, /* рен */ - {{0xE9, 0xD5, 0xDD}, 165}, /* щен */ - {{0xDE, 0xD7, 0xDC}, 164}, /* озм */ - {{0xD5, 0xD4, 0xD0}, 163}, /* еда */ - {{0xE2, 0xD2, 0xD8}, 159}, /* тви */ - {{0xEF, 0xD7, 0xD0}, 159}, /* яза */ - {{0xD1, 0xEF, 0xD7}, 158}, /* бяз */ - {{0xDD, 0xD8, 0xD8}, 153}, /* нии */ - {{0xDD, 0xEB, 0xE5}, 153}, /* ных */ - {{0xE2, 0xEC, 0xEF}, 153}, /* тья */ - {{0xDC, 0xD5, 0xE0}, 153}, /* мер */ - {{0xE1, 0xDB, 0xD8}, 150}, /* сли */ - {{0xE2, 0xDE, 0xD2}, 148}, /* тов */ - {{0xE2, 0xD2, 0xD0}, 147}, /* тва */ - {{0xDE, 0xE0, 0xD0}, 146}, /* ора */ - {{0xDD, 0xDE, 0xDC}, 144}, /* ном */ - {{0xD4, 0xD5, 0xDD}, 144}, /* ден */ - {{0xD0, 0xDD, 0xD5}, 142}, /* ане */ - {{0xDA, 0xDE, 0xDD}, 141}, /* кон */ - {{0xDB, 0xE3, 0xE7}, 141}, /* луч */ - {{0xDC, 0xE3, 0xE9}, 140}, /* мущ */ - {{0xDE, 0xD1, 0xEF}, 140}, /* обя */ - {{0xD2, 0xD0, 0xE2}, 138}, /* ват */ - {{0xD2, 0xD0, 0xE0}, 137}, /* вар */ - {{0xD5, 0xE9, 0xD5}, 137}, /* еще */ - {{0xDE, 0xE2, 0xE0}, 137}, /* отр */ - {{0xD4, 0xD5, 0xDB}, 137}, /* дел */ - {{0xDD, 0xEB, 0xDC}, 136}, /* ным */ - {{0xD8, 0xDC, 0xE3}, 136}, /* иму */ - {{0xC1, 0xE2, 0xD0}, 134}, /* Ста */ - {{0xE3, 0xE7, 0xD0}, 133}, /* уча */ - {{0xE2, 0xE1, 0xE2}, 131}, /* тст */ - {{0xD5, 0xDB, 0xEF}, 130}, /* еля */ - {{0xE1, 0xDB, 0xE3}, 130}, /* слу */ - {{0xD7, 0xD0, 0xDA}, 130}, /* зак */ - {{0xE2, 0xDE, 0xEF}, 129}, /* тоя */ - {{0xDE, 0xDC, 0xD8}, 128}, /* оми */ - {{0xDC, 0xD5, 0xE9}, 128}, /* мещ */ - {{0xD5, 0xD4, 0xE3}, 127}, /* еду */ - {{0xD2, 0xD5, 0xDD}, 127}, /* вен */ - {{0xDD, 0xDE, 0xD2}, 127}, /* нов */ - {{0xDD, 0xDE, 0xD5}, 126}, /* ное */ - {{0xDE, 0xE2, 0xD2}, 125}, /* отв */ - {{0xDA, 0xD0, 0xD7}, 125}, /* каз */ - {{0xD0, 0xD5, 0xE2}, 125}, /* ает */ - {{0xE1, 0xDA, 0xDE}, 125}, /* ско */ - {{0xD5, 0xDD, 0xE2}, 124}, /* ент */ - {{0xDC, 0xDE, 0xE2}, 123}, /* мот */ - {{0xD0, 0xD2, 0xDB}, 122}, /* авл */ - {{0xE1, 0xDC, 0xDE}, 122}, /* смо */ - {{0xD8, 0xE7, 0xD8}, 121}, /* ичи */ - {{0xD1, 0xEB, 0xE2}, 120}, /* быт */ - {{0xE3, 0xE1, 0xDC}, 118}, /* усм */ - {{0xE1, 0xE1, 0xD8}, 117}, /* сси */ - {{0xD4, 0xE3, 0xE1}, 117}, /* дус */ - {{0xE5, 0xDE, 0xD4}, 117}, /* ход */ - {{0xE0, 0xD8, 0xE7}, 117}, /* рич */ - {{0xE7, 0xD5, 0xE1}, 115}, /* чес */ - {{0xD3, 0xE0, 0xD0}, 114}, /* гра */ - {{0xDF, 0xE0, 0xDE}, 114}, /* про */ - {{0xD4, 0xDE, 0xD2}, 113}, /* дов */ - {{0xD2, 0xD5, 0xE2}, 112}, /* вет */ - {{0xD5, 0xD4, 0xD5}, 112}, /* еде */ - {{0xE8, 0xD5, 0xDD}, 111}, /* шен */ - {{0xE7, 0xD8, 0xDD}, 110}, /* чин */ - {{0xDD, 0xD0, 0xE1}, 109}, /* нас */ - {{0xD8, 0xE2, 0xEC}, 105}, /* ить */ - {{0xE2, 0xD2, 0xDE}, 105}, /* тво */ - {{0xDA, 0xDB, 0xEE}, 104}, /* клю */ - {{0xE0, 0xD8, 0xE2}, 104}, /* рит */ - {{0xE1, 0xE2, 0xEC}, 104}, /* сть */ - {{0xDB, 0xEE, 0xE7}, 104}, /* люч */ - {{0xE2, 0xDE, 0xDC}, 104}, /* том */ - {{0xE1, 0xDB, 0xD5}, 103}, /* сле */ - {{0xE1, 0xDF, 0xDE}, 102}, /* спо */ - {{0xDE, 0xDB, 0xDD}, 102}, /* олн */ - {{0xD5, 0xE1, 0xDB}, 102}, /* есл */ - {{0xD5, 0xE0, 0xD8}, 101}, /* ери */ - {{0xDD, 0xDE, 0xD9}, 101}, /* ной */ - {{0xE0, 0xDE, 0xDC}, 101}, /* ром */ - {{0xDE, 0xE2, 0xDE}, 99}, /* ото */ - {{0xDD, 0xEB, 0xD5}, 99}, /* ные */ - {{0xD7, 0xDD, 0xD0}, 99}, /* зна */ - {{0xD2, 0xDB, 0xEF}, 99}, /* вля */ - {{0xE2, 0xD5, 0xE0}, 98}, /* тер */ - {{0xE3, 0xDF, 0xE0}, 97}, /* упр */ - {{0xD0, 0xDA, 0xDE}, 96}, /* ако */ - {{0xDA, 0xDE, 0xD3}, 96}, /* ког */ - {{0xDD, 0xEB, 0xD9}, 96}, /* ный */ - {{0xDE, 0xE0, 0xE3}, 96}, /* ору */ - {{0xD5, 0xDB, 0xD5}, 95}, /* еле */ - {{0xD5, 0xE1, 0xDA}, 95}, /* еск */ - {{0xD0, 0xD7, 0xD0}, 95}, /* аза */ - {{0xD9, 0xE1, 0xE2}, 93}, /* йст */ - {{0xDF, 0xDE, 0xE0}, 93}, /* пор */ - {{0xDE, 0xD6, 0xD5}, 92}, /* оже */ - {{0xD8, 0xDD, 0xD5}, 91}, /* ине */ - {{0xE9, 0xD5, 0xD9}, 90}, /* щей */ - {{0xD6, 0xD4, 0xD5}, 90}, /* жде */ - {{0xDF, 0xD5, 0xE0}, 89}, /* пер */ - {{0xDD, 0xD8, 0xE2}, 89}, /* нит */ - {{0xDE, 0xDB, 0xEC}, 89}, /* оль */ - {{0xD0, 0xD6, 0xD4}, 88}, /* ажд */ - {{0xD6, 0xD5, 0xDD}, 87}, /* жен */ - {{0xDB, 0xD0, 0xD4}, 87}, /* лад */ - {{0xD0, 0xDC, 0xD8}, 87}, /* ами */ - {{0xDA, 0xDE, 0xE2}, 86}, /* кот */ - {{0xE7, 0xD0, 0xD5}, 85}, /* чае */ - {{0xD2, 0xD5, 0xE9}, 85}, /* вещ */ - {{0xD2, 0xD8, 0xEF}, 85}, /* вия */ - {{0xEF, 0xE9, 0xD5}, 85}, /* яще */ - {{0xD8, 0xD5, 0xDC}, 85}, /* ием */ - {{0xDA, 0xDB, 0xD0}, 85}, /* кла */ - {{0xD5, 0xD9, 0xE1}, 84}, /* ейс */ - {{0xEB, 0xE2, 0xEC}, 84}, /* ыть */ - {{0xD0, 0xD2, 0xDE}, 84}, /* аво */ - {{0xE0, 0xD0, 0xD6}, 83}, /* раж */ - {{0xDB, 0xEC, 0xE1}, 83}, /* льс */ - {{0xDE, 0xEF, 0xE9}, 82}, /* оящ */ - {{0xD5, 0xDD, 0xDE}, 81}, /* ено */ - {{0xD4, 0xE1, 0xE2}, 81}, /* дст */ - {{0xD4, 0xD5, 0xD9}, 80}, /* дей */ - {{0xE0, 0xD5, 0xD1}, 80}, /* реб */ - {{0xEC, 0xE1, 0xE2}, 79}, /* ьст */ - {{0xD5, 0xD4, 0xE1}, 79}, /* едс */ - {{0xD0, 0xE0, 0xD8}, 79}, /* ари */ - {{0xD4, 0xD0, 0xDD}, 79}, /* дан */ - {{0xDC, 0xDE, 0xD6}, 78}, /* мож */ - {{0xD8, 0xDC, 0xD5}, 78}, /* име */ - {{0xD8, 0xDD, 0xDE}, 78}, /* ино */ - {{0xE0, 0xD8, 0xDD}, 77}, /* рин */ - {{0xD4, 0xDE, 0xE1}, 77}, /* дос */ - {{0xDF, 0xDE, 0xE1}, 77}, /* пос */ - {{0xE2, 0xD0, 0xDA}, 77}, /* так */ - {{0xE9, 0xD5, 0xD3}, 77}, /* щег */ - {{0xD4, 0xD0, 0xE2}, 77}, /* дат */ - {{0xDF, 0xDB, 0xD0}, 76}, /* пла */ - {{0xE3, 0xE1, 0xDB}, 76}, /* усл */ - {{0xD8, 0xE6, 0xD0}, 76}, /* ица */ - {{0xE0, 0xDE, 0xD2}, 75}, /* ров */ - {{0xED, 0xE2, 0xDE}, 75}, /* это */ - {{0xE3, 0xE7, 0xD5}, 74}, /* уче */ - {{0xD4, 0xDE, 0xDB}, 73}, /* дол */ - {{0xEC, 0xDD, 0xEB}, 73}, /* ьны */ - {{0xE0, 0xD0, 0xD7}, 73}, /* раз */ - {{0xDC, 0xD8, 0xE1}, 73}, /* мис */ - {{0xD0, 0xDD, 0xDE}, 72}, /* ано */ - {{0xE1, 0xE0, 0xDE}, 72}, /* сро */ - {{0xD0, 0xD2, 0xD8}, 72}, /* ави */ - {{0xE2, 0xEC, 0xD8}, 71}, /* тьи */ - {{0xEE, 0xE7, 0xD5}, 70}, /* юче */ - {{0xE1, 0xDA, 0xDB}, 70}, /* скл */ - {{0xD8, 0xE1, 0xE1}, 70}, /* исс */ - {{0xD6, 0xD5, 0xE2}, 69}, /* жет */ - {{0xD5, 0xD4, 0xDE}, 69}, /* едо */ - {{0xDB, 0xD5, 0xD4}, 69}, /* лед */ - {{0xDB, 0xDE, 0xD2}, 69}, /* лов */ - {{0xEE, 0xE9, 0xD8}, 68}, /* ющи */ - {{0xD8, 0xD1, 0xDE}, 68}, /* ибо */ - {{0xDB, 0xD0, 0xE2}, 67}, /* лат */ - {{0xE0, 0xDE, 0xDA}, 67}, /* рок */ - {{0xD0, 0xDA, 0xDB}, 67}, /* акл */ - {{0xE0, 0xD8, 0xE9}, 67}, /* рищ */ - {{0xD1, 0xDE, 0xD2}, 67}, /* бов */ - {{0xD8, 0xE1, 0xDA}, 67}, /* иск */ - {{0xD5, 0xD1, 0xDE}, 67}, /* ебо */ - {{0xDB, 0xEC, 0xD7}, 67}, /* льз */ - {{0xE3, 0xDA, 0xD0}, 67}, /* ука */ - {{0xDB, 0xD8, 0xD1}, 66}, /* либ */ - {{0xDE, 0xDC, 0xE3}, 66}, /* ому */ - {{0xDE, 0xD2, 0xDB}, 66}, /* овл */ - {{0xE2, 0xDD, 0xDE}, 65}, /* тно */ - {{0xD2, 0xDE, 0xD9}, 64}, /* вой */ - {{0xE2, 0xDE, 0xD3}, 64}, /* тог */ - {{0xE1, 0xDB, 0xDE}, 64}, /* сло */ - {{0xDE, 0xD7, 0xDD}, 64}, /* озн */ - {{0xE1, 0xDE, 0xDE}, 64}, /* соо */ - {{0xD7, 0xD0, 0xE2}, 63}, /* зат */ - {{0xD8, 0xE1, 0xDF}, 63}, /* исп */ - {{0xD0, 0xE7, 0xD5}, 63}, /* аче */ - {{0xDD, 0xD8, 0xEE}, 63}, /* нию */ - {{0xDE, 0xDD, 0xD5}, 63}, /* оне */ - {{0xDE, 0xDB, 0xD6}, 62}, /* олж */ - {{0xDE, 0xD2, 0xE9}, 61}, /* овщ */ - {{0xE0, 0xD0, 0xE1}, 61}, /* рас */ - {{0xD2, 0xD8, 0xD4}, 61}, /* вид */ - {{0xD2, 0xE9, 0xD8}, 61}, /* вщи */ - {{0xE1, 0xDD, 0xDE}, 61}, /* сно */ - {{0xD8, 0xE6, 0xDE}, 61}, /* ицо */ - {{0xD8, 0xE7, 0xD5}, 61}, /* иче */ - {{0xD0, 0xD2, 0xD5}, 61}, /* аве */ - {{0xD3, 0xDB, 0xD0}, 61}, /* гла */ - {{0xE7, 0xD5, 0xE2}, 61}, /* чет */ - {{0xE9, 0xD8, 0xDA}, 61}, /* щик */ - {{0xE0, 0xE3, 0xD3}, 60}, /* руг */ - {{0xE2, 0xD0, 0xDD}, 60}, /* тан */ - {{0xD8, 0xDC, 0xDE}, 60}, /* имо */ - {{0xD0, 0xDB, 0xEC}, 60}, /* аль */ - {{0xDE, 0xD2, 0xD8}, 60}, /* ови */ - {{0xD6, 0xD4, 0xD0}, 60}, /* жда */ - {{0xDF, 0xDE, 0xD2}, 60}, /* пов */ - {{0xD5, 0xDC, 0xE3}, 60}, /* ему */ - {{0xEF, 0xE2, 0xD5}, 60}, /* яте */ - {{0xE1, 0xD8, 0xD8}, 59}, /* сии */ - {{0xD1, 0xDE, 0xE2}, 59}, /* бот */ - {{0xD2, 0xEB, 0xDF}, 59}, /* вып */ - {{0xD0, 0xD1, 0xDE}, 59}, /* або */ - {{0xDB, 0xEF, 0xEE}, 59}, /* ляю */ - {{0xE1, 0xE3, 0xE9}, 58}, /* сущ */ - {{0xDE, 0xD4, 0xD5}, 58}, /* оде */ - {{0xD8, 0xDD, 0xD8}, 58}, /* ини */ - {{0xE0, 0xD0, 0xE2}, 58}, /* рат */ - {{0xEF, 0xD2, 0xDB}, 58}, /* явл */ - {{0xDD, 0xD0, 0xD3}, 57}, /* наг */ - {{0xD4, 0xE0, 0xE3}, 57}, /* дру */ - {{0xE0, 0xD0, 0xD1}, 57}, /* раб */ - {{0xD0, 0xD3, 0xE0}, 57}, /* агр */ - {{0xD8, 0xDE, 0xDD}, 57}, /* ион */ - {{0xDC, 0xD5, 0xE1}, 57}, /* мес */ - {{0xD0, 0xE6, 0xD8}, 56}, /* аци */ - {{0xDE, 0xE1, 0xE3}, 56}, /* осу */ - {{0xDA, 0xDE, 0xD9}, 55}, /* кой */ - {{0xE1, 0xD2, 0xDE}, 55}, /* сво */ - {{0xD7, 0xDE, 0xD2}, 55}, /* зов */ - {{0xDE, 0xDF, 0xE0}, 54}, /* опр */ - {{0xE1, 0xDE, 0xD1}, 54}, /* соб */ - {{0xD2, 0xDF, 0xE0}, 54}, /* впр */ - {{0xDB, 0xDD, 0xD5}, 54}, /* лне */ - {{0xDE, 0xDC, 0xDC}, 54}, /* омм */ - {{0xD5, 0xE0, 0xD0}, 54}, /* ера */ - {{0xE7, 0xD8, 0xE2}, 54}, /* чит */ - {{0xD5, 0xE0, 0xE7}, 54}, /* ерч */ - {{0xE0, 0xE7, 0xD5}, 54}, /* рче */ - {{0xD0, 0xE2, 0xD8}, 54}, /* ати */ - {{0xDD, 0xD8, 0xDA}, 54}, /* ник */ - {{0xDC, 0xDC, 0xD5}, 54}, /* мме */ - {{0xE3, 0xE1, 0xE2}, 53}, /* уст */ - {{0xE2, 0xD5, 0xDD}, 53}, /* тен */ - {{0xD2, 0xD5, 0xD4}, 53}, /* вед */ - {{0xE1, 0xDE, 0xD2}, 52}, /* сов */ - {{0xD0, 0xD6, 0xD5}, 52}, /* аже */ - {{0xDE, 0xDA, 0xD0}, 52}, /* ока */ - {{0xEB, 0xDC, 0xD8}, 52}, /* ыми */ - {{0xEE, 0xE2, 0xE1}, 52}, /* ютс */ - {{0xDE, 0xDE, 0xE2}, 52}, /* оот */ - {{0xDC, 0xD8, 0xE2}, 52}, /* мит */ - {{0xEF, 0xEE, 0xE9}, 51}, /* яющ */ - {{0xD2, 0xE8, 0xD5}, 51}, /* вше */ - {{0xE1, 0xD8, 0xDE}, 51}, /* сио */ - {{0xDE, 0xDD, 0xDE}, 51}, /* оно */ - {{0xD0, 0xD2, 0xD0}, 51}, /* ава */ - {{0xD0, 0xE9, 0xD5}, 51}, /* аще */ - {{0xDB, 0xEF, 0xD5}, 50}, /* ляе */ - {{0xD5, 0xDD, 0xD5}, 50}, /* ене */ - {{0xDE, 0xD4, 0xD8}, 50}, /* оди */ - {{0xDF, 0xE3, 0xDD}, 49}, /* пун */ - {{0xDB, 0xD8, 0xE7}, 49}, /* лич */ - {{0xD2, 0xDE, 0xDC}, 49}, /* вом */ - {{0xDD, 0xDA, 0xE2}, 49}, /* нкт */ - {{0xDD, 0xD5, 0xE1}, 49}, /* нес */ - {{0xD2, 0xD8, 0xDB}, 49}, /* вил */ - {{0xD5, 0xD6, 0xD4}, 49}, /* ежд */ - {{0xE0, 0xD5, 0xE1}, 49}, /* рес */ - {{0xEE, 0xE9, 0xD5}, 49}, /* юще */ - {{0xEC, 0xD7, 0xDE}, 49}, /* ьзо */ - {{0xDF, 0xDE, 0xE2}, 49}, /* пот */ - {{0xE3, 0xDD, 0xDA}, 49}, /* унк */ - {{0xE1, 0xE2, 0xD5}, 49}, /* сте */ - {{0xDA, 0xDE, 0xD2}, 49}, /* ков */ - {{0xDE, 0xE1, 0xDB}, 48}, /* осл */ - {{0xEF, 0xD5, 0xE2}, 48}, /* яет */ - {{0xB5, 0xE1, 0xDB}, 48}, /* Есл */ - {{0xBF, 0xE0, 0xD8}, 48}, /* При */ - {{0xE2, 0xD0, 0xD2}, 48}, /* тав */ - {{0xDD, 0xD5, 0xE0}, 48}, /* нер */ - {{0xE7, 0xDD, 0xDE}, 47}, /* чно */ - {{0xDF, 0xDE, 0xD4}, 47}, /* под */ - {{0xDD, 0xE2, 0xD0}, 47}, /* нта */ - {{0xD8, 0xE9, 0xD5}, 47}, /* ище */ - {{0xDE, 0xD1, 0xE9}, 47}, /* общ */ - {{0xD0, 0xD7, 0xDC}, 47}, /* азм */ - {{0xD6, 0xDD, 0xDE}, 47}, /* жно */ - {{0xD2, 0xD8, 0xD8}, 46}, /* вии */ - {{0xE0, 0xD0, 0xE9}, 46}, /* ращ */ - {{0xDE, 0xE0, 0xD5}, 46}, /* оре */ - {{0xD2, 0xE8, 0xD8}, 46}, /* вши */ - {{0xD5, 0xDA, 0xE1}, 46}, /* екс */ - {{0xD2, 0xDE, 0xD3}, 46}, /* вог */ - {{0xE7, 0xE2, 0xDE}, 46}, /* что */ - {{0xD8, 0xE7, 0xDD}, 45}, /* ичн */ - {{0xDB, 0xD5, 0xDC}, 45}, /* лем */ - {{0xDC, 0xDE, 0xD3}, 45}, /* мог */ - {{0xE2, 0xD2, 0xDB}, 45}, /* твл */ - {{0xD4, 0xDB, 0xD5}, 45}, /* дле */ - {{0xD4, 0xDB, 0xEF}, 45}, /* для */ - {{0xE0, 0xD5, 0xE2}, 45}, /* рет */ - {{0xD0, 0xE0, 0xD0}, 45}, /* ара */ - {{0xDD, 0xEF, 0xE2}, 44}, /* нят */ - {{0xD5, 0xE7, 0xD5}, 44}, /* ече */ - {{0xDE, 0xE2, 0xD5}, 44}, /* оте */ - {{0xDE, 0xE0, 0xEB}, 44}, /* оры */ - {{0xDE, 0xE1, 0xDD}, 43}, /* осн */ - {{0xDE, 0xD1, 0xDE}, 43}, /* обо */ - {{0xDE, 0xD3, 0xDB}, 43}, /* огл */ - {{0xD8, 0xDD, 0xEB}, 43}, /* ины */ - {{0xD5, 0xE1, 0xE1}, 43}, /* есс */ - {{0xDE, 0xD1, 0xE0}, 43}, /* обр */ - {{0xDA, 0xE0, 0xD0}, 43}, /* кра */ - {{0xD8, 0xEF, 0xDC}, 43}, /* иям */ - {{0xD0, 0xDB, 0xDE}, 43}, /* ало */ - {{0xE0, 0xE3, 0xE7}, 43}, /* руч */ - {{0xDE, 0xE0, 0xD3}, 43}, /* орг */ - {{0xE7, 0xD0, 0xEF}, 42}, /* чая */ - {{0xDD, 0xD8, 0xDC}, 42}, /* ним */ - {{0xD8, 0xD7, 0xDD}, 42}, /* изн */ - {{0xDF, 0xDE, 0xDA}, 42}, /* пок */ - {{0xE1, 0xE2, 0xE3}, 42}, /* сту */ - {{0xD5, 0xDB, 0xEE}, 42}, /* елю */ - {{0xE2, 0xD8, 0xE2}, 42}, /* тит */ - {{0xE6, 0xD5, 0xDD}, 42}, /* цен */ - {{0xE7, 0xD0, 0xE1}, 42}, /* час */ - {{0xD3, 0xD0, 0xDD}, 42}, /* ган */ - {{0xE0, 0xD3, 0xD0}, 42}, /* рга */ - {{0xE1, 0xE2, 0xDD}, 42}, /* стн */ - {{0xE0, 0xD5, 0xD6}, 42}, /* реж */ - {{0xE3, 0xDC, 0xDC}, 42}, /* умм */ - {{0xE2, 0xD2, 0xE3}, 41}, /* тву */ - {{0xE2, 0xE3, 0xDF}, 41}, /* туп */ - {{0xE1, 0xDA, 0xD8}, 40}, /* ски */ - {{0xD4, 0xD5, 0xDA}, 40}, /* дек */ - {{0xDB, 0xD5, 0xD6}, 40}, /* леж */ - {{0xD5, 0xE1, 0xD5}, 40}, /* есе */ - {{0xD2, 0xD8, 0xD5}, 40}, /* вие */ - {{0xE2, 0xDA, 0xD0}, 40}, /* тка */ - {{0xD5, 0xDA, 0xE0}, 40}, /* екр */ - {{0xDE, 0xD4, 0xDE}, 40}, /* одо */ - {{0xDA, 0xE1, 0xD0}, 40}, /* кса */ - {{0xE0, 0xD5, 0xDA}, 40}, /* рек */ - {{0xDD, 0xE2, 0xD5}, 40}, /* нте */ - {{0xE3, 0xD3, 0xD8}, 40}, /* уги */ - {{0xD1, 0xEB, 0xDB}, 40}, /* был */ - {{0xD8, 0xDD, 0xEF}, 40}, /* иня */ - {{0xD5, 0xE9, 0xD8}, 39}, /* ещи */ - {{0xD3, 0xD5, 0xDD}, 39}, /* ген */ - {{0xBA, 0xDE, 0xD4}, 39}, /* Код */ - {{0xD4, 0xD8, 0xE2}, 39}, /* дит */ - {{0xE1, 0xE5, 0xDE}, 39}, /* схо */ - {{0xD8, 0xDD, 0xE2}, 39}, /* инт */ - {{0xE1, 0xE3, 0xDC}, 39}, /* сум */ - {{0xE0, 0xDE, 0xDD}, 39}, /* рон */ - {{0xDE, 0xE2, 0xDA}, 39}, /* отк */ - {{0xD4, 0xDE, 0xDA}, 39}, /* док */ - {{0xD8, 0xDB, 0xD0}, 38}, /* ила */ - {{0xE6, 0xD5, 0xE1}, 38}, /* цес */ - {{0xD8, 0xDA, 0xD0}, 38}, /* ика */ - {{0xD7, 0xDD, 0xD8}, 38}, /* зни */ - {{0xDE, 0xD2, 0xEB}, 38}, /* овы */ - {{0xDB, 0xD6, 0xDD}, 38}, /* лжн */ - {{0xE3, 0xDF, 0xDB}, 38}, /* упл */ - {{0xD3, 0xD4, 0xD0}, 37}, /* гда */ - {{0xDB, 0xD0, 0xD6}, 37}, /* лаж */ - {{0xD6, 0xD5, 0xD4}, 37}, /* жед */ - {{0xD1, 0xD5, 0xD7}, 37}, /* без */ - {{0xD4, 0xD5, 0xE2}, 37}, /* дет */ - {{0xDE, 0xE0, 0xEF}, 37}, /* оря */ - {{0xE0, 0xDE, 0xE1}, 37}, /* рос */ - {{0xDE, 0xD1, 0xDB}, 37}, /* обл */ - {{0xE6, 0xD8, 0xD8}, 37}, /* ции */ - {{0xD4, 0xDE, 0xDC}, 37}, /* дом */ - {{0xDD, 0xE6, 0xD5}, 37}, /* нце */ - {{0xE8, 0xD5, 0xD3}, 37}, /* шег */ - {{0xDB, 0xDE, 0xD6}, 37}, /* лож */ - {{0xDE, 0xDD, 0xD0}, 37}, /* она */ - {{0xDE, 0xDA, 0xDB}, 37}, /* окл */ - {{0xDE, 0xD3, 0xD4}, 37}, /* огд */ - {{0xE0, 0xDE, 0xD4}, 37}, /* род */ - {{0xD5, 0xDD, 0xD0}, 37}, /* ена */ - {{0xDE, 0xDD, 0xE6}, 37}, /* онц */ - {{0xDE, 0xE2, 0xDD}, 37}, /* отн */ - {{0xE1, 0xDE, 0xD3}, 37}, /* сог */ - {{0xD5, 0xD2, 0xE8}, 37}, /* евш */ - {{0xD2, 0xD8, 0xE2}, 36}, /* вит */ - {{0xD5, 0xE0, 0xDF}, 36}, /* ерп */ - {{0xDE, 0xD4, 0xD0}, 36}, /* ода */ - {{0xD5, 0xE2, 0xD5}, 36}, /* ете */ - {{0xDD, 0xD5, 0xDE}, 36}, /* нео */ - {{0xE0, 0xDF, 0xD5}, 36}, /* рпе */ - {{0xD5, 0xE0, 0xE8}, 36}, /* ерш */ - {{0xD8, 0xDC, 0xD8}, 36}, /* ими */ - {{0xD8, 0xD2, 0xE8}, 36}, /* ивш */ - {{0xEB, 0xDF, 0xDB}, 36}, /* ыпл */ - {{0xDF, 0xD5, 0xD2}, 36}, /* пев */ - {{0xD0, 0xD4, 0xD0}, 36}, /* ада */ - {{0xDC, 0xDE, 0xE1}, 35}, /* мос */ - {{0xDE, 0xD1, 0xE1}, 35}, /* обс */ - {{0xDD, 0xD5, 0xD4}, 34}, /* нед */ - {{0xD8, 0xDA, 0xDE}, 34}, /* ико */ - {{0xE9, 0xD8, 0xDC}, 34}, /* щим */ - {{0xD4, 0xD5, 0xE0}, 34}, /* дер */ - {{0xE1, 0xDA, 0xD0}, 34}, /* ска */ - {{0xDE, 0xE0, 0xDC}, 34}, /* орм */ - {{0xE3, 0xDC, 0xD5}, 34}, /* уме */ - {{0xDE, 0xDE, 0xD1}, 34}, /* ооб */ - {{0xE0, 0xD8, 0xE1}, 34}, /* рис */ - {{0xDE, 0xD1, 0xEA}, 33}, /* объ */ - {{0xDE, 0xDB, 0xE3}, 33}, /* олу */ - {{0xEA, 0xEF, 0xD2}, 33}, /* ъяв */ - {{0xE0, 0xD5, 0xDC}, 33}, /* рем */ - {{0xE9, 0xD8, 0xE5}, 33}, /* щих */ - {{0xE3, 0xEE, 0xE9}, 33}, /* ующ */ - {{0xDA, 0xD6, 0xD5}, 33}, /* кже */ - {{0xD8, 0xD4, 0xD5}, 33}, /* иде */ - {{0xD1, 0xE1, 0xE2}, 33}, /* бст */ - {{0xD0, 0xDA, 0xD6}, 33}, /* акж */ - {{0xD2, 0xE3, 0xEE}, 33}, /* вую */ - {{0xD0, 0xE1, 0xE5}, 33}, /* асх */ - {{0xD0, 0xDD, 0xD0}, 32}, /* ана */ - {{0xDD, 0xD0, 0xD4}, 32}, /* над */ - {{0xDE, 0xD1, 0xD5}, 32}, /* обе */ - {{0xEB, 0xE2, 0xDA}, 32}, /* ытк */ - {{0xED, 0xE2, 0xD8}, 32}, /* эти */ - {{0xDE, 0xD6, 0xDD}, 32}, /* ожн */ - {{0xD0, 0xE2, 0xEB}, 31}, /* аты */ - {{0xE1, 0xD4, 0xD5}, 31}, /* сде */ - {{0xD0, 0xEE, 0xE2}, 31}, /* ают */ - {{0xEF, 0xE2, 0xEC}, 31}, /* ять */ - {{0xDE, 0xEF, 0xE2}, 31}, /* оят */ - {{0xD5, 0xE2, 0xEC}, 31}, /* еть */ - {{0xD0, 0xD3, 0xD5}, 31}, /* аге */ - {{0xE7, 0xE0, 0xD5}, 31}, /* чре */ - {{0xD5, 0xDD, 0xEB}, 31}, /* ены */ - {{0xE3, 0xD1, 0xEB}, 31}, /* убы */ - {{0xD8, 0xE1, 0xE2}, 30}, /* ист */ - {{0xEF, 0xEE, 0xE2}, 30}, /* яют */ - {{0xE0, 0xEF, 0xD4}, 30}, /* ряд */ - {{0xD3, 0xDE, 0xE1}, 30}, /* гос */ - {{0xD8, 0xDC, 0xD0}, 30}, /* има */ - {{0xD7, 0xD0, 0xE1}, 30}, /* зас */ - {{0xD0, 0xEE, 0xE9}, 30}, /* ающ */ - {{0xDE, 0xD7, 0xD2}, 30}, /* озв */ - {{0xD5, 0xD4, 0xD8}, 30}, /* еди */ - {{0xDE, 0xDC, 0xD5}, 30}, /* оме */ - {{0xDD, 0xD8, 0xD9}, 30}, /* ний */ - {{0xE1, 0xE3, 0xD4}, 30}, /* суд */ - {{0xD7, 0xD4, 0xDE}, 29}, /* здо */ - {{0xE1, 0xD2, 0xD8}, 29}, /* сви */ - {{0xDE, 0xDB, 0xD8}, 29}, /* оли */ - {{0xDE, 0xD2, 0xEC}, 29}, /* овь */ - {{0xD2, 0xD8, 0xD9}, 29}, /* вий */ - {{0xD4, 0xDE, 0xE0}, 29}, /* дор */ - {{0xD4, 0xD5, 0xEF}, 29}, /* дея */ - {{0xD5, 0xEF, 0xE2}, 29}, /* еят */ - {{0xE6, 0xDE, 0xDC}, 29}, /* цом */ - {{0xD8, 0xD7, 0xD0}, 28}, /* иза */ - {{0xE1, 0xE7, 0xD5}, 28}, /* сче */ - {{0xDA, 0xE2, 0xD0}, 28}, /* кта */ - {{0xDE, 0xD4, 0xDD}, 28}, /* одн */ - {{0xD1, 0xDB, 0xD0}, 28}, /* бла */ - {{0xDE, 0xD4, 0xDB}, 28}, /* одл */ - {{0xD8, 0xE2, 0xD0}, 28}, /* ита */ - {{0xB4, 0xDE, 0xD3}, 28}, /* Дог */ - {{0xDE, 0xE1, 0xDE}, 28}, /* осо */ - {{0xDD, 0xDE, 0xE8}, 28}, /* нош */ - {{0xDA, 0xE3, 0xE0}, 28}, /* кур */ - {{0xD8, 0xDD, 0xD0}, 28}, /* ина */ - {{0xDE, 0xE8, 0xD5}, 28}, /* оше */ - {{0xDD, 0xD0, 0xDB}, 28}, /* нал */ - {{0xDD, 0xD8, 0xD7}, 27}, /* низ */ - {{0xD7, 0xD2, 0xE0}, 27}, /* звр */ - {{0xD2, 0xE0, 0xD0}, 27}, /* вра */ - {{0xDB, 0xD5, 0xE2}, 27}, /* лет */ - {{0xD5, 0xE9, 0xEC}, 27}, /* ещь */ - {{0xE0, 0xD8, 0xD4}, 27}, /* рид */ - {{0xD4, 0xDD, 0xDE}, 27}, /* дно */ - {{0xE0, 0xD8, 0xDE}, 27}, /* рио */ - {{0xDE, 0xD8, 0xDC}, 27}, /* оим */ - {{0xD5, 0xE0, 0xD6}, 27}, /* ерж */ - {{0xE3, 0xD2, 0xD5}, 26}, /* уве */ - {{0xDE, 0xDD, 0xDA}, 26}, /* онк */ - {{0xD5, 0xDB, 0xDA}, 26}, /* елк */ - {{0xDB, 0xD0, 0xD2}, 26}, /* лав */ - {{0xD0, 0xE2, 0xDE}, 26}, /* ато */ - {{0xEF, 0xDC, 0xD8}, 26}, /* ями */ - {{0xDC, 0xDC, 0xEB}, 26}, /* ммы */ - {{0xD5, 0xE1, 0xDF}, 26}, /* есп */ - {{0xDD, 0xDA, 0xE3}, 26}, /* нку */ - {{0xD8, 0xE6, 0xE3}, 25}, /* ицу */ - {{0xD4, 0xE1, 0xDA}, 25}, /* дск */ - {{0xDD, 0xD8, 0xDD}, 25}, /* нин */ - {{0xDF, 0xDB, 0xD5}, 25}, /* пле */ - {{0xE4, 0xDE, 0xE0}, 25}, /* фор */ - {{0xDB, 0xD0, 0xE1}, 25}, /* лас */ - {{0xD4, 0xD8, 0xDC}, 25}, /* дим */ - {{0xD5, 0xE1, 0xEF}, 25}, /* еся */ - {{0xDD, 0xD8, 0xE7}, 25}, /* нич */ - {{0xDE, 0xD2, 0xE0}, 25}, /* овр */ - {{0xD2, 0xE1, 0xDB}, 25}, /* всл */ - {{0xE0, 0xE8, 0xD5}, 25}, /* рше */ - {{0xD5, 0xE9, 0xD0}, 25}, /* еща */ - {{0xD6, 0xDD, 0xEB}, 25}, /* жны */ - {{0xE0, 0xD8, 0xDC}, 25}, /* рим */ - {{0xD7, 0xD0, 0xE6}, 25}, /* зац */ - {{0xD1, 0xE9, 0xD5}, 25}, /* бще */ - {{0xD0, 0xDA, 0xE2}, 25}, /* акт */ - {{0xD0, 0xD4, 0xE1}, 25}, /* адс */ - {{0xE3, 0xE7, 0xE0}, 25}, /* учр */ - {{0xE9, 0xD8, 0xD5}, 25}, /* щие */ - {{0xD6, 0xD8, 0xE2}, 24}, /* жит */ - {{0xD1, 0xE0, 0xD5}, 24}, /* бре */ - {{0xE3, 0xD3, 0xDE}, 24}, /* уго */ - {{0xD8, 0xEF, 0xE5}, 24}, /* иях */ - {{0xE2, 0xEC, 0xEE}, 24}, /* тью */ - {{0xEC, 0xE1, 0xEF}, 24}, /* ься */ - {{0xD2, 0xDE, 0xD2}, 24}, /* вов */ - {{0xDE, 0xE7, 0xDD}, 24}, /* очн */ - {{0xD2, 0xDE, 0xDE}, 24}, /* воо */ - {{0xDE, 0xD4, 0xEB}, 24}, /* оды */ - {{0xDB, 0xDE, 0xD3}, 24}, /* лог */ - {{0xD2, 0xD0, 0xD5}, 24}, /* вае */ - {{0xD0, 0xEF, 0xE5}, 24}, /* аях */ - {{0xE2, 0xEC, 0xE1}, 24}, /* тьс */ - {{0xD4, 0xD8, 0xE7}, 24}, /* дич */ - {{0xDA, 0xD8, 0xE5}, 24}, /* ких */ - {{0xE6, 0xD0, 0xDC}, 24}, /* цам */ - {{0xD8, 0xD7, 0xD2}, 24}, /* изв */ - {{0xE2, 0xD8, 0xD2}, 24}, /* тив */ - {{0xD5, 0xDE, 0xD1}, 24}, /* еоб */ - {{0xE1, 0xDE, 0xE1}, 24}, /* сос */ - {{0xE8, 0xD8, 0xDC}, 24}, /* шим */ - {{0xEB, 0xDF, 0xDE}, 24}, /* ыпо */ - {{0xD5, 0xD6, 0xD0}, 24}, /* ежа */ - {{0xE2, 0xDE, 0xD8}, 24}, /* тои */ - {{0xDA, 0xE2, 0xDE}, 24}, /* кто */ - {{0xD5, 0xE7, 0xD0}, 24}, /* еча */ - {{0xD8, 0xD4, 0xD8}, 24}, /* иди */ - {{0xD1, 0xE9, 0xD8}, 23}, /* бщи */ - {{0xE2, 0xEC, 0xD5}, 23}, /* тье */ - {{0xD1, 0xEA, 0xEF}, 23}, /* бъя */ - {{0xDD, 0xD0, 0xE7}, 23}, /* нач */ - {{0xE2, 0xD5, 0xE7}, 23}, /* теч */ - {{0xE3, 0xE0, 0xE1}, 23}, /* урс */ - {{0xD2, 0xD5, 0xE7}, 23}, /* веч */ - {{0xD5, 0xDC, 0xD5}, 23}, /* еме */ - {{0xDE, 0xD1, 0xE5}, 23}, /* обх */ - {{0xD1, 0xE5, 0xDE}, 23}, /* бхо */ - {{0xD4, 0xD0, 0xD5}, 23}, /* дае */ - {{0xE0, 0xD5, 0xD7}, 23}, /* рез */ - {{0xDA, 0xD0, 0xD6}, 22}, /* каж */ - {{0xDE, 0xDA, 0xE3}, 22}, /* оку */ - {{0xD0, 0xDC, 0xD5}, 22}, /* аме */ - {{0xDD, 0xD5, 0xD7}, 22}, /* нез */ - {{0xEB, 0xD2, 0xD0}, 22}, /* ыва */ - {{0xE1, 0xD2, 0xEF}, 22}, /* свя */ - {{0xE0, 0xD0, 0xD4}, 22}, /* рад */ - {{0xD5, 0xD7, 0xD0}, 22}, /* еза */ - {{0xD8, 0xD2, 0xD0}, 22}, /* ива */ - {{0xDA, 0xD0, 0xDC}, 22}, /* кам */ - {{0xDD, 0xD5, 0xDC}, 22}, /* нем */ - {{0xE2, 0xDA, 0xDE}, 22}, /* тко */ - {{0xD7, 0xD2, 0xD5}, 22}, /* зве */ - {{0xD2, 0xEF, 0xD7}, 22}, /* вяз */ - {{0xEF, 0xE2, 0xD8}, 22}, /* яти */ - {{0xDE, 0xE5, 0xE0}, 22}, /* охр */ - {{0xE0, 0xDE, 0xE2}, 22}, /* рот */ - {{0xDE, 0xDB, 0xD5}, 22}, /* оле */ - {{0xD1, 0xE0, 0xD0}, 22}, /* бра */ - {{0xD0, 0xD5, 0xDC}, 22}, /* аем */ - {{0xDB, 0xD0, 0xE8}, 21}, /* лаш */ - {{0xD8, 0xD7, 0xDC}, 21}, /* изм */ - {{0xD3, 0xE3, 0xE2}, 21}, /* гут */ - {{0xDE, 0xD6, 0xD4}, 21}, /* ожд */ - {{0xDA, 0xD0, 0xDA}, 21}, /* как */ - {{0xDA, 0xD0, 0xE7}, 21}, /* кач */ - {{0xDD, 0xD0, 0xDC}, 21}, /* нам */ - {{0xD4, 0xDE, 0xE5}, 21}, /* дох */ - {{0xDE, 0xE5, 0xDE}, 21}, /* охо */ - {{0xEE, 0xE0, 0xD8}, 21}, /* юри */ - {{0xD2, 0xD0, 0xDC}, 21}, /* вам */ - {{0xD7, 0xDC, 0xDE}, 21}, /* змо */ - {{0xD4, 0xDA, 0xD5}, 21}, /* дке */ - {{0xD1, 0xD0, 0xDD}, 21}, /* бан */ - {{0xD5, 0xDB, 0xD8}, 21}, /* ели */ - {{0xE0, 0xD8, 0xD7}, 21}, /* риз */ - {{0xDB, 0xDD, 0xDE}, 21}, /* лно */ - {{0xD2, 0xEB, 0xE8}, 21}, /* выш */ - {{0xD4, 0xE6, 0xD0}, 21}, /* дца */ - {{0xEF, 0xD4, 0xDA}, 21}, /* ядк */ - {{0xDE, 0xE2, 0xE1}, 21}, /* отс */ - {{0xE2, 0xD5, 0xD9}, 21}, /* тей */ - {{0xD0, 0xDD, 0xDA}, 21}, /* анк */ - {{0xDD, 0xD5, 0xD3}, 21}, /* нег */ - {{0xE6, 0xD0, 0xE2}, 21}, /* цат */ - {{0xD5, 0xDC, 0xEB}, 21}, /* емы */ - {{0xD2, 0xDE, 0xD5}, 21}, /* вое */ - {{0xD4, 0xD0, 0xE7}, 21}, /* дач */ - {{0xDE, 0xD3, 0xE3}, 21}, /* огу */ - {{0xDB, 0xD6, 0xD5}, 21}, /* лже */ - {{0xE2, 0xDD, 0xD8}, 21}, /* тни */ - {{0xD7, 0xD0, 0xD2}, 21}, /* зав */ - {{0xD2, 0xD5, 0xE1}, 21}, /* вес */ - {{0xE1, 0xD0, 0xDC}, 20}, /* сам */ - {{0xD0, 0xE0, 0xDD}, 20}, /* арн */ - {{0xE7, 0xDD, 0xEB}, 20}, /* чны */ - {{0xE1, 0xE0, 0xD5}, 20}, /* сре */ - {{0xE2, 0xD8, 0xEF}, 20}, /* тия */ - {{0xD8, 0xE1, 0xDB}, 20}, /* исл */ - {{0xC1, 0xE2, 0xE0}, 20}, /* Стр */ - {{0xDD, 0xE2, 0xDE}, 20}, /* нто */ - {{0xE3, 0xE2, 0xE0}, 20}, /* утр */ - {{0xD0, 0xE8, 0xD5}, 20}, /* аше */ - {{0xD5, 0xDB, 0xD0}, 20}, /* ела */ - {{0xE3, 0xD4, 0xDE}, 20}, /* удо */ - {{0xD6, 0xD8, 0xD7}, 19}, /* жиз */ - {{0xDF, 0xD8, 0xE1}, 19}, /* пис */ - {{0xD0, 0xD8, 0xDC}, 19}, /* аим */ - {{0xE7, 0xD8, 0xE1}, 19}, /* чис */ - {{0xD5, 0xD6, 0xD8}, 19}, /* ежи */ - {{0xD2, 0xE1, 0xD5}, 19}, /* все */ - {{0xDB, 0xEC, 0xDA}, 19}, /* льк */ - {{0xD0, 0xE2, 0xE3}, 19}, /* ату */ - {{0xE3, 0xD4, 0xD0}, 19}, /* уда */ - {{0xE8, 0xD8, 0xD9}, 19}, /* ший */ - {{0xD7, 0xD0, 0xE0}, 19}, /* зар */ - {{0xD5, 0xD4, 0xDD}, 19}, /* едн */ - {{0xD0, 0xD2, 0xE8}, 19}, /* авш */ - {{0xE0, 0xDE, 0xD8}, 19}, /* рои */ - {{0xD8, 0xD4, 0xD0}, 19}, /* ида */ - {{0xD0, 0xE0, 0xDE}, 19}, /* аро */ - {{0xE2, 0xDE, 0xD9}, 19}, /* той */ - {{0xD6, 0xD0, 0xE9}, 19}, /* жащ */ - {{0xD5, 0xE1, 0xDE}, 19}, /* есо */ - {{0xDF, 0xD0, 0xDB}, 19}, /* пал */ - {{0xE9, 0xD0, 0xD5}, 19}, /* щае */ - {{0xE0, 0xEB, 0xD5}, 19}, /* рые */ - {{0xD5, 0xDD, 0xEF}, 19}, /* еня */ - {{0xE9, 0xD8, 0xD9}, 19}, /* щий */ - {{0xDB, 0xE3, 0xD3}, 19}, /* луг */ - {{0xEE, 0xE7, 0xD8}, 18}, /* ючи */ - {{0xE3, 0xDB, 0xEC}, 18}, /* уль */ - {{0xDC, 0xEB, 0xE5}, 18}, /* мых */ - {{0xE0, 0xDE, 0xD3}, 18}, /* рог */ - {{0xE1, 0xDE, 0xE5}, 18}, /* сох */ - {{0xDA, 0xDE, 0xD5}, 18}, /* кое */ - {{0xDD, 0xE2, 0xE1}, 18}, /* нтс */ - {{0xD0, 0xD7, 0xDD}, 18}, /* азн */ - {{0xE2, 0xDD, 0xEB}, 18}, /* тны */ - {{0xDE, 0xD4, 0xEF}, 18}, /* одя */ - {{0xDE, 0xD1, 0xDD}, 18}, /* обн */ - {{0xD2, 0xEB, 0xD4}, 18}, /* выд */ - {{0xDE, 0xE1, 0xEF}, 18}, /* ося */ - {{0xEC, 0xE2, 0xD0}, 18}, /* ьта */ - {{0xDD, 0xEF, 0xEE}, 18}, /* няю */ - {{0xDD, 0xD0, 0xE0}, 18}, /* нар */ - {{0xD5, 0xD7, 0xE3}, 18}, /* езу */ - {{0xD0, 0xE1, 0xDD}, 18}, /* асн */ - {{0xD7, 0xE3, 0xDB}, 18}, /* зул */ - {{0xE6, 0xD8, 0xDF}, 18}, /* цип */ - {{0xDA, 0xE2, 0xD5}, 18}, /* кте */ - {{0xD4, 0xDE, 0xDF}, 18}, /* доп */ - {{0xDD, 0xE6, 0xD8}, 18}, /* нци */ - {{0xE1, 0xDF, 0xD5}, 18}, /* спе */ - {{0xD8, 0xDC, 0xEB}, 18}, /* имы */ - {{0xDC, 0xDE, 0xDC}, 18}, /* мом */ - {{0xDF, 0xD5, 0xE7}, 18}, /* печ */ - {{0xBE, 0xD1, 0xEF}, 18}, /* Обя */ - {{0xBF, 0xE0, 0xD0}, 18}, /* Пра */ - {{0xDE, 0xDB, 0xDE}, 18}, /* оло */ - {{0xE2, 0xE1, 0xDA}, 18}, /* тск */ - {{0xDB, 0xDD, 0xD8}, 18}, /* лни */ - {{0xD5, 0xE0, 0xE2}, 18}, /* ерт */ - {{0xD8, 0xE1, 0xEC}, 18}, /* ись */ - {{0xDB, 0xEC, 0xE2}, 18}, /* льт */ - {{0xE1, 0xE3, 0xE2}, 18}, /* сут */ - {{0xD2, 0xDE, 0xD1}, 17}, /* воб */ - {{0xE0, 0xDD, 0xEB}, 17}, /* рны */ - {{0xD1, 0xDD, 0xEB}, 17}, /* бны */ - {{0xEB, 0xD4, 0xD0}, 17}, /* ыда */ - {{0xEC, 0xD7, 0xE3}, 17}, /* ьзу */ - {{0xD5, 0xD4, 0xDF}, 17}, /* едп */ - {{0xD0, 0xD4, 0xD5}, 17}, /* аде */ - {{0xD8, 0xDF, 0xD0}, 17}, /* ипа */ - {{0xE1, 0xD5, 0xD9}, 17}, /* сей */ - {{0xD5, 0xD5, 0xE1}, 17}, /* еес */ - {{0xDE, 0xD8, 0xD7}, 17}, /* оиз */ - {{0xDE, 0xE1, 0xD2}, 17}, /* осв */ - {{0xD4, 0xD8, 0xD2}, 17}, /* див */ - {{0xDD, 0xD0, 0xDD}, 17}, /* нан */ - {{0xD5, 0xE2, 0xD0}, 17}, /* ета */ - {{0xD4, 0xDD, 0xD5}, 17}, /* дне */ - {{0xD8, 0xDE, 0xD1}, 17}, /* иоб */ - {{0xE3, 0xD5, 0xE2}, 17}, /* ует */ - {{0xDD, 0xD0, 0xE5}, 17}, /* нах */ - {{0xE1, 0xDC, 0xD5}, 17}, /* сме */ - {{0xD0, 0xDB, 0xD8}, 17}, /* али */ - {{0xD1, 0xEA, 0xD5}, 17}, /* бъе */ - {{0xDF, 0xD0, 0xE1}, 17}, /* пас */ - {{0xD7, 0xD0, 0xDB}, 17}, /* зал */ - {{0xE0, 0xD6, 0xD0}, 16}, /* ржа */ - {{0xEF, 0xD2, 0xD8}, 16}, /* яви */ - {{0xD6, 0xD0, 0xE2}, 16}, /* жат */ - {{0xD1, 0xDE, 0xD6}, 16}, /* бож */ - {{0xE1, 0xD8, 0xDB}, 16}, /* сил */ - {{0xDD, 0xE3, 0xEE}, 16}, /* ную */ - {{0xDF, 0xD5, 0xDD}, 16}, /* пен */ - {{0xDC, 0xD0, 0xE2}, 16}, /* мат */ - {{0xDE, 0xDD, 0xDD}, 16}, /* онн */ - {{0xD2, 0xD8, 0xDD}, 16}, /* вин */ - {{0xE2, 0xDA, 0xD8}, 16}, /* тки */ - {{0xE2, 0xDE, 0xE7}, 16}, /* точ */ - {{0xE1, 0xE7, 0xD8}, 16}, /* счи */ - {{0xDD, 0xD8, 0xE6}, 16}, /* ниц */ - {{0xE9, 0xD5, 0xD5}, 16}, /* щее */ - {{0xD1, 0xD5, 0xE1}, 16}, /* бес */ - {{0xD0, 0xD4, 0xE6}, 16}, /* адц */ - {{0xBA, 0xDE, 0xDC}, 16}, /* Ком */ - {{0xEC, 0xD8, 0xDC}, 16}, /* ьим */ - {{0xE3, 0xE2, 0xE1}, 16}, /* утс */ - {{0xD0, 0xE7, 0xD8}, 16}, /* ачи */ - {{0xDF, 0xDE, 0xDD}, 16}, /* пон */ - {{0xDA, 0xD0, 0xD5}, 16}, /* кае */ - {{0xD8, 0xD3, 0xE0}, 16}, /* игр */ - {{0xD0, 0xDA, 0xD8}, 16}, /* аки */ - {{0xD0, 0xE9, 0xD8}, 16}, /* ащи */ - {{0xDB, 0xEC, 0xE6}, 16}, /* льц */ - {{0xD2, 0xDD, 0xDE}, 16}, /* вно */ - {{0xEB, 0xE8, 0xD5}, 15}, /* ыше */ - {{0xBB, 0xD8, 0xE6}, 15}, /* Лиц */ - {{0xEC, 0xD5, 0xD9}, 15}, /* ьей */ - {{0xE8, 0xD5, 0xDC}, 15}, /* шем */ - {{0xE3, 0xD1, 0xDB}, 15}, /* убл */ - {{0xE0, 0xD0, 0xE6}, 15}, /* рац */ - {{0xDA, 0xE3, 0xDC}, 15}, /* кум */ - {{0xE0, 0xD5, 0xD3}, 15}, /* рег */ - {{0xDE, 0xDF, 0xD0}, 15}, /* опа */ - {{0xB2, 0xDE, 0xD7}, 15}, /* Воз */ - {{0xE2, 0xD0, 0xD5}, 15}, /* тае */ - {{0xDE, 0xD1, 0xEB}, 15}, /* обы */ - {{0xD1, 0xDB, 0xD8}, 15}, /* бли */ - {{0xE0, 0xDC, 0xD5}, 15}, /* рме */ - {{0xD2, 0xDE, 0xE1}, 15}, /* вос */ - {{0xD0, 0xE1, 0xD8}, 15}, /* аси */ - {{0xE2, 0xD0, 0xDC}, 15}, /* там */ - {{0xEC, 0xDC, 0xD5}, 15}, /* ьме */ - {{0xDE, 0xD3, 0xD0}, 15}, /* ога */ - {{0xD8, 0xDB, 0xDE}, 15}, /* ило */ - {{0xE1, 0xEC, 0xDC}, 15}, /* сьм */ - {{0xE0, 0xE2, 0xD8}, 15}, /* рти */ - {{0xE2, 0xE1, 0xE3}, 15}, /* тсу */ - {{0xE1, 0xD5, 0xDD}, 15}, /* сен */ - {{0xE2, 0xD0, 0xDB}, 15}, /* тал */ - {{0xD4, 0xD0, 0xE0}, 15}, /* дар */ - {{0xD0, 0xDC, 0xDE}, 15}, /* амо */ - {{0xD5, 0xD4, 0xDB}, 15}, /* едл */ - {{0xE1, 0xE3, 0xD1}, 15}, /* суб */ - {{0xD5, 0xD9, 0xE4}, 15}, /* ейф */ - {{0xC5, 0xE0, 0xD0}, 15}, /* Хра */ - {{0xDB, 0xD0, 0xDC}, 14}, /* лам */ - {{0xD0, 0xE0, 0xE3}, 14}, /* ару */ - {{0xD3, 0xD8, 0xE5}, 14}, /* гих */ - {{0xE6, 0xD8, 0xEF}, 14}, /* ция */ - {{0xD4, 0xD0, 0xD2}, 14}, /* дав */ - {{0xDB, 0xD8, 0xE8}, 14}, /* лиш */ - {{0xEE, 0xE7, 0xD0}, 14}, /* юча */ - {{0xD0, 0xDD, 0xE1}, 14}, /* анс */ - {{0xDE, 0xD3, 0xE0}, 14}, /* огр */ - {{0xD8, 0xE9, 0xD0}, 14}, /* ища */ - {{0xD5, 0xDD, 0xEC}, 14}, /* ень */ - {{0xDE, 0xE2, 0xD8}, 14}, /* оти */ - {{0xD0, 0xD4, 0xEB}, 13}, /* ады */ - {{0xD0, 0xE9, 0xD0}, 13}, /* аща */ - {{0xD2, 0xDE, 0xD8}, 13}, /* вои */ - {{0xD2, 0xEB, 0xDC}, 13}, /* вым */ - {{0xD2, 0xEC, 0xEF}, 13}, /* вья */ - {{0xDA, 0xD8, 0xD5}, 13}, /* кие */ - {{0xDB, 0xD8, 0xE1}, 13}, /* лис */ - {{0xDC, 0xD5, 0xD4}, 13}, /* мед */ - {{0xE2, 0xD8, 0xE5}, 13}, /* тих */ - {{0xD5, 0xE2, 0xDE}, 13}, /* ето */ - {{0xD7, 0xDB, 0xDE}, 13}, /* зло */ - {{0xDE, 0xDF, 0xD5}, 13}, /* опе */ - {{0xE1, 0xD8, 0xDC}, 13}, /* сим */ - {{0xEF, 0xD7, 0xD8}, 13}, /* язи */ - {{0xD8, 0xDD, 0xD4}, 13}, /* инд */ - {{0xE7, 0xE3, 0xD6}, 13}, /* чуж */ - {{0xDB, 0xDA, 0xD8}, 13}, /* лки */ - {{0xD4, 0xDF, 0xE0}, 13}, /* дпр */ - {{0xDD, 0xD4, 0xD8}, 13}, /* нди */ - {{0xDE, 0xE2, 0xD0}, 13}, /* ота */ - {{0xDE, 0xE2, 0xEB}, 13}, /* оты */ - {{0xDB, 0xD0, 0xE7}, 13}, /* лач */ - {{0xDA, 0xD8, 0xDC}, 13}, /* ким */ - {{0xD8, 0xE1, 0xD8}, 13}, /* иси */ - {{0xD2, 0xD0, 0xDB}, 13}, /* вал */ - {{0xD5, 0xDC, 0xDE}, 13}, /* емо */ - {{0xDF, 0xE3, 0xD1}, 13}, /* пуб */ - {{0xEF, 0xD5, 0xDC}, 13}, /* яем */ - {{0xD1, 0xDE, 0xDB}, 13}, /* бол */ - {{0xDD, 0xE2, 0xE3}, 13}, /* нту */ - {{0xDD, 0xD5, 0xD9}, 13}, /* ней */ - {{0xDD, 0xD0, 0xEF}, 13}, /* ная */ - {{0xD5, 0xE1, 0xD0}, 13}, /* еса */ - {{0xE0, 0xDD, 0xDE}, 13}, /* рно */ - {{0xE9, 0xD5, 0xDC}, 13}, /* щем */ - {{0xD0, 0xDD, 0xEB}, 13}, /* аны */ - {{0xB4, 0xDE, 0xD2}, 13}, /* Дов */ - {{0xE7, 0xD8, 0xD2}, 13}, /* чив */ - {{0xD2, 0xD8, 0xE1}, 13}, /* вис */ - {{0xDE, 0xDF, 0xDE}, 13}, /* опо */ - {{0xD2, 0xEC, 0xEE}, 13}, /* вью */ - {{0xD0, 0xDB, 0xD0}, 13}, /* ала */ - {{0xDB, 0xD5, 0xD9}, 12}, /* лей */ - {{0xD0, 0xE7, 0xD0}, 12}, /* ача */ - {{0xD5, 0xD7, 0xD2}, 12}, /* езв */ - {{0xD2, 0xD0, 0xEF}, 12}, /* вая */ - {{0xD5, 0xDE, 0xE1}, 12}, /* еос */ - {{0xEF, 0xE9, 0xD8}, 12}, /* ящи */ - {{0xD8, 0xD2, 0xD8}, 12}, /* иви */ - {{0xDD, 0xD5, 0xD5}, 12}, /* нее */ - {{0xE2, 0xE0, 0xE3}, 12}, /* тру */ - {{0xE8, 0xD5, 0xD5}, 12}, /* шее */ - {{0xE1, 0xD0, 0xE5}, 12}, /* сах */ - {{0xD8, 0xDD, 0xE6}, 12}, /* инц */ - {{0xDE, 0xDC, 0xDF}, 12}, /* омп */ - {{0xE3, 0xD6, 0xDE}, 12}, /* ужо */ - {{0xE3, 0xD0, 0xDB}, 12}, /* уал */ - {{0xDD, 0xD0, 0xE2}, 12}, /* нат */ - {{0xD8, 0xD4, 0xE3}, 12}, /* иду */ - {{0xD2, 0xDB, 0xD0}, 12}, /* вла */ - {{0xD7, 0xD2, 0xD0}, 12}, /* зва */ - {{0xDB, 0xD5, 0xD5}, 12}, /* лее */ - {{0xE0, 0xD5, 0xE5}, 12}, /* рех */ - {{0xD6, 0xD4, 0xE3}, 12}, /* жду */ - {{0xDC, 0xD0, 0xDB}, 12}, /* мал */ - {{0xD5, 0xDD, 0xE1}, 12}, /* енс */ - {{0xD8, 0xD9, 0xE1}, 12}, /* ийс */ - {{0xDA, 0xDE, 0xDB}, 12}, /* кол */ - {{0xDD, 0xD0, 0xD7}, 12}, /* наз */ - {{0xD4, 0xE3, 0xD0}, 12}, /* дуа */ - {{0xDE, 0xDD, 0xD8}, 12}, /* они */ - {{0xE1, 0xD5, 0xDC}, 12}, /* сем */ - {{0xD3, 0xDE, 0xD4}, 12}, /* год */ - {{0xDC, 0xD5, 0xD6}, 12}, /* меж */ - {{0xDE, 0xD7, 0xDB}, 12}, /* озл */ - {{0xD2, 0xDC, 0xD5}, 12}, /* вме */ - {{0xE3, 0xD4, 0xD5}, 12}, /* уде */ - {{0xEC, 0xDA, 0xDE}, 12}, /* ько */ - {{0xD5, 0xD2, 0xEB}, 12}, /* евы */ - {{0xD7, 0xD0, 0xDC}, 12}, /* зам */ - {{0xE1, 0xDE, 0xD4}, 12}, /* сод */ - {{0xE0, 0xDE, 0xD5}, 11}, /* рое */ - {{0xDE, 0xE2, 0xD4}, 11}, /* отд */ - {{0xE1, 0xD8, 0xEF}, 11}, /* сия */ - {{0xD8, 0xDA, 0xE3}, 11}, /* ику */ - {{0xEB, 0xDB, 0xD8}, 11}, /* ыли */ - {{0xD3, 0xD8, 0xDC}, 11}, /* гим */ - {{0xDD, 0xEC, 0xE8}, 11}, /* ньш */ - {{0xE2, 0xD8, 0xE7}, 11}, /* тич */ - {{0xE0, 0xD0, 0xDB}, 11}, /* рал */ - {{0xE3, 0xE7, 0xD8}, 11}, /* учи */ - {{0xDC, 0xD5, 0xEE}, 11}, /* мею */ - {{0xE2, 0xD5, 0xDA}, 11}, /* тек */ - {{0xDE, 0xD1, 0xE3}, 11}, /* обу */ - {{0xDD, 0xDD, 0xE3}, 11}, /* нну */ - {{0xDD, 0xD5, 0xDF}, 11}, /* неп */ - {{0xD2, 0xD5, 0xDB}, 11}, /* вел */ - {{0xE2, 0xDC, 0xD5}, 11}, /* тме */ - {{0xD1, 0xDE, 0xD3}, 11}, /* бог */ - {{0xDE, 0xE0, 0xD8}, 11}, /* ори */ - {{0xD0, 0xD2, 0xDD}, 11}, /* авн */ - {{0xD4, 0xD5, 0xD5}, 11}, /* дее */ - {{0xD6, 0xDE, 0xDC}, 11}, /* жом */ - {{0xB2, 0xE0, 0xD5}, 11}, /* Вре */ - {{0xDC, 0xEB, 0xD5}, 11}, /* мые */ - {{0xEC, 0xE6, 0xD0}, 11}, /* ьца */ - {{0xDE, 0xE6, 0xD5}, 11}, /* оце */ - {{0xD8, 0xE2, 0xEB}, 10}, /* иты */ - {{0xD7, 0xE0, 0xD0}, 10}, /* зра */ - {{0xDE, 0xDD, 0xEB}, 10}, /* оны */ - {{0xE0, 0xD5, 0xE8}, 10}, /* реш */ - {{0xE3, 0xE8, 0xD5}, 10}, /* уше */ - {{0xE0, 0xD5, 0xD2}, 10}, /* рев */ - {{0xDE, 0xDF, 0xE3}, 10}, /* опу */ - {{0xEF, 0xE2, 0xEB}, 10}, /* яты */ - {{0xE2, 0xD0, 0xE7}, 10}, /* тач */ - {{0xD5, 0xE0, 0xDE}, 10}, /* еро */ - {{0xD2, 0xDA, 0xDB}, 10}, /* вкл */ - {{0xD7, 0xEB, 0xD2}, 10}, /* зыв */ - {{0xD0, 0xDF, 0xE0}, 10}, /* апр */ - {{0xE0, 0xE3, 0xE8}, 10}, /* руш */ - {{0xBE, 0xE2, 0xD2}, 10}, /* Отв */ - {{0xE0, 0xE1, 0xD0}, 10}, /* рса */ - {{0xD5, 0xDA, 0xE2}, 10}, /* ект */ - {{0xDB, 0xD5, 0xDA}, 10}, /* лек */ - {{0xD5, 0xD5, 0xE2}, 10}, /* еет */ - {{0xDE, 0xDF, 0xDB}, 10}, /* опл */ - {{0xE2, 0xE7, 0xD5}, 10}, /* тче */ - {{0xD3, 0xDE, 0xDC}, 10}, /* гом */ - {{0xE2, 0xDE, 0xD6}, 10}, /* тож */ - {{0xDB, 0xD5, 0xE7}, 10}, /* леч */ - {{0xD5, 0xE2, 0xEB}, 10}, /* еты */ - {{0xDE, 0xD6, 0xD8}, 10}, /* ожи */ - {{0xDC, 0xDD, 0xDE}, 10}, /* мно */ - {{0xDC, 0xDE, 0xD9}, 10}, /* мой */ - {{0xE6, 0xD5, 0xDB}, 10}, /* цел */ - {{0xE3, 0xDF, 0xD8}, 10}, /* упи */ - {{0xD0, 0xD5, 0xD2}, 10}, /* аев */ - {{0xDF, 0xDE, 0xDC}, 10}, /* пом */ - {{0xD4, 0xEF, 0xE9}, 10}, /* дящ */ - {{0xE2, 0xE0, 0xD8}, 10}, /* три */ - {{0xE8, 0xD8, 0xD5}, 10}, /* шие */ - {{0xD5, 0xDA, 0xD0}, 10}, /* ека */ - {{0xD5, 0xE8, 0xD5}, 10}, /* еше */ - {{0xD7, 0xD0, 0xD8}, 10}, /* заи */ - {{0xD8, 0xE2, 0xDE}, 10}, /* ито */ - {{0xD7, 0xDD, 0xEB}, 10}, /* зны */ - {{0xDE, 0xEF, 0xDD}, 10}, /* оян */ - {{0xD8, 0xD6, 0xD5}, 10}, /* иже */ - {{0xD2, 0xDD, 0xD5}, 10}, /* вне */ - {{0xE0, 0xE1, 0xE2}, 10}, /* рст */ - {{0xD5, 0xDC, 0xEF}, 10}, /* емя */ - {{0xDD, 0xD0, 0xD8}, 10}, /* наи */ - {{0xE2, 0xDE, 0xDB}, 10}, /* тол */ - {{0xDB, 0xD8, 0xE2}, 10}, /* лит */ - {{0xDE, 0xE1, 0xE0}, 10}, /* оср */ - {{0xE2, 0xD4, 0xD5}, 10}, /* тде */ - {{0xD5, 0xDC, 0xD8}, 10}, /* еми */ - {{0xDC, 0xD5, 0xD5}, 10}, /* мее */ - {{0xE0, 0xEB, 0xE5}, 10}, /* рых */ - {{0xDD, 0xD8, 0xD2}, 10}, /* нив */ - {{0xD5, 0xE0, 0xE3}, 10}, /* еру */ - {{0xE7, 0xD5, 0xDC}, 10}, /* чем */ - {{0xD4, 0xDE, 0xD1}, 10}, /* доб */ - {{0xD5, 0xDB, 0xDE}, 10}, /* ело */ - {{0xD8, 0xDB, 0xE3}, 10}, /* илу */ - {{0xD0, 0xD4, 0xDB}, 10}, /* адл */ - {{0xD8, 0xE7, 0xE2}, 10}, /* ичт */ - {{0xDC, 0xDB, 0xD5}, 10}, /* мле */ -}; - -static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_koi8_r[] = { - {{0xC5, 0xCE, 0xC9}, 991}, /* ени */ - {{0xCF, 0xC7, 0xCF}, 806}, /* ого */ - {{0xD3, 0xD4, 0xD7}, 659}, /* ств */ - {{0xCE, 0xC9, 0xD1}, 629}, /* ния */ - {{0xCF, 0xD7, 0xC1}, 566}, /* ова */ - {{0xD4, 0xC5, 0xCC}, 555}, /* тел */ - {{0xD2, 0xC5, 0xC4}, 507}, /* ред */ - {{0xC5, 0xCE, 0xCE}, 499}, /* енн */ - {{0xCF, 0xD7, 0xCF}, 443}, /* ово */ - {{0xC1, 0xCE, 0xC9}, 443}, /* ани */ - {{0xD4, 0xD2, 0xC1}, 429}, /* тра */ - {{0xCF, 0xD3, 0xD4}, 428}, /* ост */ - {{0xCE, 0xC9, 0xC5}, 419}, /* ние */ - {{0xCE, 0xCE, 0xCF}, 412}, /* нно */ - {{0xC1, 0xC8, 0xCF}, 396}, /* ахо */ - {{0xD3, 0xD4, 0xD2}, 392}, /* стр */ - {{0xD2, 0xC1, 0xC8}, 386}, /* рах */ - {{0xC8, 0xCF, 0xD7}, 379}, /* хов */ - {{0xC5, 0xCC, 0xD8}, 365}, /* ель */ - {{0xC7, 0xCF, 0xD7}, 360}, /* гов */ - {{0xD7, 0xCF, 0xD2}, 356}, /* вор */ - {{0xC5, 0xD3, 0xD4}, 349}, /* ест */ - {{0xC1, 0xD4, 0xD8}, 345}, /* ать */ - {{0xD2, 0xC1, 0xD7}, 337}, /* рав */ - {{0xD0, 0xD2, 0xC9}, 330}, /* при */ - {{0xD0, 0xD2, 0xC5}, 323}, /* пре */ - {{0xC4, 0xCF, 0xC7}, 318}, /* дог */ - {{0xCE, 0xC5, 0xCE}, 310}, /* нен */ - {{0xD0, 0xD2, 0xC1}, 309}, /* пра */ - {{0xD7, 0xC1, 0xCE}, 304}, /* ван */ - {{0xC9, 0xD4, 0xC5}, 295}, /* ите */ - {{0xD4, 0xD7, 0xC5}, 281}, /* тве */ - {{0xCC, 0xC5, 0xCE}, 266}, /* лен */ - {{0xD3, 0xD4, 0xCF}, 261}, /* сто */ - {{0xD4, 0xC1, 0xD4}, 260}, /* тат */ - {{0xCE, 0xCE, 0xD9}, 260}, /* нны */ - {{0xCC, 0xD8, 0xCE}, 256}, /* льн */ - {{0xD7, 0xCF, 0xDA}, 255}, /* воз */ - {{0xC9, 0xCC, 0xC9}, 254}, /* или */ - {{0xC1, 0xD4, 0xC5}, 252}, /* ате */ - {{0xC5, 0xC7, 0xCF}, 241}, /* его */ - {{0xC5, 0xD4, 0xD3}, 238}, /* етс */ - {{0xCE, 0xCF, 0xD3}, 236}, /* нос */ - {{0xDD, 0xC5, 0xD3}, 235}, /* щес */ - {{0xD0, 0xCF, 0xCC}, 232}, /* пол */ - {{0xD2, 0xC1, 0xCE}, 231}, /* ран */ - {{0xCE, 0xCF, 0xC7}, 230}, /* ног */ - {{0xD3, 0xD4, 0xC1}, 229}, /* ста */ - {{0xDE, 0xC5, 0xCE}, 226}, /* чен */ - {{0xD4, 0xD2, 0xC5}, 224}, /* тре */ - {{0xDA, 0xCD, 0xC5}, 214}, /* зме */ - {{0xD5, 0xDD, 0xC5}, 212}, /* уще */ - {{0xD3, 0xD4, 0xC9}, 210}, /* сти */ - {{0xCB, 0xCF, 0xCD}, 207}, /* ком */ - {{0xCF, 0xD2, 0xCF}, 206}, /* оро */ - {{0xD7, 0xCC, 0xC5}, 195}, /* вле */ - {{0xDA, 0xC1, 0xCE}, 194}, /* зан */ - {{0xC1, 0xD3, 0xD4}, 193}, /* аст */ - {{0xD4, 0xD3, 0xD1}, 191}, /* тся */ - {{0xC8, 0xD2, 0xC1}, 187}, /* хра */ - {{0xC1, 0xCE, 0xCE}, 182}, /* анн */ - {{0xC5, 0xD2, 0xC5}, 182}, /* ере */ - {{0xD7, 0xD2, 0xC5}, 178}, /* вре */ - {{0xCF, 0xD7, 0xC5}, 173}, /* ове */ - {{0xD8, 0xCE, 0xCF}, 173}, /* ьно */ - {{0xD7, 0xC5, 0xD2}, 172}, /* вер */ - {{0xCD, 0xC5, 0xCE}, 170}, /* мен */ - {{0xCC, 0xC9, 0xC3}, 168}, /* лиц */ - {{0xD4, 0xCF, 0xD2}, 167}, /* тор */ - {{0xD2, 0xC5, 0xCE}, 167}, /* рен */ - {{0xDD, 0xC5, 0xCE}, 165}, /* щен */ - {{0xCF, 0xDA, 0xCD}, 164}, /* озм */ - {{0xC5, 0xC4, 0xC1}, 163}, /* еда */ - {{0xD4, 0xD7, 0xC9}, 159}, /* тви */ - {{0xD1, 0xDA, 0xC1}, 159}, /* яза */ - {{0xC2, 0xD1, 0xDA}, 158}, /* бяз */ - {{0xCE, 0xC9, 0xC9}, 153}, /* нии */ - {{0xCE, 0xD9, 0xC8}, 153}, /* ных */ - {{0xD4, 0xD8, 0xD1}, 153}, /* тья */ - {{0xCD, 0xC5, 0xD2}, 153}, /* мер */ - {{0xD3, 0xCC, 0xC9}, 150}, /* сли */ - {{0xD4, 0xCF, 0xD7}, 148}, /* тов */ - {{0xD4, 0xD7, 0xC1}, 147}, /* тва */ - {{0xCF, 0xD2, 0xC1}, 146}, /* ора */ - {{0xCE, 0xCF, 0xCD}, 144}, /* ном */ - {{0xC4, 0xC5, 0xCE}, 144}, /* ден */ - {{0xC1, 0xCE, 0xC5}, 142}, /* ане */ - {{0xCB, 0xCF, 0xCE}, 141}, /* кон */ - {{0xCC, 0xD5, 0xDE}, 141}, /* луч */ - {{0xCD, 0xD5, 0xDD}, 140}, /* мущ */ - {{0xCF, 0xC2, 0xD1}, 140}, /* обя */ - {{0xD7, 0xC1, 0xD4}, 138}, /* ват */ - {{0xD7, 0xC1, 0xD2}, 137}, /* вар */ - {{0xC5, 0xDD, 0xC5}, 137}, /* еще */ - {{0xCF, 0xD4, 0xD2}, 137}, /* отр */ - {{0xC4, 0xC5, 0xCC}, 137}, /* дел */ - {{0xCE, 0xD9, 0xCD}, 136}, /* ным */ - {{0xC9, 0xCD, 0xD5}, 136}, /* иму */ - {{0xF3, 0xD4, 0xC1}, 134}, /* Ста */ - {{0xD5, 0xDE, 0xC1}, 133}, /* уча */ - {{0xD4, 0xD3, 0xD4}, 131}, /* тст */ - {{0xC5, 0xCC, 0xD1}, 130}, /* еля */ - {{0xD3, 0xCC, 0xD5}, 130}, /* слу */ - {{0xDA, 0xC1, 0xCB}, 130}, /* зак */ - {{0xD4, 0xCF, 0xD1}, 129}, /* тоя */ - {{0xCF, 0xCD, 0xC9}, 128}, /* оми */ - {{0xCD, 0xC5, 0xDD}, 128}, /* мещ */ - {{0xC5, 0xC4, 0xD5}, 127}, /* еду */ - {{0xD7, 0xC5, 0xCE}, 127}, /* вен */ - {{0xCE, 0xCF, 0xD7}, 127}, /* нов */ - {{0xCE, 0xCF, 0xC5}, 126}, /* ное */ - {{0xCF, 0xD4, 0xD7}, 125}, /* отв */ - {{0xCB, 0xC1, 0xDA}, 125}, /* каз */ - {{0xC1, 0xC5, 0xD4}, 125}, /* ает */ - {{0xD3, 0xCB, 0xCF}, 125}, /* ско */ - {{0xC5, 0xCE, 0xD4}, 124}, /* ент */ - {{0xCD, 0xCF, 0xD4}, 123}, /* мот */ - {{0xC1, 0xD7, 0xCC}, 122}, /* авл */ - {{0xD3, 0xCD, 0xCF}, 122}, /* смо */ - {{0xC9, 0xDE, 0xC9}, 121}, /* ичи */ - {{0xC2, 0xD9, 0xD4}, 120}, /* быт */ - {{0xD5, 0xD3, 0xCD}, 118}, /* усм */ - {{0xD3, 0xD3, 0xC9}, 117}, /* сси */ - {{0xC4, 0xD5, 0xD3}, 117}, /* дус */ - {{0xC8, 0xCF, 0xC4}, 117}, /* ход */ - {{0xD2, 0xC9, 0xDE}, 117}, /* рич */ - {{0xDE, 0xC5, 0xD3}, 115}, /* чес */ - {{0xC7, 0xD2, 0xC1}, 114}, /* гра */ - {{0xD0, 0xD2, 0xCF}, 114}, /* про */ - {{0xC4, 0xCF, 0xD7}, 113}, /* дов */ - {{0xD7, 0xC5, 0xD4}, 112}, /* вет */ - {{0xC5, 0xC4, 0xC5}, 112}, /* еде */ - {{0xDB, 0xC5, 0xCE}, 111}, /* шен */ - {{0xDE, 0xC9, 0xCE}, 110}, /* чин */ - {{0xCE, 0xC1, 0xD3}, 109}, /* нас */ - {{0xC9, 0xD4, 0xD8}, 105}, /* ить */ - {{0xD4, 0xD7, 0xCF}, 105}, /* тво */ - {{0xCB, 0xCC, 0xC0}, 104}, /* клю */ - {{0xD2, 0xC9, 0xD4}, 104}, /* рит */ - {{0xD3, 0xD4, 0xD8}, 104}, /* сть */ - {{0xCC, 0xC0, 0xDE}, 104}, /* люч */ - {{0xD4, 0xCF, 0xCD}, 104}, /* том */ - {{0xD3, 0xCC, 0xC5}, 103}, /* сле */ - {{0xD3, 0xD0, 0xCF}, 102}, /* спо */ - {{0xCF, 0xCC, 0xCE}, 102}, /* олн */ - {{0xC5, 0xD3, 0xCC}, 102}, /* есл */ - {{0xC5, 0xD2, 0xC9}, 101}, /* ери */ - {{0xCE, 0xCF, 0xCA}, 101}, /* ной */ - {{0xD2, 0xCF, 0xCD}, 101}, /* ром */ - {{0xCF, 0xD4, 0xCF}, 99}, /* ото */ - {{0xCE, 0xD9, 0xC5}, 99}, /* ные */ - {{0xDA, 0xCE, 0xC1}, 99}, /* зна */ - {{0xD7, 0xCC, 0xD1}, 99}, /* вля */ - {{0xD4, 0xC5, 0xD2}, 98}, /* тер */ - {{0xD5, 0xD0, 0xD2}, 97}, /* упр */ - {{0xC1, 0xCB, 0xCF}, 96}, /* ако */ - {{0xCB, 0xCF, 0xC7}, 96}, /* ког */ - {{0xCE, 0xD9, 0xCA}, 96}, /* ный */ - {{0xCF, 0xD2, 0xD5}, 96}, /* ору */ - {{0xC5, 0xCC, 0xC5}, 95}, /* еле */ - {{0xC5, 0xD3, 0xCB}, 95}, /* еск */ - {{0xC1, 0xDA, 0xC1}, 95}, /* аза */ - {{0xCA, 0xD3, 0xD4}, 93}, /* йст */ - {{0xD0, 0xCF, 0xD2}, 93}, /* пор */ - {{0xCF, 0xD6, 0xC5}, 92}, /* оже */ - {{0xC9, 0xCE, 0xC5}, 91}, /* ине */ - {{0xDD, 0xC5, 0xCA}, 90}, /* щей */ - {{0xD6, 0xC4, 0xC5}, 90}, /* жде */ - {{0xD0, 0xC5, 0xD2}, 89}, /* пер */ - {{0xCE, 0xC9, 0xD4}, 89}, /* нит */ - {{0xCF, 0xCC, 0xD8}, 89}, /* оль */ - {{0xC1, 0xD6, 0xC4}, 88}, /* ажд */ - {{0xD6, 0xC5, 0xCE}, 87}, /* жен */ - {{0xCC, 0xC1, 0xC4}, 87}, /* лад */ - {{0xC1, 0xCD, 0xC9}, 87}, /* ами */ - {{0xCB, 0xCF, 0xD4}, 86}, /* кот */ - {{0xDE, 0xC1, 0xC5}, 85}, /* чае */ - {{0xD7, 0xC5, 0xDD}, 85}, /* вещ */ - {{0xD7, 0xC9, 0xD1}, 85}, /* вия */ - {{0xD1, 0xDD, 0xC5}, 85}, /* яще */ - {{0xC9, 0xC5, 0xCD}, 85}, /* ием */ - {{0xCB, 0xCC, 0xC1}, 85}, /* кла */ - {{0xC5, 0xCA, 0xD3}, 84}, /* ейс */ - {{0xD9, 0xD4, 0xD8}, 84}, /* ыть */ - {{0xC1, 0xD7, 0xCF}, 84}, /* аво */ - {{0xD2, 0xC1, 0xD6}, 83}, /* раж */ - {{0xCC, 0xD8, 0xD3}, 83}, /* льс */ - {{0xCF, 0xD1, 0xDD}, 82}, /* оящ */ - {{0xC5, 0xCE, 0xCF}, 81}, /* ено */ - {{0xC4, 0xD3, 0xD4}, 81}, /* дст */ - {{0xC4, 0xC5, 0xCA}, 80}, /* дей */ - {{0xD2, 0xC5, 0xC2}, 80}, /* реб */ - {{0xD8, 0xD3, 0xD4}, 79}, /* ьст */ - {{0xC5, 0xC4, 0xD3}, 79}, /* едс */ - {{0xC1, 0xD2, 0xC9}, 79}, /* ари */ - {{0xC4, 0xC1, 0xCE}, 79}, /* дан */ - {{0xCD, 0xCF, 0xD6}, 78}, /* мож */ - {{0xC9, 0xCD, 0xC5}, 78}, /* име */ - {{0xC9, 0xCE, 0xCF}, 78}, /* ино */ - {{0xD2, 0xC9, 0xCE}, 77}, /* рин */ - {{0xC4, 0xCF, 0xD3}, 77}, /* дос */ - {{0xD0, 0xCF, 0xD3}, 77}, /* пос */ - {{0xD4, 0xC1, 0xCB}, 77}, /* так */ - {{0xDD, 0xC5, 0xC7}, 77}, /* щег */ - {{0xC4, 0xC1, 0xD4}, 77}, /* дат */ - {{0xD0, 0xCC, 0xC1}, 76}, /* пла */ - {{0xD5, 0xD3, 0xCC}, 76}, /* усл */ - {{0xC9, 0xC3, 0xC1}, 76}, /* ица */ - {{0xD2, 0xCF, 0xD7}, 75}, /* ров */ - {{0xDC, 0xD4, 0xCF}, 75}, /* это */ - {{0xD5, 0xDE, 0xC5}, 74}, /* уче */ - {{0xC4, 0xCF, 0xCC}, 73}, /* дол */ - {{0xD8, 0xCE, 0xD9}, 73}, /* ьны */ - {{0xD2, 0xC1, 0xDA}, 73}, /* раз */ - {{0xCD, 0xC9, 0xD3}, 73}, /* мис */ - {{0xC1, 0xCE, 0xCF}, 72}, /* ано */ - {{0xD3, 0xD2, 0xCF}, 72}, /* сро */ - {{0xC1, 0xD7, 0xC9}, 72}, /* ави */ - {{0xD4, 0xD8, 0xC9}, 71}, /* тьи */ - {{0xC0, 0xDE, 0xC5}, 70}, /* юче */ - {{0xD3, 0xCB, 0xCC}, 70}, /* скл */ - {{0xC9, 0xD3, 0xD3}, 70}, /* исс */ - {{0xD6, 0xC5, 0xD4}, 69}, /* жет */ - {{0xC5, 0xC4, 0xCF}, 69}, /* едо */ - {{0xCC, 0xC5, 0xC4}, 69}, /* лед */ - {{0xCC, 0xCF, 0xD7}, 69}, /* лов */ - {{0xC0, 0xDD, 0xC9}, 68}, /* ющи */ - {{0xC9, 0xC2, 0xCF}, 68}, /* ибо */ - {{0xCC, 0xC1, 0xD4}, 67}, /* лат */ - {{0xD2, 0xCF, 0xCB}, 67}, /* рок */ - {{0xC1, 0xCB, 0xCC}, 67}, /* акл */ - {{0xD2, 0xC9, 0xDD}, 67}, /* рищ */ - {{0xC2, 0xCF, 0xD7}, 67}, /* бов */ - {{0xC9, 0xD3, 0xCB}, 67}, /* иск */ - {{0xC5, 0xC2, 0xCF}, 67}, /* ебо */ - {{0xCC, 0xD8, 0xDA}, 67}, /* льз */ - {{0xD5, 0xCB, 0xC1}, 67}, /* ука */ - {{0xCC, 0xC9, 0xC2}, 66}, /* либ */ - {{0xCF, 0xCD, 0xD5}, 66}, /* ому */ - {{0xCF, 0xD7, 0xCC}, 66}, /* овл */ - {{0xD4, 0xCE, 0xCF}, 65}, /* тно */ - {{0xD7, 0xCF, 0xCA}, 64}, /* вой */ - {{0xD4, 0xCF, 0xC7}, 64}, /* тог */ - {{0xD3, 0xCC, 0xCF}, 64}, /* сло */ - {{0xCF, 0xDA, 0xCE}, 64}, /* озн */ - {{0xD3, 0xCF, 0xCF}, 64}, /* соо */ - {{0xDA, 0xC1, 0xD4}, 63}, /* зат */ - {{0xC9, 0xD3, 0xD0}, 63}, /* исп */ - {{0xC1, 0xDE, 0xC5}, 63}, /* аче */ - {{0xCE, 0xC9, 0xC0}, 63}, /* нию */ - {{0xCF, 0xCE, 0xC5}, 63}, /* оне */ - {{0xCF, 0xCC, 0xD6}, 62}, /* олж */ - {{0xCF, 0xD7, 0xDD}, 61}, /* овщ */ - {{0xD2, 0xC1, 0xD3}, 61}, /* рас */ - {{0xD7, 0xC9, 0xC4}, 61}, /* вид */ - {{0xD7, 0xDD, 0xC9}, 61}, /* вщи */ - {{0xD3, 0xCE, 0xCF}, 61}, /* сно */ - {{0xC9, 0xC3, 0xCF}, 61}, /* ицо */ - {{0xC9, 0xDE, 0xC5}, 61}, /* иче */ - {{0xC1, 0xD7, 0xC5}, 61}, /* аве */ - {{0xC7, 0xCC, 0xC1}, 61}, /* гла */ - {{0xDE, 0xC5, 0xD4}, 61}, /* чет */ - {{0xDD, 0xC9, 0xCB}, 61}, /* щик */ - {{0xD2, 0xD5, 0xC7}, 60}, /* руг */ - {{0xD4, 0xC1, 0xCE}, 60}, /* тан */ - {{0xC9, 0xCD, 0xCF}, 60}, /* имо */ - {{0xC1, 0xCC, 0xD8}, 60}, /* аль */ - {{0xCF, 0xD7, 0xC9}, 60}, /* ови */ - {{0xD6, 0xC4, 0xC1}, 60}, /* жда */ - {{0xD0, 0xCF, 0xD7}, 60}, /* пов */ - {{0xC5, 0xCD, 0xD5}, 60}, /* ему */ - {{0xD1, 0xD4, 0xC5}, 60}, /* яте */ - {{0xD3, 0xC9, 0xC9}, 59}, /* сии */ - {{0xC2, 0xCF, 0xD4}, 59}, /* бот */ - {{0xD7, 0xD9, 0xD0}, 59}, /* вып */ - {{0xC1, 0xC2, 0xCF}, 59}, /* або */ - {{0xCC, 0xD1, 0xC0}, 59}, /* ляю */ - {{0xD3, 0xD5, 0xDD}, 58}, /* сущ */ - {{0xCF, 0xC4, 0xC5}, 58}, /* оде */ - {{0xC9, 0xCE, 0xC9}, 58}, /* ини */ - {{0xD2, 0xC1, 0xD4}, 58}, /* рат */ - {{0xD1, 0xD7, 0xCC}, 58}, /* явл */ - {{0xCE, 0xC1, 0xC7}, 57}, /* наг */ - {{0xC4, 0xD2, 0xD5}, 57}, /* дру */ - {{0xD2, 0xC1, 0xC2}, 57}, /* раб */ - {{0xC1, 0xC7, 0xD2}, 57}, /* агр */ - {{0xC9, 0xCF, 0xCE}, 57}, /* ион */ - {{0xCD, 0xC5, 0xD3}, 57}, /* мес */ - {{0xC1, 0xC3, 0xC9}, 56}, /* аци */ - {{0xCF, 0xD3, 0xD5}, 56}, /* осу */ - {{0xCB, 0xCF, 0xCA}, 55}, /* кой */ - {{0xD3, 0xD7, 0xCF}, 55}, /* сво */ - {{0xDA, 0xCF, 0xD7}, 55}, /* зов */ - {{0xCF, 0xD0, 0xD2}, 54}, /* опр */ - {{0xD3, 0xCF, 0xC2}, 54}, /* соб */ - {{0xD7, 0xD0, 0xD2}, 54}, /* впр */ - {{0xCC, 0xCE, 0xC5}, 54}, /* лне */ - {{0xCF, 0xCD, 0xCD}, 54}, /* омм */ - {{0xC5, 0xD2, 0xC1}, 54}, /* ера */ - {{0xDE, 0xC9, 0xD4}, 54}, /* чит */ - {{0xC5, 0xD2, 0xDE}, 54}, /* ерч */ - {{0xD2, 0xDE, 0xC5}, 54}, /* рче */ - {{0xC1, 0xD4, 0xC9}, 54}, /* ати */ - {{0xCE, 0xC9, 0xCB}, 54}, /* ник */ - {{0xCD, 0xCD, 0xC5}, 54}, /* мме */ - {{0xD5, 0xD3, 0xD4}, 53}, /* уст */ - {{0xD4, 0xC5, 0xCE}, 53}, /* тен */ - {{0xD7, 0xC5, 0xC4}, 53}, /* вед */ - {{0xD3, 0xCF, 0xD7}, 52}, /* сов */ - {{0xC1, 0xD6, 0xC5}, 52}, /* аже */ - {{0xCF, 0xCB, 0xC1}, 52}, /* ока */ - {{0xD9, 0xCD, 0xC9}, 52}, /* ыми */ - {{0xC0, 0xD4, 0xD3}, 52}, /* ютс */ - {{0xCF, 0xCF, 0xD4}, 52}, /* оот */ - {{0xCD, 0xC9, 0xD4}, 52}, /* мит */ - {{0xD1, 0xC0, 0xDD}, 51}, /* яющ */ - {{0xD7, 0xDB, 0xC5}, 51}, /* вше */ - {{0xD3, 0xC9, 0xCF}, 51}, /* сио */ - {{0xCF, 0xCE, 0xCF}, 51}, /* оно */ - {{0xC1, 0xD7, 0xC1}, 51}, /* ава */ - {{0xC1, 0xDD, 0xC5}, 51}, /* аще */ - {{0xCC, 0xD1, 0xC5}, 50}, /* ляе */ - {{0xC5, 0xCE, 0xC5}, 50}, /* ене */ - {{0xCF, 0xC4, 0xC9}, 50}, /* оди */ - {{0xD0, 0xD5, 0xCE}, 49}, /* пун */ - {{0xCC, 0xC9, 0xDE}, 49}, /* лич */ - {{0xD7, 0xCF, 0xCD}, 49}, /* вом */ - {{0xCE, 0xCB, 0xD4}, 49}, /* нкт */ - {{0xCE, 0xC5, 0xD3}, 49}, /* нес */ - {{0xD7, 0xC9, 0xCC}, 49}, /* вил */ - {{0xC5, 0xD6, 0xC4}, 49}, /* ежд */ - {{0xD2, 0xC5, 0xD3}, 49}, /* рес */ - {{0xC0, 0xDD, 0xC5}, 49}, /* юще */ - {{0xD8, 0xDA, 0xCF}, 49}, /* ьзо */ - {{0xD0, 0xCF, 0xD4}, 49}, /* пот */ - {{0xD5, 0xCE, 0xCB}, 49}, /* унк */ - {{0xD3, 0xD4, 0xC5}, 49}, /* сте */ - {{0xCB, 0xCF, 0xD7}, 49}, /* ков */ - {{0xCF, 0xD3, 0xCC}, 48}, /* осл */ - {{0xD1, 0xC5, 0xD4}, 48}, /* яет */ - {{0xE5, 0xD3, 0xCC}, 48}, /* Есл */ - {{0xF0, 0xD2, 0xC9}, 48}, /* При */ - {{0xD4, 0xC1, 0xD7}, 48}, /* тав */ - {{0xCE, 0xC5, 0xD2}, 48}, /* нер */ - {{0xDE, 0xCE, 0xCF}, 47}, /* чно */ - {{0xD0, 0xCF, 0xC4}, 47}, /* под */ - {{0xCE, 0xD4, 0xC1}, 47}, /* нта */ - {{0xC9, 0xDD, 0xC5}, 47}, /* ище */ - {{0xCF, 0xC2, 0xDD}, 47}, /* общ */ - {{0xC1, 0xDA, 0xCD}, 47}, /* азм */ - {{0xD6, 0xCE, 0xCF}, 47}, /* жно */ - {{0xD7, 0xC9, 0xC9}, 46}, /* вии */ - {{0xD2, 0xC1, 0xDD}, 46}, /* ращ */ - {{0xCF, 0xD2, 0xC5}, 46}, /* оре */ - {{0xD7, 0xDB, 0xC9}, 46}, /* вши */ - {{0xC5, 0xCB, 0xD3}, 46}, /* екс */ - {{0xD7, 0xCF, 0xC7}, 46}, /* вог */ - {{0xDE, 0xD4, 0xCF}, 46}, /* что */ - {{0xC9, 0xDE, 0xCE}, 45}, /* ичн */ - {{0xCC, 0xC5, 0xCD}, 45}, /* лем */ - {{0xCD, 0xCF, 0xC7}, 45}, /* мог */ - {{0xD4, 0xD7, 0xCC}, 45}, /* твл */ - {{0xC4, 0xCC, 0xC5}, 45}, /* дле */ - {{0xC4, 0xCC, 0xD1}, 45}, /* для */ - {{0xD2, 0xC5, 0xD4}, 45}, /* рет */ - {{0xC1, 0xD2, 0xC1}, 45}, /* ара */ - {{0xCE, 0xD1, 0xD4}, 44}, /* нят */ - {{0xC5, 0xDE, 0xC5}, 44}, /* ече */ - {{0xCF, 0xD4, 0xC5}, 44}, /* оте */ - {{0xCF, 0xD2, 0xD9}, 44}, /* оры */ - {{0xCF, 0xD3, 0xCE}, 43}, /* осн */ - {{0xCF, 0xC2, 0xCF}, 43}, /* обо */ - {{0xCF, 0xC7, 0xCC}, 43}, /* огл */ - {{0xC9, 0xCE, 0xD9}, 43}, /* ины */ - {{0xC5, 0xD3, 0xD3}, 43}, /* есс */ - {{0xCF, 0xC2, 0xD2}, 43}, /* обр */ - {{0xCB, 0xD2, 0xC1}, 43}, /* кра */ - {{0xC9, 0xD1, 0xCD}, 43}, /* иям */ - {{0xC1, 0xCC, 0xCF}, 43}, /* ало */ - {{0xD2, 0xD5, 0xDE}, 43}, /* руч */ - {{0xCF, 0xD2, 0xC7}, 43}, /* орг */ - {{0xDE, 0xC1, 0xD1}, 42}, /* чая */ - {{0xCE, 0xC9, 0xCD}, 42}, /* ним */ - {{0xC9, 0xDA, 0xCE}, 42}, /* изн */ - {{0xD0, 0xCF, 0xCB}, 42}, /* пок */ - {{0xD3, 0xD4, 0xD5}, 42}, /* сту */ - {{0xC5, 0xCC, 0xC0}, 42}, /* елю */ - {{0xD4, 0xC9, 0xD4}, 42}, /* тит */ - {{0xC3, 0xC5, 0xCE}, 42}, /* цен */ - {{0xDE, 0xC1, 0xD3}, 42}, /* час */ - {{0xC7, 0xC1, 0xCE}, 42}, /* ган */ - {{0xD2, 0xC7, 0xC1}, 42}, /* рга */ - {{0xD3, 0xD4, 0xCE}, 42}, /* стн */ - {{0xD2, 0xC5, 0xD6}, 42}, /* реж */ - {{0xD5, 0xCD, 0xCD}, 42}, /* умм */ - {{0xD4, 0xD7, 0xD5}, 41}, /* тву */ - {{0xD4, 0xD5, 0xD0}, 41}, /* туп */ - {{0xD3, 0xCB, 0xC9}, 40}, /* ски */ - {{0xC4, 0xC5, 0xCB}, 40}, /* дек */ - {{0xCC, 0xC5, 0xD6}, 40}, /* леж */ - {{0xC5, 0xD3, 0xC5}, 40}, /* есе */ - {{0xD7, 0xC9, 0xC5}, 40}, /* вие */ - {{0xD4, 0xCB, 0xC1}, 40}, /* тка */ - {{0xC5, 0xCB, 0xD2}, 40}, /* екр */ - {{0xCF, 0xC4, 0xCF}, 40}, /* одо */ - {{0xCB, 0xD3, 0xC1}, 40}, /* кса */ - {{0xD2, 0xC5, 0xCB}, 40}, /* рек */ - {{0xCE, 0xD4, 0xC5}, 40}, /* нте */ - {{0xD5, 0xC7, 0xC9}, 40}, /* уги */ - {{0xC2, 0xD9, 0xCC}, 40}, /* был */ - {{0xC9, 0xCE, 0xD1}, 40}, /* иня */ - {{0xC5, 0xDD, 0xC9}, 39}, /* ещи */ - {{0xC7, 0xC5, 0xCE}, 39}, /* ген */ - {{0xEB, 0xCF, 0xC4}, 39}, /* Код */ - {{0xC4, 0xC9, 0xD4}, 39}, /* дит */ - {{0xD3, 0xC8, 0xCF}, 39}, /* схо */ - {{0xC9, 0xCE, 0xD4}, 39}, /* инт */ - {{0xD3, 0xD5, 0xCD}, 39}, /* сум */ - {{0xD2, 0xCF, 0xCE}, 39}, /* рон */ - {{0xCF, 0xD4, 0xCB}, 39}, /* отк */ - {{0xC4, 0xCF, 0xCB}, 39}, /* док */ - {{0xC9, 0xCC, 0xC1}, 38}, /* ила */ - {{0xC3, 0xC5, 0xD3}, 38}, /* цес */ - {{0xC9, 0xCB, 0xC1}, 38}, /* ика */ - {{0xDA, 0xCE, 0xC9}, 38}, /* зни */ - {{0xCF, 0xD7, 0xD9}, 38}, /* овы */ - {{0xCC, 0xD6, 0xCE}, 38}, /* лжн */ - {{0xD5, 0xD0, 0xCC}, 38}, /* упл */ - {{0xC7, 0xC4, 0xC1}, 37}, /* гда */ - {{0xCC, 0xC1, 0xD6}, 37}, /* лаж */ - {{0xD6, 0xC5, 0xC4}, 37}, /* жед */ - {{0xC2, 0xC5, 0xDA}, 37}, /* без */ - {{0xC4, 0xC5, 0xD4}, 37}, /* дет */ - {{0xCF, 0xD2, 0xD1}, 37}, /* оря */ - {{0xD2, 0xCF, 0xD3}, 37}, /* рос */ - {{0xCF, 0xC2, 0xCC}, 37}, /* обл */ - {{0xC3, 0xC9, 0xC9}, 37}, /* ции */ - {{0xC4, 0xCF, 0xCD}, 37}, /* дом */ - {{0xCE, 0xC3, 0xC5}, 37}, /* нце */ - {{0xDB, 0xC5, 0xC7}, 37}, /* шег */ - {{0xCC, 0xCF, 0xD6}, 37}, /* лож */ - {{0xCF, 0xCE, 0xC1}, 37}, /* она */ - {{0xCF, 0xCB, 0xCC}, 37}, /* окл */ - {{0xCF, 0xC7, 0xC4}, 37}, /* огд */ - {{0xD2, 0xCF, 0xC4}, 37}, /* род */ - {{0xC5, 0xCE, 0xC1}, 37}, /* ена */ - {{0xCF, 0xCE, 0xC3}, 37}, /* онц */ - {{0xCF, 0xD4, 0xCE}, 37}, /* отн */ - {{0xD3, 0xCF, 0xC7}, 37}, /* сог */ - {{0xC5, 0xD7, 0xDB}, 37}, /* евш */ - {{0xD7, 0xC9, 0xD4}, 36}, /* вит */ - {{0xC5, 0xD2, 0xD0}, 36}, /* ерп */ - {{0xCF, 0xC4, 0xC1}, 36}, /* ода */ - {{0xC5, 0xD4, 0xC5}, 36}, /* ете */ - {{0xCE, 0xC5, 0xCF}, 36}, /* нео */ - {{0xD2, 0xD0, 0xC5}, 36}, /* рпе */ - {{0xC5, 0xD2, 0xDB}, 36}, /* ерш */ - {{0xC9, 0xCD, 0xC9}, 36}, /* ими */ - {{0xC9, 0xD7, 0xDB}, 36}, /* ивш */ - {{0xD9, 0xD0, 0xCC}, 36}, /* ыпл */ - {{0xD0, 0xC5, 0xD7}, 36}, /* пев */ - {{0xC1, 0xC4, 0xC1}, 36}, /* ада */ - {{0xCD, 0xCF, 0xD3}, 35}, /* мос */ - {{0xCF, 0xC2, 0xD3}, 35}, /* обс */ - {{0xCE, 0xC5, 0xC4}, 34}, /* нед */ - {{0xC9, 0xCB, 0xCF}, 34}, /* ико */ - {{0xDD, 0xC9, 0xCD}, 34}, /* щим */ - {{0xC4, 0xC5, 0xD2}, 34}, /* дер */ - {{0xD3, 0xCB, 0xC1}, 34}, /* ска */ - {{0xCF, 0xD2, 0xCD}, 34}, /* орм */ - {{0xD5, 0xCD, 0xC5}, 34}, /* уме */ - {{0xCF, 0xCF, 0xC2}, 34}, /* ооб */ - {{0xD2, 0xC9, 0xD3}, 34}, /* рис */ - {{0xCF, 0xC2, 0xDF}, 33}, /* объ */ - {{0xCF, 0xCC, 0xD5}, 33}, /* олу */ - {{0xDF, 0xD1, 0xD7}, 33}, /* ъяв */ - {{0xD2, 0xC5, 0xCD}, 33}, /* рем */ - {{0xDD, 0xC9, 0xC8}, 33}, /* щих */ - {{0xD5, 0xC0, 0xDD}, 33}, /* ующ */ - {{0xCB, 0xD6, 0xC5}, 33}, /* кже */ - {{0xC9, 0xC4, 0xC5}, 33}, /* иде */ - {{0xC2, 0xD3, 0xD4}, 33}, /* бст */ - {{0xC1, 0xCB, 0xD6}, 33}, /* акж */ - {{0xD7, 0xD5, 0xC0}, 33}, /* вую */ - {{0xC1, 0xD3, 0xC8}, 33}, /* асх */ - {{0xC1, 0xCE, 0xC1}, 32}, /* ана */ - {{0xCE, 0xC1, 0xC4}, 32}, /* над */ - {{0xCF, 0xC2, 0xC5}, 32}, /* обе */ - {{0xD9, 0xD4, 0xCB}, 32}, /* ытк */ - {{0xDC, 0xD4, 0xC9}, 32}, /* эти */ - {{0xCF, 0xD6, 0xCE}, 32}, /* ожн */ - {{0xC1, 0xD4, 0xD9}, 31}, /* аты */ - {{0xD3, 0xC4, 0xC5}, 31}, /* сде */ - {{0xC1, 0xC0, 0xD4}, 31}, /* ают */ - {{0xD1, 0xD4, 0xD8}, 31}, /* ять */ - {{0xCF, 0xD1, 0xD4}, 31}, /* оят */ - {{0xC5, 0xD4, 0xD8}, 31}, /* еть */ - {{0xC1, 0xC7, 0xC5}, 31}, /* аге */ - {{0xDE, 0xD2, 0xC5}, 31}, /* чре */ - {{0xC5, 0xCE, 0xD9}, 31}, /* ены */ - {{0xD5, 0xC2, 0xD9}, 31}, /* убы */ - {{0xC9, 0xD3, 0xD4}, 30}, /* ист */ - {{0xD1, 0xC0, 0xD4}, 30}, /* яют */ - {{0xD2, 0xD1, 0xC4}, 30}, /* ряд */ - {{0xC7, 0xCF, 0xD3}, 30}, /* гос */ - {{0xC9, 0xCD, 0xC1}, 30}, /* има */ - {{0xDA, 0xC1, 0xD3}, 30}, /* зас */ - {{0xC1, 0xC0, 0xDD}, 30}, /* ающ */ - {{0xCF, 0xDA, 0xD7}, 30}, /* озв */ - {{0xC5, 0xC4, 0xC9}, 30}, /* еди */ - {{0xCF, 0xCD, 0xC5}, 30}, /* оме */ - {{0xCE, 0xC9, 0xCA}, 30}, /* ний */ - {{0xD3, 0xD5, 0xC4}, 30}, /* суд */ - {{0xDA, 0xC4, 0xCF}, 29}, /* здо */ - {{0xD3, 0xD7, 0xC9}, 29}, /* сви */ - {{0xCF, 0xCC, 0xC9}, 29}, /* оли */ - {{0xCF, 0xD7, 0xD8}, 29}, /* овь */ - {{0xD7, 0xC9, 0xCA}, 29}, /* вий */ - {{0xC4, 0xCF, 0xD2}, 29}, /* дор */ - {{0xC4, 0xC5, 0xD1}, 29}, /* дея */ - {{0xC5, 0xD1, 0xD4}, 29}, /* еят */ - {{0xC3, 0xCF, 0xCD}, 29}, /* цом */ - {{0xC9, 0xDA, 0xC1}, 28}, /* иза */ - {{0xD3, 0xDE, 0xC5}, 28}, /* сче */ - {{0xCB, 0xD4, 0xC1}, 28}, /* кта */ - {{0xCF, 0xC4, 0xCE}, 28}, /* одн */ - {{0xC2, 0xCC, 0xC1}, 28}, /* бла */ - {{0xCF, 0xC4, 0xCC}, 28}, /* одл */ - {{0xC9, 0xD4, 0xC1}, 28}, /* ита */ - {{0xE4, 0xCF, 0xC7}, 28}, /* Дог */ - {{0xCF, 0xD3, 0xCF}, 28}, /* осо */ - {{0xCE, 0xCF, 0xDB}, 28}, /* нош */ - {{0xCB, 0xD5, 0xD2}, 28}, /* кур */ - {{0xC9, 0xCE, 0xC1}, 28}, /* ина */ - {{0xCF, 0xDB, 0xC5}, 28}, /* оше */ - {{0xCE, 0xC1, 0xCC}, 28}, /* нал */ - {{0xCE, 0xC9, 0xDA}, 27}, /* низ */ - {{0xDA, 0xD7, 0xD2}, 27}, /* звр */ - {{0xD7, 0xD2, 0xC1}, 27}, /* вра */ - {{0xCC, 0xC5, 0xD4}, 27}, /* лет */ - {{0xC5, 0xDD, 0xD8}, 27}, /* ещь */ - {{0xD2, 0xC9, 0xC4}, 27}, /* рид */ - {{0xC4, 0xCE, 0xCF}, 27}, /* дно */ - {{0xD2, 0xC9, 0xCF}, 27}, /* рио */ - {{0xCF, 0xC9, 0xCD}, 27}, /* оим */ - {{0xC5, 0xD2, 0xD6}, 27}, /* ерж */ - {{0xD5, 0xD7, 0xC5}, 26}, /* уве */ - {{0xCF, 0xCE, 0xCB}, 26}, /* онк */ - {{0xC5, 0xCC, 0xCB}, 26}, /* елк */ - {{0xCC, 0xC1, 0xD7}, 26}, /* лав */ - {{0xC1, 0xD4, 0xCF}, 26}, /* ато */ - {{0xD1, 0xCD, 0xC9}, 26}, /* ями */ - {{0xCD, 0xCD, 0xD9}, 26}, /* ммы */ - {{0xC5, 0xD3, 0xD0}, 26}, /* есп */ - {{0xCE, 0xCB, 0xD5}, 26}, /* нку */ - {{0xC9, 0xC3, 0xD5}, 25}, /* ицу */ - {{0xC4, 0xD3, 0xCB}, 25}, /* дск */ - {{0xCE, 0xC9, 0xCE}, 25}, /* нин */ - {{0xD0, 0xCC, 0xC5}, 25}, /* пле */ - {{0xC6, 0xCF, 0xD2}, 25}, /* фор */ - {{0xCC, 0xC1, 0xD3}, 25}, /* лас */ - {{0xC4, 0xC9, 0xCD}, 25}, /* дим */ - {{0xC5, 0xD3, 0xD1}, 25}, /* еся */ - {{0xCE, 0xC9, 0xDE}, 25}, /* нич */ - {{0xCF, 0xD7, 0xD2}, 25}, /* овр */ - {{0xD7, 0xD3, 0xCC}, 25}, /* всл */ - {{0xD2, 0xDB, 0xC5}, 25}, /* рше */ - {{0xC5, 0xDD, 0xC1}, 25}, /* еща */ - {{0xD6, 0xCE, 0xD9}, 25}, /* жны */ - {{0xD2, 0xC9, 0xCD}, 25}, /* рим */ - {{0xDA, 0xC1, 0xC3}, 25}, /* зац */ - {{0xC2, 0xDD, 0xC5}, 25}, /* бще */ - {{0xC1, 0xCB, 0xD4}, 25}, /* акт */ - {{0xC1, 0xC4, 0xD3}, 25}, /* адс */ - {{0xD5, 0xDE, 0xD2}, 25}, /* учр */ - {{0xDD, 0xC9, 0xC5}, 25}, /* щие */ - {{0xD6, 0xC9, 0xD4}, 24}, /* жит */ - {{0xC2, 0xD2, 0xC5}, 24}, /* бре */ - {{0xD5, 0xC7, 0xCF}, 24}, /* уго */ - {{0xC9, 0xD1, 0xC8}, 24}, /* иях */ - {{0xD4, 0xD8, 0xC0}, 24}, /* тью */ - {{0xD8, 0xD3, 0xD1}, 24}, /* ься */ - {{0xD7, 0xCF, 0xD7}, 24}, /* вов */ - {{0xCF, 0xDE, 0xCE}, 24}, /* очн */ - {{0xD7, 0xCF, 0xCF}, 24}, /* воо */ - {{0xCF, 0xC4, 0xD9}, 24}, /* оды */ - {{0xCC, 0xCF, 0xC7}, 24}, /* лог */ - {{0xD7, 0xC1, 0xC5}, 24}, /* вае */ - {{0xC1, 0xD1, 0xC8}, 24}, /* аях */ - {{0xD4, 0xD8, 0xD3}, 24}, /* тьс */ - {{0xC4, 0xC9, 0xDE}, 24}, /* дич */ - {{0xCB, 0xC9, 0xC8}, 24}, /* ких */ - {{0xC3, 0xC1, 0xCD}, 24}, /* цам */ - {{0xC9, 0xDA, 0xD7}, 24}, /* изв */ - {{0xD4, 0xC9, 0xD7}, 24}, /* тив */ - {{0xC5, 0xCF, 0xC2}, 24}, /* еоб */ - {{0xD3, 0xCF, 0xD3}, 24}, /* сос */ - {{0xDB, 0xC9, 0xCD}, 24}, /* шим */ - {{0xD9, 0xD0, 0xCF}, 24}, /* ыпо */ - {{0xC5, 0xD6, 0xC1}, 24}, /* ежа */ - {{0xD4, 0xCF, 0xC9}, 24}, /* тои */ - {{0xCB, 0xD4, 0xCF}, 24}, /* кто */ - {{0xC5, 0xDE, 0xC1}, 24}, /* еча */ - {{0xC9, 0xC4, 0xC9}, 24}, /* иди */ - {{0xC2, 0xDD, 0xC9}, 23}, /* бщи */ - {{0xD4, 0xD8, 0xC5}, 23}, /* тье */ - {{0xC2, 0xDF, 0xD1}, 23}, /* бъя */ - {{0xCE, 0xC1, 0xDE}, 23}, /* нач */ - {{0xD4, 0xC5, 0xDE}, 23}, /* теч */ - {{0xD5, 0xD2, 0xD3}, 23}, /* урс */ - {{0xD7, 0xC5, 0xDE}, 23}, /* веч */ - {{0xC5, 0xCD, 0xC5}, 23}, /* еме */ - {{0xCF, 0xC2, 0xC8}, 23}, /* обх */ - {{0xC2, 0xC8, 0xCF}, 23}, /* бхо */ - {{0xC4, 0xC1, 0xC5}, 23}, /* дае */ - {{0xD2, 0xC5, 0xDA}, 23}, /* рез */ - {{0xCB, 0xC1, 0xD6}, 22}, /* каж */ - {{0xCF, 0xCB, 0xD5}, 22}, /* оку */ - {{0xC1, 0xCD, 0xC5}, 22}, /* аме */ - {{0xCE, 0xC5, 0xDA}, 22}, /* нез */ - {{0xD9, 0xD7, 0xC1}, 22}, /* ыва */ - {{0xD3, 0xD7, 0xD1}, 22}, /* свя */ - {{0xD2, 0xC1, 0xC4}, 22}, /* рад */ - {{0xC5, 0xDA, 0xC1}, 22}, /* еза */ - {{0xC9, 0xD7, 0xC1}, 22}, /* ива */ - {{0xCB, 0xC1, 0xCD}, 22}, /* кам */ - {{0xCE, 0xC5, 0xCD}, 22}, /* нем */ - {{0xD4, 0xCB, 0xCF}, 22}, /* тко */ - {{0xDA, 0xD7, 0xC5}, 22}, /* зве */ - {{0xD7, 0xD1, 0xDA}, 22}, /* вяз */ - {{0xD1, 0xD4, 0xC9}, 22}, /* яти */ - {{0xCF, 0xC8, 0xD2}, 22}, /* охр */ - {{0xD2, 0xCF, 0xD4}, 22}, /* рот */ - {{0xCF, 0xCC, 0xC5}, 22}, /* оле */ - {{0xC2, 0xD2, 0xC1}, 22}, /* бра */ - {{0xC1, 0xC5, 0xCD}, 22}, /* аем */ - {{0xCC, 0xC1, 0xDB}, 21}, /* лаш */ - {{0xC9, 0xDA, 0xCD}, 21}, /* изм */ - {{0xC7, 0xD5, 0xD4}, 21}, /* гут */ - {{0xCF, 0xD6, 0xC4}, 21}, /* ожд */ - {{0xCB, 0xC1, 0xCB}, 21}, /* как */ - {{0xCB, 0xC1, 0xDE}, 21}, /* кач */ - {{0xCE, 0xC1, 0xCD}, 21}, /* нам */ - {{0xC4, 0xCF, 0xC8}, 21}, /* дох */ - {{0xCF, 0xC8, 0xCF}, 21}, /* охо */ - {{0xC0, 0xD2, 0xC9}, 21}, /* юри */ - {{0xD7, 0xC1, 0xCD}, 21}, /* вам */ - {{0xDA, 0xCD, 0xCF}, 21}, /* змо */ - {{0xC4, 0xCB, 0xC5}, 21}, /* дке */ - {{0xC2, 0xC1, 0xCE}, 21}, /* бан */ - {{0xC5, 0xCC, 0xC9}, 21}, /* ели */ - {{0xD2, 0xC9, 0xDA}, 21}, /* риз */ - {{0xCC, 0xCE, 0xCF}, 21}, /* лно */ - {{0xD7, 0xD9, 0xDB}, 21}, /* выш */ - {{0xC4, 0xC3, 0xC1}, 21}, /* дца */ - {{0xD1, 0xC4, 0xCB}, 21}, /* ядк */ - {{0xCF, 0xD4, 0xD3}, 21}, /* отс */ - {{0xD4, 0xC5, 0xCA}, 21}, /* тей */ - {{0xC1, 0xCE, 0xCB}, 21}, /* анк */ - {{0xCE, 0xC5, 0xC7}, 21}, /* нег */ - {{0xC3, 0xC1, 0xD4}, 21}, /* цат */ - {{0xC5, 0xCD, 0xD9}, 21}, /* емы */ - {{0xD7, 0xCF, 0xC5}, 21}, /* вое */ - {{0xC4, 0xC1, 0xDE}, 21}, /* дач */ - {{0xCF, 0xC7, 0xD5}, 21}, /* огу */ - {{0xCC, 0xD6, 0xC5}, 21}, /* лже */ - {{0xD4, 0xCE, 0xC9}, 21}, /* тни */ - {{0xDA, 0xC1, 0xD7}, 21}, /* зав */ - {{0xD7, 0xC5, 0xD3}, 21}, /* вес */ - {{0xD3, 0xC1, 0xCD}, 20}, /* сам */ - {{0xC1, 0xD2, 0xCE}, 20}, /* арн */ - {{0xDE, 0xCE, 0xD9}, 20}, /* чны */ - {{0xD3, 0xD2, 0xC5}, 20}, /* сре */ - {{0xD4, 0xC9, 0xD1}, 20}, /* тия */ - {{0xC9, 0xD3, 0xCC}, 20}, /* исл */ - {{0xF3, 0xD4, 0xD2}, 20}, /* Стр */ - {{0xCE, 0xD4, 0xCF}, 20}, /* нто */ - {{0xD5, 0xD4, 0xD2}, 20}, /* утр */ - {{0xC1, 0xDB, 0xC5}, 20}, /* аше */ - {{0xC5, 0xCC, 0xC1}, 20}, /* ела */ - {{0xD5, 0xC4, 0xCF}, 20}, /* удо */ - {{0xD6, 0xC9, 0xDA}, 19}, /* жиз */ - {{0xD0, 0xC9, 0xD3}, 19}, /* пис */ - {{0xC1, 0xC9, 0xCD}, 19}, /* аим */ - {{0xDE, 0xC9, 0xD3}, 19}, /* чис */ - {{0xC5, 0xD6, 0xC9}, 19}, /* ежи */ - {{0xD7, 0xD3, 0xC5}, 19}, /* все */ - {{0xCC, 0xD8, 0xCB}, 19}, /* льк */ - {{0xC1, 0xD4, 0xD5}, 19}, /* ату */ - {{0xD5, 0xC4, 0xC1}, 19}, /* уда */ - {{0xDB, 0xC9, 0xCA}, 19}, /* ший */ - {{0xDA, 0xC1, 0xD2}, 19}, /* зар */ - {{0xC5, 0xC4, 0xCE}, 19}, /* едн */ - {{0xC1, 0xD7, 0xDB}, 19}, /* авш */ - {{0xD2, 0xCF, 0xC9}, 19}, /* рои */ - {{0xC9, 0xC4, 0xC1}, 19}, /* ида */ - {{0xC1, 0xD2, 0xCF}, 19}, /* аро */ - {{0xD4, 0xCF, 0xCA}, 19}, /* той */ - {{0xD6, 0xC1, 0xDD}, 19}, /* жащ */ - {{0xC5, 0xD3, 0xCF}, 19}, /* есо */ - {{0xD0, 0xC1, 0xCC}, 19}, /* пал */ - {{0xDD, 0xC1, 0xC5}, 19}, /* щае */ - {{0xD2, 0xD9, 0xC5}, 19}, /* рые */ - {{0xC5, 0xCE, 0xD1}, 19}, /* еня */ - {{0xDD, 0xC9, 0xCA}, 19}, /* щий */ - {{0xCC, 0xD5, 0xC7}, 19}, /* луг */ - {{0xC0, 0xDE, 0xC9}, 18}, /* ючи */ - {{0xD5, 0xCC, 0xD8}, 18}, /* уль */ - {{0xCD, 0xD9, 0xC8}, 18}, /* мых */ - {{0xD2, 0xCF, 0xC7}, 18}, /* рог */ - {{0xD3, 0xCF, 0xC8}, 18}, /* сох */ - {{0xCB, 0xCF, 0xC5}, 18}, /* кое */ - {{0xCE, 0xD4, 0xD3}, 18}, /* нтс */ - {{0xC1, 0xDA, 0xCE}, 18}, /* азн */ - {{0xD4, 0xCE, 0xD9}, 18}, /* тны */ - {{0xCF, 0xC4, 0xD1}, 18}, /* одя */ - {{0xCF, 0xC2, 0xCE}, 18}, /* обн */ - {{0xD7, 0xD9, 0xC4}, 18}, /* выд */ - {{0xCF, 0xD3, 0xD1}, 18}, /* ося */ - {{0xD8, 0xD4, 0xC1}, 18}, /* ьта */ - {{0xCE, 0xD1, 0xC0}, 18}, /* няю */ - {{0xCE, 0xC1, 0xD2}, 18}, /* нар */ - {{0xC5, 0xDA, 0xD5}, 18}, /* езу */ - {{0xC1, 0xD3, 0xCE}, 18}, /* асн */ - {{0xDA, 0xD5, 0xCC}, 18}, /* зул */ - {{0xC3, 0xC9, 0xD0}, 18}, /* цип */ - {{0xCB, 0xD4, 0xC5}, 18}, /* кте */ - {{0xC4, 0xCF, 0xD0}, 18}, /* доп */ - {{0xCE, 0xC3, 0xC9}, 18}, /* нци */ - {{0xD3, 0xD0, 0xC5}, 18}, /* спе */ - {{0xC9, 0xCD, 0xD9}, 18}, /* имы */ - {{0xCD, 0xCF, 0xCD}, 18}, /* мом */ - {{0xD0, 0xC5, 0xDE}, 18}, /* печ */ - {{0xEF, 0xC2, 0xD1}, 18}, /* Обя */ - {{0xF0, 0xD2, 0xC1}, 18}, /* Пра */ - {{0xCF, 0xCC, 0xCF}, 18}, /* оло */ - {{0xD4, 0xD3, 0xCB}, 18}, /* тск */ - {{0xCC, 0xCE, 0xC9}, 18}, /* лни */ - {{0xC5, 0xD2, 0xD4}, 18}, /* ерт */ - {{0xC9, 0xD3, 0xD8}, 18}, /* ись */ - {{0xCC, 0xD8, 0xD4}, 18}, /* льт */ - {{0xD3, 0xD5, 0xD4}, 18}, /* сут */ - {{0xD7, 0xCF, 0xC2}, 17}, /* воб */ - {{0xD2, 0xCE, 0xD9}, 17}, /* рны */ - {{0xC2, 0xCE, 0xD9}, 17}, /* бны */ - {{0xD9, 0xC4, 0xC1}, 17}, /* ыда */ - {{0xD8, 0xDA, 0xD5}, 17}, /* ьзу */ - {{0xC5, 0xC4, 0xD0}, 17}, /* едп */ - {{0xC1, 0xC4, 0xC5}, 17}, /* аде */ - {{0xC9, 0xD0, 0xC1}, 17}, /* ипа */ - {{0xD3, 0xC5, 0xCA}, 17}, /* сей */ - {{0xC5, 0xC5, 0xD3}, 17}, /* еес */ - {{0xCF, 0xC9, 0xDA}, 17}, /* оиз */ - {{0xCF, 0xD3, 0xD7}, 17}, /* осв */ - {{0xC4, 0xC9, 0xD7}, 17}, /* див */ - {{0xCE, 0xC1, 0xCE}, 17}, /* нан */ - {{0xC5, 0xD4, 0xC1}, 17}, /* ета */ - {{0xC4, 0xCE, 0xC5}, 17}, /* дне */ - {{0xC9, 0xCF, 0xC2}, 17}, /* иоб */ - {{0xD5, 0xC5, 0xD4}, 17}, /* ует */ - {{0xCE, 0xC1, 0xC8}, 17}, /* нах */ - {{0xD3, 0xCD, 0xC5}, 17}, /* сме */ - {{0xC1, 0xCC, 0xC9}, 17}, /* али */ - {{0xC2, 0xDF, 0xC5}, 17}, /* бъе */ - {{0xD0, 0xC1, 0xD3}, 17}, /* пас */ - {{0xDA, 0xC1, 0xCC}, 17}, /* зал */ - {{0xD2, 0xD6, 0xC1}, 16}, /* ржа */ - {{0xD1, 0xD7, 0xC9}, 16}, /* яви */ - {{0xD6, 0xC1, 0xD4}, 16}, /* жат */ - {{0xC2, 0xCF, 0xD6}, 16}, /* бож */ - {{0xD3, 0xC9, 0xCC}, 16}, /* сил */ - {{0xCE, 0xD5, 0xC0}, 16}, /* ную */ - {{0xD0, 0xC5, 0xCE}, 16}, /* пен */ - {{0xCD, 0xC1, 0xD4}, 16}, /* мат */ - {{0xCF, 0xCE, 0xCE}, 16}, /* онн */ - {{0xD7, 0xC9, 0xCE}, 16}, /* вин */ - {{0xD4, 0xCB, 0xC9}, 16}, /* тки */ - {{0xD4, 0xCF, 0xDE}, 16}, /* точ */ - {{0xD3, 0xDE, 0xC9}, 16}, /* счи */ - {{0xCE, 0xC9, 0xC3}, 16}, /* ниц */ - {{0xDD, 0xC5, 0xC5}, 16}, /* щее */ - {{0xC2, 0xC5, 0xD3}, 16}, /* бес */ - {{0xC1, 0xC4, 0xC3}, 16}, /* адц */ - {{0xEB, 0xCF, 0xCD}, 16}, /* Ком */ - {{0xD8, 0xC9, 0xCD}, 16}, /* ьим */ - {{0xD5, 0xD4, 0xD3}, 16}, /* утс */ - {{0xC1, 0xDE, 0xC9}, 16}, /* ачи */ - {{0xD0, 0xCF, 0xCE}, 16}, /* пон */ - {{0xCB, 0xC1, 0xC5}, 16}, /* кае */ - {{0xC9, 0xC7, 0xD2}, 16}, /* игр */ - {{0xC1, 0xCB, 0xC9}, 16}, /* аки */ - {{0xC1, 0xDD, 0xC9}, 16}, /* ащи */ - {{0xCC, 0xD8, 0xC3}, 16}, /* льц */ - {{0xD7, 0xCE, 0xCF}, 16}, /* вно */ - {{0xD9, 0xDB, 0xC5}, 15}, /* ыше */ - {{0xEC, 0xC9, 0xC3}, 15}, /* Лиц */ - {{0xD8, 0xC5, 0xCA}, 15}, /* ьей */ - {{0xDB, 0xC5, 0xCD}, 15}, /* шем */ - {{0xD5, 0xC2, 0xCC}, 15}, /* убл */ - {{0xD2, 0xC1, 0xC3}, 15}, /* рац */ - {{0xCB, 0xD5, 0xCD}, 15}, /* кум */ - {{0xD2, 0xC5, 0xC7}, 15}, /* рег */ - {{0xCF, 0xD0, 0xC1}, 15}, /* опа */ - {{0xF7, 0xCF, 0xDA}, 15}, /* Воз */ - {{0xD4, 0xC1, 0xC5}, 15}, /* тае */ - {{0xCF, 0xC2, 0xD9}, 15}, /* обы */ - {{0xC2, 0xCC, 0xC9}, 15}, /* бли */ - {{0xD2, 0xCD, 0xC5}, 15}, /* рме */ - {{0xD7, 0xCF, 0xD3}, 15}, /* вос */ - {{0xC1, 0xD3, 0xC9}, 15}, /* аси */ - {{0xD4, 0xC1, 0xCD}, 15}, /* там */ - {{0xD8, 0xCD, 0xC5}, 15}, /* ьме */ - {{0xCF, 0xC7, 0xC1}, 15}, /* ога */ - {{0xC9, 0xCC, 0xCF}, 15}, /* ило */ - {{0xD3, 0xD8, 0xCD}, 15}, /* сьм */ - {{0xD2, 0xD4, 0xC9}, 15}, /* рти */ - {{0xD4, 0xD3, 0xD5}, 15}, /* тсу */ - {{0xD3, 0xC5, 0xCE}, 15}, /* сен */ - {{0xD4, 0xC1, 0xCC}, 15}, /* тал */ - {{0xC4, 0xC1, 0xD2}, 15}, /* дар */ - {{0xC1, 0xCD, 0xCF}, 15}, /* амо */ - {{0xC5, 0xC4, 0xCC}, 15}, /* едл */ - {{0xD3, 0xD5, 0xC2}, 15}, /* суб */ - {{0xC5, 0xCA, 0xC6}, 15}, /* ейф */ - {{0xE8, 0xD2, 0xC1}, 15}, /* Хра */ - {{0xCC, 0xC1, 0xCD}, 14}, /* лам */ - {{0xC1, 0xD2, 0xD5}, 14}, /* ару */ - {{0xC7, 0xC9, 0xC8}, 14}, /* гих */ - {{0xC3, 0xC9, 0xD1}, 14}, /* ция */ - {{0xC4, 0xC1, 0xD7}, 14}, /* дав */ - {{0xCC, 0xC9, 0xDB}, 14}, /* лиш */ - {{0xC0, 0xDE, 0xC1}, 14}, /* юча */ - {{0xC1, 0xCE, 0xD3}, 14}, /* анс */ - {{0xCF, 0xC7, 0xD2}, 14}, /* огр */ - {{0xC9, 0xDD, 0xC1}, 14}, /* ища */ - {{0xC5, 0xCE, 0xD8}, 14}, /* ень */ - {{0xCF, 0xD4, 0xC9}, 14}, /* оти */ - {{0xC1, 0xC4, 0xD9}, 13}, /* ады */ - {{0xC1, 0xDD, 0xC1}, 13}, /* аща */ - {{0xD7, 0xCF, 0xC9}, 13}, /* вои */ - {{0xD7, 0xD9, 0xCD}, 13}, /* вым */ - {{0xD7, 0xD8, 0xD1}, 13}, /* вья */ - {{0xCB, 0xC9, 0xC5}, 13}, /* кие */ - {{0xCC, 0xC9, 0xD3}, 13}, /* лис */ - {{0xCD, 0xC5, 0xC4}, 13}, /* мед */ - {{0xD4, 0xC9, 0xC8}, 13}, /* тих */ - {{0xC5, 0xD4, 0xCF}, 13}, /* ето */ - {{0xDA, 0xCC, 0xCF}, 13}, /* зло */ - {{0xCF, 0xD0, 0xC5}, 13}, /* опе */ - {{0xD3, 0xC9, 0xCD}, 13}, /* сим */ - {{0xD1, 0xDA, 0xC9}, 13}, /* язи */ - {{0xC9, 0xCE, 0xC4}, 13}, /* инд */ - {{0xDE, 0xD5, 0xD6}, 13}, /* чуж */ - {{0xCC, 0xCB, 0xC9}, 13}, /* лки */ - {{0xC4, 0xD0, 0xD2}, 13}, /* дпр */ - {{0xCE, 0xC4, 0xC9}, 13}, /* нди */ - {{0xCF, 0xD4, 0xC1}, 13}, /* ота */ - {{0xCF, 0xD4, 0xD9}, 13}, /* оты */ - {{0xCC, 0xC1, 0xDE}, 13}, /* лач */ - {{0xCB, 0xC9, 0xCD}, 13}, /* ким */ - {{0xC9, 0xD3, 0xC9}, 13}, /* иси */ - {{0xD7, 0xC1, 0xCC}, 13}, /* вал */ - {{0xC5, 0xCD, 0xCF}, 13}, /* емо */ - {{0xD0, 0xD5, 0xC2}, 13}, /* пуб */ - {{0xD1, 0xC5, 0xCD}, 13}, /* яем */ - {{0xC2, 0xCF, 0xCC}, 13}, /* бол */ - {{0xCE, 0xD4, 0xD5}, 13}, /* нту */ - {{0xCE, 0xC5, 0xCA}, 13}, /* ней */ - {{0xCE, 0xC1, 0xD1}, 13}, /* ная */ - {{0xC5, 0xD3, 0xC1}, 13}, /* еса */ - {{0xD2, 0xCE, 0xCF}, 13}, /* рно */ - {{0xDD, 0xC5, 0xCD}, 13}, /* щем */ - {{0xC1, 0xCE, 0xD9}, 13}, /* аны */ - {{0xE4, 0xCF, 0xD7}, 13}, /* Дов */ - {{0xDE, 0xC9, 0xD7}, 13}, /* чив */ - {{0xD7, 0xC9, 0xD3}, 13}, /* вис */ - {{0xCF, 0xD0, 0xCF}, 13}, /* опо */ - {{0xD7, 0xD8, 0xC0}, 13}, /* вью */ - {{0xC1, 0xCC, 0xC1}, 13}, /* ала */ - {{0xCC, 0xC5, 0xCA}, 12}, /* лей */ - {{0xC1, 0xDE, 0xC1}, 12}, /* ача */ - {{0xC5, 0xDA, 0xD7}, 12}, /* езв */ - {{0xD7, 0xC1, 0xD1}, 12}, /* вая */ - {{0xC5, 0xCF, 0xD3}, 12}, /* еос */ - {{0xD1, 0xDD, 0xC9}, 12}, /* ящи */ - {{0xC9, 0xD7, 0xC9}, 12}, /* иви */ - {{0xCE, 0xC5, 0xC5}, 12}, /* нее */ - {{0xD4, 0xD2, 0xD5}, 12}, /* тру */ - {{0xDB, 0xC5, 0xC5}, 12}, /* шее */ - {{0xD3, 0xC1, 0xC8}, 12}, /* сах */ - {{0xC9, 0xCE, 0xC3}, 12}, /* инц */ - {{0xCF, 0xCD, 0xD0}, 12}, /* омп */ - {{0xD5, 0xD6, 0xCF}, 12}, /* ужо */ - {{0xD5, 0xC1, 0xCC}, 12}, /* уал */ - {{0xCE, 0xC1, 0xD4}, 12}, /* нат */ - {{0xC9, 0xC4, 0xD5}, 12}, /* иду */ - {{0xD7, 0xCC, 0xC1}, 12}, /* вла */ - {{0xDA, 0xD7, 0xC1}, 12}, /* зва */ - {{0xCC, 0xC5, 0xC5}, 12}, /* лее */ - {{0xD2, 0xC5, 0xC8}, 12}, /* рех */ - {{0xD6, 0xC4, 0xD5}, 12}, /* жду */ - {{0xCD, 0xC1, 0xCC}, 12}, /* мал */ - {{0xC5, 0xCE, 0xD3}, 12}, /* енс */ - {{0xC9, 0xCA, 0xD3}, 12}, /* ийс */ - {{0xCB, 0xCF, 0xCC}, 12}, /* кол */ - {{0xCE, 0xC1, 0xDA}, 12}, /* наз */ - {{0xC4, 0xD5, 0xC1}, 12}, /* дуа */ - {{0xCF, 0xCE, 0xC9}, 12}, /* они */ - {{0xD3, 0xC5, 0xCD}, 12}, /* сем */ - {{0xC7, 0xCF, 0xC4}, 12}, /* год */ - {{0xCD, 0xC5, 0xD6}, 12}, /* меж */ - {{0xCF, 0xDA, 0xCC}, 12}, /* озл */ - {{0xD7, 0xCD, 0xC5}, 12}, /* вме */ - {{0xD5, 0xC4, 0xC5}, 12}, /* уде */ - {{0xD8, 0xCB, 0xCF}, 12}, /* ько */ - {{0xC5, 0xD7, 0xD9}, 12}, /* евы */ - {{0xDA, 0xC1, 0xCD}, 12}, /* зам */ - {{0xD3, 0xCF, 0xC4}, 12}, /* сод */ - {{0xD2, 0xCF, 0xC5}, 11}, /* рое */ - {{0xCF, 0xD4, 0xC4}, 11}, /* отд */ - {{0xD3, 0xC9, 0xD1}, 11}, /* сия */ - {{0xC9, 0xCB, 0xD5}, 11}, /* ику */ - {{0xD9, 0xCC, 0xC9}, 11}, /* ыли */ - {{0xC7, 0xC9, 0xCD}, 11}, /* гим */ - {{0xCE, 0xD8, 0xDB}, 11}, /* ньш */ - {{0xD4, 0xC9, 0xDE}, 11}, /* тич */ - {{0xD2, 0xC1, 0xCC}, 11}, /* рал */ - {{0xD5, 0xDE, 0xC9}, 11}, /* учи */ - {{0xCD, 0xC5, 0xC0}, 11}, /* мею */ - {{0xD4, 0xC5, 0xCB}, 11}, /* тек */ - {{0xCF, 0xC2, 0xD5}, 11}, /* обу */ - {{0xCE, 0xCE, 0xD5}, 11}, /* нну */ - {{0xCE, 0xC5, 0xD0}, 11}, /* неп */ - {{0xD7, 0xC5, 0xCC}, 11}, /* вел */ - {{0xD4, 0xCD, 0xC5}, 11}, /* тме */ - {{0xC2, 0xCF, 0xC7}, 11}, /* бог */ - {{0xCF, 0xD2, 0xC9}, 11}, /* ори */ - {{0xC1, 0xD7, 0xCE}, 11}, /* авн */ - {{0xC4, 0xC5, 0xC5}, 11}, /* дее */ - {{0xD6, 0xCF, 0xCD}, 11}, /* жом */ - {{0xF7, 0xD2, 0xC5}, 11}, /* Вре */ - {{0xCD, 0xD9, 0xC5}, 11}, /* мые */ - {{0xD8, 0xC3, 0xC1}, 11}, /* ьца */ - {{0xCF, 0xC3, 0xC5}, 11}, /* оце */ - {{0xC9, 0xD4, 0xD9}, 10}, /* иты */ - {{0xDA, 0xD2, 0xC1}, 10}, /* зра */ - {{0xCF, 0xCE, 0xD9}, 10}, /* оны */ - {{0xD2, 0xC5, 0xDB}, 10}, /* реш */ - {{0xD5, 0xDB, 0xC5}, 10}, /* уше */ - {{0xD2, 0xC5, 0xD7}, 10}, /* рев */ - {{0xCF, 0xD0, 0xD5}, 10}, /* опу */ - {{0xD1, 0xD4, 0xD9}, 10}, /* яты */ - {{0xD4, 0xC1, 0xDE}, 10}, /* тач */ - {{0xC5, 0xD2, 0xCF}, 10}, /* еро */ - {{0xD7, 0xCB, 0xCC}, 10}, /* вкл */ - {{0xDA, 0xD9, 0xD7}, 10}, /* зыв */ - {{0xC1, 0xD0, 0xD2}, 10}, /* апр */ - {{0xD2, 0xD5, 0xDB}, 10}, /* руш */ - {{0xEF, 0xD4, 0xD7}, 10}, /* Отв */ - {{0xD2, 0xD3, 0xC1}, 10}, /* рса */ - {{0xC5, 0xCB, 0xD4}, 10}, /* ект */ - {{0xCC, 0xC5, 0xCB}, 10}, /* лек */ - {{0xC5, 0xC5, 0xD4}, 10}, /* еет */ - {{0xCF, 0xD0, 0xCC}, 10}, /* опл */ - {{0xD4, 0xDE, 0xC5}, 10}, /* тче */ - {{0xC7, 0xCF, 0xCD}, 10}, /* гом */ - {{0xD4, 0xCF, 0xD6}, 10}, /* тож */ - {{0xCC, 0xC5, 0xDE}, 10}, /* леч */ - {{0xC5, 0xD4, 0xD9}, 10}, /* еты */ - {{0xCF, 0xD6, 0xC9}, 10}, /* ожи */ - {{0xCD, 0xCE, 0xCF}, 10}, /* мно */ - {{0xCD, 0xCF, 0xCA}, 10}, /* мой */ - {{0xC3, 0xC5, 0xCC}, 10}, /* цел */ - {{0xD5, 0xD0, 0xC9}, 10}, /* упи */ - {{0xC1, 0xC5, 0xD7}, 10}, /* аев */ - {{0xD0, 0xCF, 0xCD}, 10}, /* пом */ - {{0xC4, 0xD1, 0xDD}, 10}, /* дящ */ - {{0xD4, 0xD2, 0xC9}, 10}, /* три */ - {{0xDB, 0xC9, 0xC5}, 10}, /* шие */ - {{0xC5, 0xCB, 0xC1}, 10}, /* ека */ - {{0xC5, 0xDB, 0xC5}, 10}, /* еше */ - {{0xDA, 0xC1, 0xC9}, 10}, /* заи */ - {{0xC9, 0xD4, 0xCF}, 10}, /* ито */ - {{0xDA, 0xCE, 0xD9}, 10}, /* зны */ - {{0xCF, 0xD1, 0xCE}, 10}, /* оян */ - {{0xC9, 0xD6, 0xC5}, 10}, /* иже */ - {{0xD7, 0xCE, 0xC5}, 10}, /* вне */ - {{0xD2, 0xD3, 0xD4}, 10}, /* рст */ - {{0xC5, 0xCD, 0xD1}, 10}, /* емя */ - {{0xCE, 0xC1, 0xC9}, 10}, /* наи */ - {{0xD4, 0xCF, 0xCC}, 10}, /* тол */ - {{0xCC, 0xC9, 0xD4}, 10}, /* лит */ - {{0xCF, 0xD3, 0xD2}, 10}, /* оср */ - {{0xD4, 0xC4, 0xC5}, 10}, /* тде */ - {{0xC5, 0xCD, 0xC9}, 10}, /* еми */ - {{0xCD, 0xC5, 0xC5}, 10}, /* мее */ - {{0xD2, 0xD9, 0xC8}, 10}, /* рых */ - {{0xCE, 0xC9, 0xD7}, 10}, /* нив */ - {{0xC5, 0xD2, 0xD5}, 10}, /* еру */ - {{0xDE, 0xC5, 0xCD}, 10}, /* чем */ - {{0xC4, 0xCF, 0xC2}, 10}, /* доб */ - {{0xC5, 0xCC, 0xCF}, 10}, /* ело */ - {{0xC9, 0xCC, 0xD5}, 10}, /* илу */ - {{0xC1, 0xC4, 0xCC}, 10}, /* адл */ - {{0xC9, 0xDE, 0xD4}, 10}, /* ичт */ - {{0xCD, 0xCC, 0xC5}, 10}, /* мле */ -}; - -static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_windows_1251[] = { - {{0xE5, 0xED, 0xE8}, 991}, /* ени */ - {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ - {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ - {{0xED, 0xE8, 0xFF}, 629}, /* ния */ - {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ - {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ - {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ - {{0xE5, 0xED, 0xED}, 499}, /* енн */ - {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ - {{0xE0, 0xED, 0xE8}, 443}, /* ани */ - {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ - {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ - {{0xED, 0xE8, 0xE5}, 419}, /* ние */ - {{0xED, 0xED, 0xEE}, 412}, /* нно */ - {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ - {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ - {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ - {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ - {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ - {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ - {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ - {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ - {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ - {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ - {{0xEF, 0xF0, 0xE8}, 330}, /* при */ - {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ - {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ - {{0xED, 0xE5, 0xED}, 310}, /* нен */ - {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ - {{0xE2, 0xE0, 0xED}, 304}, /* ван */ - {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ - {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ - {{0xEB, 0xE5, 0xED}, 266}, /* лен */ - {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ - {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ - {{0xED, 0xED, 0xFB}, 260}, /* нны */ - {{0xEB, 0xFC, 0xED}, 256}, /* льн */ - {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ - {{0xE8, 0xEB, 0xE8}, 254}, /* или */ - {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ - {{0xE5, 0xE3, 0xEE}, 241}, /* его */ - {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ - {{0xED, 0xEE, 0xF1}, 236}, /* нос */ - {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ - {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ - {{0xF0, 0xE0, 0xED}, 231}, /* ран */ - {{0xED, 0xEE, 0xE3}, 230}, /* ног */ - {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ - {{0xF7, 0xE5, 0xED}, 226}, /* чен */ - {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ - {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ - {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ - {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ - {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ - {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ - {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ - {{0xE7, 0xE0, 0xED}, 194}, /* зан */ - {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ - {{0xF2, 0xF1, 0xFF}, 191}, /* тся */ - {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ - {{0xE0, 0xED, 0xED}, 182}, /* анн */ - {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ - {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ - {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ - {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ - {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ - {{0xEC, 0xE5, 0xED}, 170}, /* мен */ - {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ - {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ - {{0xF0, 0xE5, 0xED}, 167}, /* рен */ - {{0xF9, 0xE5, 0xED}, 165}, /* щен */ - {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ - {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ - {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ - {{0xFF, 0xE7, 0xE0}, 159}, /* яза */ - {{0xE1, 0xFF, 0xE7}, 158}, /* бяз */ - {{0xED, 0xE8, 0xE8}, 153}, /* нии */ - {{0xED, 0xFB, 0xF5}, 153}, /* ных */ - {{0xF2, 0xFC, 0xFF}, 153}, /* тья */ - {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ - {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ - {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ - {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ - {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ - {{0xED, 0xEE, 0xEC}, 144}, /* ном */ - {{0xE4, 0xE5, 0xED}, 144}, /* ден */ - {{0xE0, 0xED, 0xE5}, 142}, /* ане */ - {{0xEA, 0xEE, 0xED}, 141}, /* кон */ - {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ - {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ - {{0xEE, 0xE1, 0xFF}, 140}, /* обя */ - {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ - {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ - {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ - {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ - {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ - {{0xED, 0xFB, 0xEC}, 136}, /* ным */ - {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ - {{0xD1, 0xF2, 0xE0}, 134}, /* Ста */ - {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ - {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ - {{0xE5, 0xEB, 0xFF}, 130}, /* еля */ - {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ - {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ - {{0xF2, 0xEE, 0xFF}, 129}, /* тоя */ - {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ - {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ - {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ - {{0xE2, 0xE5, 0xED}, 127}, /* вен */ - {{0xED, 0xEE, 0xE2}, 127}, /* нов */ - {{0xED, 0xEE, 0xE5}, 126}, /* ное */ - {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ - {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ - {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ - {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ - {{0xE5, 0xED, 0xF2}, 124}, /* ент */ - {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ - {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ - {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ - {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ - {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ - {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ - {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ - {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ - {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ - {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ - {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ - {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ - {{0xEF, 0xF0, 0xEE}, 114}, /* про */ - {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ - {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ - {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ - {{0xF8, 0xE5, 0xED}, 111}, /* шен */ - {{0xF7, 0xE8, 0xED}, 110}, /* чин */ - {{0xED, 0xE0, 0xF1}, 109}, /* нас */ - {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ - {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ - {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ - {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ - {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ - {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ - {{0xF2, 0xEE, 0xEC}, 104}, /* том */ - {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ - {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ - {{0xEE, 0xEB, 0xED}, 102}, /* олн */ - {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ - {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ - {{0xED, 0xEE, 0xE9}, 101}, /* ной */ - {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ - {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ - {{0xED, 0xFB, 0xE5}, 99}, /* ные */ - {{0xE7, 0xED, 0xE0}, 99}, /* зна */ - {{0xE2, 0xEB, 0xFF}, 99}, /* вля */ - {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ - {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ - {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ - {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ - {{0xED, 0xFB, 0xE9}, 96}, /* ный */ - {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ - {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ - {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ - {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ - {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ - {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ - {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ - {{0xE8, 0xED, 0xE5}, 91}, /* ине */ - {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ - {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ - {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ - {{0xED, 0xE8, 0xF2}, 89}, /* нит */ - {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ - {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ - {{0xE6, 0xE5, 0xED}, 87}, /* жен */ - {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ - {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ - {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ - {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ - {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ - {{0xE2, 0xE8, 0xFF}, 85}, /* вия */ - {{0xFF, 0xF9, 0xE5}, 85}, /* яще */ - {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ - {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ - {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ - {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ - {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ - {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ - {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ - {{0xEE, 0xFF, 0xF9}, 82}, /* оящ */ - {{0xE5, 0xED, 0xEE}, 81}, /* ено */ - {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ - {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ - {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ - {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ - {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ - {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ - {{0xE4, 0xE0, 0xED}, 79}, /* дан */ - {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ - {{0xE8, 0xEC, 0xE5}, 78}, /* име */ - {{0xE8, 0xED, 0xEE}, 78}, /* ино */ - {{0xF0, 0xE8, 0xED}, 77}, /* рин */ - {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ - {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ - {{0xF2, 0xE0, 0xEA}, 77}, /* так */ - {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ - {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ - {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ - {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ - {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ - {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ - {{0xFD, 0xF2, 0xEE}, 75}, /* это */ - {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ - {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ - {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ - {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ - {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ - {{0xE0, 0xED, 0xEE}, 72}, /* ано */ - {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ - {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ - {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ - {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ - {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ - {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ - {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ - {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ - {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ - {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ - {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ - {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ - {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ - {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ - {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ - {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ - {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ - {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ - {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ - {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ - {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ - {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ - {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ - {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ - {{0xF2, 0xED, 0xEE}, 65}, /* тно */ - {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ - {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ - {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ - {{0xEE, 0xE7, 0xED}, 64}, /* озн */ - {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ - {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ - {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ - {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ - {{0xED, 0xE8, 0xFE}, 63}, /* нию */ - {{0xEE, 0xED, 0xE5}, 63}, /* оне */ - {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ - {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ - {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ - {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ - {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ - {{0xF1, 0xED, 0xEE}, 61}, /* сно */ - {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ - {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ - {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ - {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ - {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ - {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ - {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ - {{0xF2, 0xE0, 0xED}, 60}, /* тан */ - {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ - {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ - {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ - {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ - {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ - {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ - {{0xFF, 0xF2, 0xE5}, 60}, /* яте */ - {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ - {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ - {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ - {{0xE0, 0xE1, 0xEE}, 59}, /* або */ - {{0xEB, 0xFF, 0xFE}, 59}, /* ляю */ - {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ - {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ - {{0xE8, 0xED, 0xE8}, 58}, /* ини */ - {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ - {{0xFF, 0xE2, 0xEB}, 58}, /* явл */ - {{0xED, 0xE0, 0xE3}, 57}, /* наг */ - {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ - {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ - {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ - {{0xE8, 0xEE, 0xED}, 57}, /* ион */ - {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ - {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ - {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ - {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ - {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ - {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ - {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ - {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ - {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ - {{0xEB, 0xED, 0xE5}, 54}, /* лне */ - {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ - {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ - {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ - {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ - {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ - {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ - {{0xED, 0xE8, 0xEA}, 54}, /* ник */ - {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ - {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ - {{0xF2, 0xE5, 0xED}, 53}, /* тен */ - {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ - {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ - {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ - {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ - {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ - {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ - {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ - {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ - {{0xFF, 0xFE, 0xF9}, 51}, /* яющ */ - {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ - {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ - {{0xEE, 0xED, 0xEE}, 51}, /* оно */ - {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ - {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ - {{0xEB, 0xFF, 0xE5}, 50}, /* ляе */ - {{0xE5, 0xED, 0xE5}, 50}, /* ене */ - {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ - {{0xEF, 0xF3, 0xED}, 49}, /* пун */ - {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ - {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ - {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ - {{0xED, 0xE5, 0xF1}, 49}, /* нес */ - {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ - {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ - {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ - {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ - {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ - {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ - {{0xF3, 0xED, 0xEA}, 49}, /* унк */ - {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ - {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ - {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ - {{0xFF, 0xE5, 0xF2}, 48}, /* яет */ - {{0xC5, 0xF1, 0xEB}, 48}, /* Есл */ - {{0xCF, 0xF0, 0xE8}, 48}, /* При */ - {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ - {{0xED, 0xE5, 0xF0}, 48}, /* нер */ - {{0xF7, 0xED, 0xEE}, 47}, /* чно */ - {{0xEF, 0xEE, 0xE4}, 47}, /* под */ - {{0xED, 0xF2, 0xE0}, 47}, /* нта */ - {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ - {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ - {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ - {{0xE6, 0xED, 0xEE}, 47}, /* жно */ - {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ - {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ - {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ - {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ - {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ - {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ - {{0xF7, 0xF2, 0xEE}, 46}, /* что */ - {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ - {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ - {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ - {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ - {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ - {{0xE4, 0xEB, 0xFF}, 45}, /* для */ - {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ - {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ - {{0xED, 0xFF, 0xF2}, 44}, /* нят */ - {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ - {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ - {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ - {{0xEE, 0xF1, 0xED}, 43}, /* осн */ - {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ - {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ - {{0xE8, 0xED, 0xFB}, 43}, /* ины */ - {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ - {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ - {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ - {{0xE8, 0xFF, 0xEC}, 43}, /* иям */ - {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ - {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ - {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ - {{0xF7, 0xE0, 0xFF}, 42}, /* чая */ - {{0xED, 0xE8, 0xEC}, 42}, /* ним */ - {{0xE8, 0xE7, 0xED}, 42}, /* изн */ - {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ - {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ - {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ - {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ - {{0xF6, 0xE5, 0xED}, 42}, /* цен */ - {{0xF7, 0xE0, 0xF1}, 42}, /* час */ - {{0xE3, 0xE0, 0xED}, 42}, /* ган */ - {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ - {{0xF1, 0xF2, 0xED}, 42}, /* стн */ - {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ - {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ - {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ - {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ - {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ - {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ - {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ - {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ - {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ - {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ - {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ - {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ - {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ - {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ - {{0xED, 0xF2, 0xE5}, 40}, /* нте */ - {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ - {{0xE1, 0xFB, 0xEB}, 40}, /* был */ - {{0xE8, 0xED, 0xFF}, 40}, /* иня */ - {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ - {{0xE3, 0xE5, 0xED}, 39}, /* ген */ - {{0xCA, 0xEE, 0xE4}, 39}, /* Код */ - {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ - {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ - {{0xE8, 0xED, 0xF2}, 39}, /* инт */ - {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ - {{0xF0, 0xEE, 0xED}, 39}, /* рон */ - {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ - {{0xE4, 0xEE, 0xEA}, 39}, /* док */ - {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ - {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ - {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ - {{0xE7, 0xED, 0xE8}, 38}, /* зни */ - {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ - {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ - {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ - {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ - {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ - {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ - {{0xE1, 0xE5, 0xE7}, 37}, /* без */ - {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ - {{0xEE, 0xF0, 0xFF}, 37}, /* оря */ - {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ - {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ - {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ - {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ - {{0xED, 0xF6, 0xE5}, 37}, /* нце */ - {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ - {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ - {{0xEE, 0xED, 0xE0}, 37}, /* она */ - {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ - {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ - {{0xF0, 0xEE, 0xE4}, 37}, /* род */ - {{0xE5, 0xED, 0xE0}, 37}, /* ена */ - {{0xEE, 0xED, 0xF6}, 37}, /* онц */ - {{0xEE, 0xF2, 0xED}, 37}, /* отн */ - {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ - {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ - {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ - {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ - {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ - {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ - {{0xED, 0xE5, 0xEE}, 36}, /* нео */ - {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ - {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ - {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ - {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ - {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ - {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ - {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ - {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ - {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ - {{0xED, 0xE5, 0xE4}, 34}, /* нед */ - {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ - {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ - {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ - {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ - {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ - {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ - {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ - {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ - {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ - {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ - {{0xFA, 0xFF, 0xE2}, 33}, /* ъяв */ - {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ - {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ - {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ - {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ - {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ - {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ - {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ - {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ - {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ - {{0xE0, 0xED, 0xE0}, 32}, /* ана */ - {{0xED, 0xE0, 0xE4}, 32}, /* над */ - {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ - {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ - {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ - {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ - {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ - {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ - {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ - {{0xFF, 0xF2, 0xFC}, 31}, /* ять */ - {{0xEE, 0xFF, 0xF2}, 31}, /* оят */ - {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ - {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ - {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ - {{0xE5, 0xED, 0xFB}, 31}, /* ены */ - {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ - {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ - {{0xFF, 0xFE, 0xF2}, 30}, /* яют */ - {{0xF0, 0xFF, 0xE4}, 30}, /* ряд */ - {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ - {{0xE8, 0xEC, 0xE0}, 30}, /* има */ - {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ - {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ - {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ - {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ - {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ - {{0xED, 0xE8, 0xE9}, 30}, /* ний */ - {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ - {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ - {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ - {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ - {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ - {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ - {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ - {{0xE4, 0xE5, 0xFF}, 29}, /* дея */ - {{0xE5, 0xFF, 0xF2}, 29}, /* еят */ - {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ - {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ - {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ - {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ - {{0xEE, 0xE4, 0xED}, 28}, /* одн */ - {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ - {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ - {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ - {{0xC4, 0xEE, 0xE3}, 28}, /* Дог */ - {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ - {{0xED, 0xEE, 0xF8}, 28}, /* нош */ - {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ - {{0xE8, 0xED, 0xE0}, 28}, /* ина */ - {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ - {{0xED, 0xE0, 0xEB}, 28}, /* нал */ - {{0xED, 0xE8, 0xE7}, 27}, /* низ */ - {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ - {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ - {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ - {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ - {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ - {{0xE4, 0xED, 0xEE}, 27}, /* дно */ - {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ - {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ - {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ - {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ - {{0xEE, 0xED, 0xEA}, 26}, /* онк */ - {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ - {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ - {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ - {{0xFF, 0xEC, 0xE8}, 26}, /* ями */ - {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ - {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ - {{0xED, 0xEA, 0xF3}, 26}, /* нку */ - {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ - {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ - {{0xED, 0xE8, 0xED}, 25}, /* нин */ - {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ - {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ - {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ - {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ - {{0xE5, 0xF1, 0xFF}, 25}, /* еся */ - {{0xED, 0xE8, 0xF7}, 25}, /* нич */ - {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ - {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ - {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ - {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ - {{0xE6, 0xED, 0xFB}, 25}, /* жны */ - {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ - {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ - {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ - {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ - {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ - {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ - {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ - {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ - {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ - {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ - {{0xE8, 0xFF, 0xF5}, 24}, /* иях */ - {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ - {{0xFC, 0xF1, 0xFF}, 24}, /* ься */ - {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ - {{0xEE, 0xF7, 0xED}, 24}, /* очн */ - {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ - {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ - {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ - {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ - {{0xE0, 0xFF, 0xF5}, 24}, /* аях */ - {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ - {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ - {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ - {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ - {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ - {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ - {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ - {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ - {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ - {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ - {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ - {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ - {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ - {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ - {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ - {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ - {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ - {{0xE1, 0xFA, 0xFF}, 23}, /* бъя */ - {{0xED, 0xE0, 0xF7}, 23}, /* нач */ - {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ - {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ - {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ - {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ - {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ - {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ - {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ - {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ - {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ - {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ - {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ - {{0xED, 0xE5, 0xE7}, 22}, /* нез */ - {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ - {{0xF1, 0xE2, 0xFF}, 22}, /* свя */ - {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ - {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ - {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ - {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ - {{0xED, 0xE5, 0xEC}, 22}, /* нем */ - {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ - {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ - {{0xE2, 0xFF, 0xE7}, 22}, /* вяз */ - {{0xFF, 0xF2, 0xE8}, 22}, /* яти */ - {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ - {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ - {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ - {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ - {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ - {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ - {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ - {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ - {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ - {{0xEA, 0xE0, 0xEA}, 21}, /* как */ - {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ - {{0xED, 0xE0, 0xEC}, 21}, /* нам */ - {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ - {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ - {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ - {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ - {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ - {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ - {{0xE1, 0xE0, 0xED}, 21}, /* бан */ - {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ - {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ - {{0xEB, 0xED, 0xEE}, 21}, /* лно */ - {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ - {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ - {{0xFF, 0xE4, 0xEA}, 21}, /* ядк */ - {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ - {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ - {{0xE0, 0xED, 0xEA}, 21}, /* анк */ - {{0xED, 0xE5, 0xE3}, 21}, /* нег */ - {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ - {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ - {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ - {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ - {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ - {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ - {{0xF2, 0xED, 0xE8}, 21}, /* тни */ - {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ - {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ - {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ - {{0xE0, 0xF0, 0xED}, 20}, /* арн */ - {{0xF7, 0xED, 0xFB}, 20}, /* чны */ - {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ - {{0xF2, 0xE8, 0xFF}, 20}, /* тия */ - {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ - {{0xD1, 0xF2, 0xF0}, 20}, /* Стр */ - {{0xED, 0xF2, 0xEE}, 20}, /* нто */ - {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ - {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ - {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ - {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ - {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ - {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ - {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ - {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ - {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ - {{0xE2, 0xF1, 0xE5}, 19}, /* все */ - {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ - {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ - {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ - {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ - {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ - {{0xE5, 0xE4, 0xED}, 19}, /* едн */ - {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ - {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ - {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ - {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ - {{0xF2, 0xEE, 0xE9}, 19}, /* той */ - {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ - {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ - {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ - {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ - {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ - {{0xE5, 0xED, 0xFF}, 19}, /* еня */ - {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ - {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ - {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ - {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ - {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ - {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ - {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ - {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ - {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ - {{0xE0, 0xE7, 0xED}, 18}, /* азн */ - {{0xF2, 0xED, 0xFB}, 18}, /* тны */ - {{0xEE, 0xE4, 0xFF}, 18}, /* одя */ - {{0xEE, 0xE1, 0xED}, 18}, /* обн */ - {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ - {{0xEE, 0xF1, 0xFF}, 18}, /* ося */ - {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ - {{0xED, 0xFF, 0xFE}, 18}, /* няю */ - {{0xED, 0xE0, 0xF0}, 18}, /* нар */ - {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ - {{0xE0, 0xF1, 0xED}, 18}, /* асн */ - {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ - {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ - {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ - {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ - {{0xED, 0xF6, 0xE8}, 18}, /* нци */ - {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ - {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ - {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ - {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ - {{0xCE, 0xE1, 0xFF}, 18}, /* Обя */ - {{0xCF, 0xF0, 0xE0}, 18}, /* Пра */ - {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ - {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ - {{0xEB, 0xED, 0xE8}, 18}, /* лни */ - {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ - {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ - {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ - {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ - {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ - {{0xF0, 0xED, 0xFB}, 17}, /* рны */ - {{0xE1, 0xED, 0xFB}, 17}, /* бны */ - {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ - {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ - {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ - {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ - {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ - {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ - {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ - {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ - {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ - {{0xE4, 0xE8, 0xE2}, 17}, /* див */ - {{0xED, 0xE0, 0xED}, 17}, /* нан */ - {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ - {{0xE4, 0xED, 0xE5}, 17}, /* дне */ - {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ - {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ - {{0xED, 0xE0, 0xF5}, 17}, /* нах */ - {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ - {{0xE0, 0xEB, 0xE8}, 17}, /* али */ - {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ - {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ - {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ - {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ - {{0xFF, 0xE2, 0xE8}, 16}, /* яви */ - {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ - {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ - {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ - {{0xED, 0xF3, 0xFE}, 16}, /* ную */ - {{0xEF, 0xE5, 0xED}, 16}, /* пен */ - {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ - {{0xEE, 0xED, 0xED}, 16}, /* онн */ - {{0xE2, 0xE8, 0xED}, 16}, /* вин */ - {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ - {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ - {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ - {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ - {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ - {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ - {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ - {{0xCA, 0xEE, 0xEC}, 16}, /* Ком */ - {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ - {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ - {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ - {{0xEF, 0xEE, 0xED}, 16}, /* пон */ - {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ - {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ - {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ - {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ - {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ - {{0xE2, 0xED, 0xEE}, 16}, /* вно */ - {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ - {{0xCB, 0xE8, 0xF6}, 15}, /* Лиц */ - {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ - {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ - {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ - {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ - {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ - {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ - {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ - {{0xC2, 0xEE, 0xE7}, 15}, /* Воз */ - {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ - {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ - {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ - {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ - {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ - {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ - {{0xF2, 0xE0, 0xEC}, 15}, /* там */ - {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ - {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ - {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ - {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ - {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ - {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ - {{0xF1, 0xE5, 0xED}, 15}, /* сен */ - {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ - {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ - {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ - {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ - {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ - {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ - {{0xD5, 0xF0, 0xE0}, 15}, /* Хра */ - {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ - {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ - {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ - {{0xF6, 0xE8, 0xFF}, 14}, /* ция */ - {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ - {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ - {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ - {{0xE0, 0xED, 0xF1}, 14}, /* анс */ - {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ - {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ - {{0xE5, 0xED, 0xFC}, 14}, /* ень */ - {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ - {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ - {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ - {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ - {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ - {{0xE2, 0xFC, 0xFF}, 13}, /* вья */ - {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ - {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ - {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ - {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ - {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ - {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ - {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ - {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ - {{0xFF, 0xE7, 0xE8}, 13}, /* язи */ - {{0xE8, 0xED, 0xE4}, 13}, /* инд */ - {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ - {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ - {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ - {{0xED, 0xE4, 0xE8}, 13}, /* нди */ - {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ - {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ - {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ - {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ - {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ - {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ - {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ - {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ - {{0xFF, 0xE5, 0xEC}, 13}, /* яем */ - {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ - {{0xED, 0xF2, 0xF3}, 13}, /* нту */ - {{0xED, 0xE5, 0xE9}, 13}, /* ней */ - {{0xED, 0xE0, 0xFF}, 13}, /* ная */ - {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ - {{0xF0, 0xED, 0xEE}, 13}, /* рно */ - {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ - {{0xE0, 0xED, 0xFB}, 13}, /* аны */ - {{0xC4, 0xEE, 0xE2}, 13}, /* Дов */ - {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ - {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ - {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ - {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ - {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ - {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ - {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ - {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ - {{0xE2, 0xE0, 0xFF}, 12}, /* вая */ - {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ - {{0xFF, 0xF9, 0xE8}, 12}, /* ящи */ - {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ - {{0xED, 0xE5, 0xE5}, 12}, /* нее */ - {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ - {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ - {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ - {{0xE8, 0xED, 0xF6}, 12}, /* инц */ - {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ - {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ - {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ - {{0xED, 0xE0, 0xF2}, 12}, /* нат */ - {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ - {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ - {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ - {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ - {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ - {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ - {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ - {{0xE5, 0xED, 0xF1}, 12}, /* енс */ - {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ - {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ - {{0xED, 0xE0, 0xE7}, 12}, /* наз */ - {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ - {{0xEE, 0xED, 0xE8}, 12}, /* они */ - {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ - {{0xE3, 0xEE, 0xE4}, 12}, /* год */ - {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ - {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ - {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ - {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ - {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ - {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ - {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ - {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ - {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ - {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ - {{0xF1, 0xE8, 0xFF}, 11}, /* сия */ - {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ - {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ - {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ - {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ - {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ - {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ - {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ - {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ - {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ - {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ - {{0xED, 0xED, 0xF3}, 11}, /* нну */ - {{0xED, 0xE5, 0xEF}, 11}, /* неп */ - {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ - {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ - {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ - {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ - {{0xE0, 0xE2, 0xED}, 11}, /* авн */ - {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ - {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ - {{0xC2, 0xF0, 0xE5}, 11}, /* Вре */ - {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ - {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ - {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ - {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ - {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ - {{0xEE, 0xED, 0xFB}, 10}, /* оны */ - {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ - {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ - {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ - {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ - {{0xFF, 0xF2, 0xFB}, 10}, /* яты */ - {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ - {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ - {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ - {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ - {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ - {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ - {{0xCE, 0xF2, 0xE2}, 10}, /* Отв */ - {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ - {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ - {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ - {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ - {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ - {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ - {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ - {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ - {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ - {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ - {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ - {{0xEC, 0xED, 0xEE}, 10}, /* мно */ - {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ - {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ - {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ - {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ - {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ - {{0xE4, 0xFF, 0xF9}, 10}, /* дящ */ - {{0xF2, 0xF0, 0xE8}, 10}, /* три */ - {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ - {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ - {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ - {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ - {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ - {{0xE7, 0xED, 0xFB}, 10}, /* зны */ - {{0xEE, 0xFF, 0xED}, 10}, /* оян */ - {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ - {{0xE2, 0xED, 0xE5}, 10}, /* вне */ - {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ - {{0xE5, 0xEC, 0xFF}, 10}, /* емя */ - {{0xED, 0xE0, 0xE8}, 10}, /* наи */ - {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ - {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ - {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ - {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ - {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ - {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ - {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ - {{0xED, 0xE8, 0xE2}, 10}, /* нив */ - {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ - {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ - {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ - {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ - {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ - {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ - {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ - {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ -}; - -static const myhtml_encoding_trigram_t myhtml_encoding_detect_trigrams_index_x_mac_cyrillic[] = { - {{0xE5, 0xED, 0xE8}, 991}, /* ени */ - {{0xEE, 0xE3, 0xEE}, 806}, /* ого */ - {{0xF1, 0xF2, 0xE2}, 659}, /* ств */ - {{0xED, 0xE8, 0xDF}, 629}, /* ния */ - {{0xEE, 0xE2, 0xE0}, 566}, /* ова */ - {{0xF2, 0xE5, 0xEB}, 555}, /* тел */ - {{0xF0, 0xE5, 0xE4}, 507}, /* ред */ - {{0xE5, 0xED, 0xED}, 499}, /* енн */ - {{0xEE, 0xE2, 0xEE}, 443}, /* ово */ - {{0xE0, 0xED, 0xE8}, 443}, /* ани */ - {{0xF2, 0xF0, 0xE0}, 429}, /* тра */ - {{0xEE, 0xF1, 0xF2}, 428}, /* ост */ - {{0xED, 0xE8, 0xE5}, 419}, /* ние */ - {{0xED, 0xED, 0xEE}, 412}, /* нно */ - {{0xE0, 0xF5, 0xEE}, 396}, /* ахо */ - {{0xF1, 0xF2, 0xF0}, 392}, /* стр */ - {{0xF0, 0xE0, 0xF5}, 386}, /* рах */ - {{0xF5, 0xEE, 0xE2}, 379}, /* хов */ - {{0xE5, 0xEB, 0xFC}, 365}, /* ель */ - {{0xE3, 0xEE, 0xE2}, 360}, /* гов */ - {{0xE2, 0xEE, 0xF0}, 356}, /* вор */ - {{0xE5, 0xF1, 0xF2}, 349}, /* ест */ - {{0xE0, 0xF2, 0xFC}, 345}, /* ать */ - {{0xF0, 0xE0, 0xE2}, 337}, /* рав */ - {{0xEF, 0xF0, 0xE8}, 330}, /* при */ - {{0xEF, 0xF0, 0xE5}, 323}, /* пре */ - {{0xE4, 0xEE, 0xE3}, 318}, /* дог */ - {{0xED, 0xE5, 0xED}, 310}, /* нен */ - {{0xEF, 0xF0, 0xE0}, 309}, /* пра */ - {{0xE2, 0xE0, 0xED}, 304}, /* ван */ - {{0xE8, 0xF2, 0xE5}, 295}, /* ите */ - {{0xF2, 0xE2, 0xE5}, 281}, /* тве */ - {{0xEB, 0xE5, 0xED}, 266}, /* лен */ - {{0xF1, 0xF2, 0xEE}, 261}, /* сто */ - {{0xF2, 0xE0, 0xF2}, 260}, /* тат */ - {{0xED, 0xED, 0xFB}, 260}, /* нны */ - {{0xEB, 0xFC, 0xED}, 256}, /* льн */ - {{0xE2, 0xEE, 0xE7}, 255}, /* воз */ - {{0xE8, 0xEB, 0xE8}, 254}, /* или */ - {{0xE0, 0xF2, 0xE5}, 252}, /* ате */ - {{0xE5, 0xE3, 0xEE}, 241}, /* его */ - {{0xE5, 0xF2, 0xF1}, 238}, /* етс */ - {{0xED, 0xEE, 0xF1}, 236}, /* нос */ - {{0xF9, 0xE5, 0xF1}, 235}, /* щес */ - {{0xEF, 0xEE, 0xEB}, 232}, /* пол */ - {{0xF0, 0xE0, 0xED}, 231}, /* ран */ - {{0xED, 0xEE, 0xE3}, 230}, /* ног */ - {{0xF1, 0xF2, 0xE0}, 229}, /* ста */ - {{0xF7, 0xE5, 0xED}, 226}, /* чен */ - {{0xF2, 0xF0, 0xE5}, 224}, /* тре */ - {{0xE7, 0xEC, 0xE5}, 214}, /* зме */ - {{0xF3, 0xF9, 0xE5}, 212}, /* уще */ - {{0xF1, 0xF2, 0xE8}, 210}, /* сти */ - {{0xEA, 0xEE, 0xEC}, 207}, /* ком */ - {{0xEE, 0xF0, 0xEE}, 206}, /* оро */ - {{0xE2, 0xEB, 0xE5}, 195}, /* вле */ - {{0xE7, 0xE0, 0xED}, 194}, /* зан */ - {{0xE0, 0xF1, 0xF2}, 193}, /* аст */ - {{0xF2, 0xF1, 0xDF}, 191}, /* тся */ - {{0xF5, 0xF0, 0xE0}, 187}, /* хра */ - {{0xE0, 0xED, 0xED}, 182}, /* анн */ - {{0xE5, 0xF0, 0xE5}, 182}, /* ере */ - {{0xE2, 0xF0, 0xE5}, 178}, /* вре */ - {{0xEE, 0xE2, 0xE5}, 173}, /* ове */ - {{0xFC, 0xED, 0xEE}, 173}, /* ьно */ - {{0xE2, 0xE5, 0xF0}, 172}, /* вер */ - {{0xEC, 0xE5, 0xED}, 170}, /* мен */ - {{0xEB, 0xE8, 0xF6}, 168}, /* лиц */ - {{0xF2, 0xEE, 0xF0}, 167}, /* тор */ - {{0xF0, 0xE5, 0xED}, 167}, /* рен */ - {{0xF9, 0xE5, 0xED}, 165}, /* щен */ - {{0xEE, 0xE7, 0xEC}, 164}, /* озм */ - {{0xE5, 0xE4, 0xE0}, 163}, /* еда */ - {{0xF2, 0xE2, 0xE8}, 159}, /* тви */ - {{0xDF, 0xE7, 0xE0}, 159}, /* яза */ - {{0xE1, 0xDF, 0xE7}, 158}, /* бяз */ - {{0xED, 0xE8, 0xE8}, 153}, /* нии */ - {{0xED, 0xFB, 0xF5}, 153}, /* ных */ - {{0xF2, 0xFC, 0xDF}, 153}, /* тья */ - {{0xEC, 0xE5, 0xF0}, 153}, /* мер */ - {{0xF1, 0xEB, 0xE8}, 150}, /* сли */ - {{0xF2, 0xEE, 0xE2}, 148}, /* тов */ - {{0xF2, 0xE2, 0xE0}, 147}, /* тва */ - {{0xEE, 0xF0, 0xE0}, 146}, /* ора */ - {{0xED, 0xEE, 0xEC}, 144}, /* ном */ - {{0xE4, 0xE5, 0xED}, 144}, /* ден */ - {{0xE0, 0xED, 0xE5}, 142}, /* ане */ - {{0xEA, 0xEE, 0xED}, 141}, /* кон */ - {{0xEB, 0xF3, 0xF7}, 141}, /* луч */ - {{0xEC, 0xF3, 0xF9}, 140}, /* мущ */ - {{0xEE, 0xE1, 0xDF}, 140}, /* обя */ - {{0xE2, 0xE0, 0xF2}, 138}, /* ват */ - {{0xE2, 0xE0, 0xF0}, 137}, /* вар */ - {{0xE5, 0xF9, 0xE5}, 137}, /* еще */ - {{0xEE, 0xF2, 0xF0}, 137}, /* отр */ - {{0xE4, 0xE5, 0xEB}, 137}, /* дел */ - {{0xED, 0xFB, 0xEC}, 136}, /* ным */ - {{0xE8, 0xEC, 0xF3}, 136}, /* иму */ - {{0x91, 0xF2, 0xE0}, 134}, /* Ста */ - {{0xF3, 0xF7, 0xE0}, 133}, /* уча */ - {{0xF2, 0xF1, 0xF2}, 131}, /* тст */ - {{0xE5, 0xEB, 0xDF}, 130}, /* еля */ - {{0xF1, 0xEB, 0xF3}, 130}, /* слу */ - {{0xE7, 0xE0, 0xEA}, 130}, /* зак */ - {{0xF2, 0xEE, 0xDF}, 129}, /* тоя */ - {{0xEE, 0xEC, 0xE8}, 128}, /* оми */ - {{0xEC, 0xE5, 0xF9}, 128}, /* мещ */ - {{0xE5, 0xE4, 0xF3}, 127}, /* еду */ - {{0xE2, 0xE5, 0xED}, 127}, /* вен */ - {{0xED, 0xEE, 0xE2}, 127}, /* нов */ - {{0xED, 0xEE, 0xE5}, 126}, /* ное */ - {{0xEE, 0xF2, 0xE2}, 125}, /* отв */ - {{0xEA, 0xE0, 0xE7}, 125}, /* каз */ - {{0xE0, 0xE5, 0xF2}, 125}, /* ает */ - {{0xF1, 0xEA, 0xEE}, 125}, /* ско */ - {{0xE5, 0xED, 0xF2}, 124}, /* ент */ - {{0xEC, 0xEE, 0xF2}, 123}, /* мот */ - {{0xE0, 0xE2, 0xEB}, 122}, /* авл */ - {{0xF1, 0xEC, 0xEE}, 122}, /* смо */ - {{0xE8, 0xF7, 0xE8}, 121}, /* ичи */ - {{0xE1, 0xFB, 0xF2}, 120}, /* быт */ - {{0xF3, 0xF1, 0xEC}, 118}, /* усм */ - {{0xF1, 0xF1, 0xE8}, 117}, /* сси */ - {{0xE4, 0xF3, 0xF1}, 117}, /* дус */ - {{0xF5, 0xEE, 0xE4}, 117}, /* ход */ - {{0xF0, 0xE8, 0xF7}, 117}, /* рич */ - {{0xF7, 0xE5, 0xF1}, 115}, /* чес */ - {{0xE3, 0xF0, 0xE0}, 114}, /* гра */ - {{0xEF, 0xF0, 0xEE}, 114}, /* про */ - {{0xE4, 0xEE, 0xE2}, 113}, /* дов */ - {{0xE2, 0xE5, 0xF2}, 112}, /* вет */ - {{0xE5, 0xE4, 0xE5}, 112}, /* еде */ - {{0xF8, 0xE5, 0xED}, 111}, /* шен */ - {{0xF7, 0xE8, 0xED}, 110}, /* чин */ - {{0xED, 0xE0, 0xF1}, 109}, /* нас */ - {{0xE8, 0xF2, 0xFC}, 105}, /* ить */ - {{0xF2, 0xE2, 0xEE}, 105}, /* тво */ - {{0xEA, 0xEB, 0xFE}, 104}, /* клю */ - {{0xF0, 0xE8, 0xF2}, 104}, /* рит */ - {{0xF1, 0xF2, 0xFC}, 104}, /* сть */ - {{0xEB, 0xFE, 0xF7}, 104}, /* люч */ - {{0xF2, 0xEE, 0xEC}, 104}, /* том */ - {{0xF1, 0xEB, 0xE5}, 103}, /* сле */ - {{0xF1, 0xEF, 0xEE}, 102}, /* спо */ - {{0xEE, 0xEB, 0xED}, 102}, /* олн */ - {{0xE5, 0xF1, 0xEB}, 102}, /* есл */ - {{0xE5, 0xF0, 0xE8}, 101}, /* ери */ - {{0xED, 0xEE, 0xE9}, 101}, /* ной */ - {{0xF0, 0xEE, 0xEC}, 101}, /* ром */ - {{0xEE, 0xF2, 0xEE}, 99}, /* ото */ - {{0xED, 0xFB, 0xE5}, 99}, /* ные */ - {{0xE7, 0xED, 0xE0}, 99}, /* зна */ - {{0xE2, 0xEB, 0xDF}, 99}, /* вля */ - {{0xF2, 0xE5, 0xF0}, 98}, /* тер */ - {{0xF3, 0xEF, 0xF0}, 97}, /* упр */ - {{0xE0, 0xEA, 0xEE}, 96}, /* ако */ - {{0xEA, 0xEE, 0xE3}, 96}, /* ког */ - {{0xED, 0xFB, 0xE9}, 96}, /* ный */ - {{0xEE, 0xF0, 0xF3}, 96}, /* ору */ - {{0xE5, 0xEB, 0xE5}, 95}, /* еле */ - {{0xE5, 0xF1, 0xEA}, 95}, /* еск */ - {{0xE0, 0xE7, 0xE0}, 95}, /* аза */ - {{0xE9, 0xF1, 0xF2}, 93}, /* йст */ - {{0xEF, 0xEE, 0xF0}, 93}, /* пор */ - {{0xEE, 0xE6, 0xE5}, 92}, /* оже */ - {{0xE8, 0xED, 0xE5}, 91}, /* ине */ - {{0xF9, 0xE5, 0xE9}, 90}, /* щей */ - {{0xE6, 0xE4, 0xE5}, 90}, /* жде */ - {{0xEF, 0xE5, 0xF0}, 89}, /* пер */ - {{0xED, 0xE8, 0xF2}, 89}, /* нит */ - {{0xEE, 0xEB, 0xFC}, 89}, /* оль */ - {{0xE0, 0xE6, 0xE4}, 88}, /* ажд */ - {{0xE6, 0xE5, 0xED}, 87}, /* жен */ - {{0xEB, 0xE0, 0xE4}, 87}, /* лад */ - {{0xE0, 0xEC, 0xE8}, 87}, /* ами */ - {{0xEA, 0xEE, 0xF2}, 86}, /* кот */ - {{0xF7, 0xE0, 0xE5}, 85}, /* чае */ - {{0xE2, 0xE5, 0xF9}, 85}, /* вещ */ - {{0xE2, 0xE8, 0xDF}, 85}, /* вия */ - {{0xDF, 0xF9, 0xE5}, 85}, /* яще */ - {{0xE8, 0xE5, 0xEC}, 85}, /* ием */ - {{0xEA, 0xEB, 0xE0}, 85}, /* кла */ - {{0xE5, 0xE9, 0xF1}, 84}, /* ейс */ - {{0xFB, 0xF2, 0xFC}, 84}, /* ыть */ - {{0xE0, 0xE2, 0xEE}, 84}, /* аво */ - {{0xF0, 0xE0, 0xE6}, 83}, /* раж */ - {{0xEB, 0xFC, 0xF1}, 83}, /* льс */ - {{0xEE, 0xDF, 0xF9}, 82}, /* оящ */ - {{0xE5, 0xED, 0xEE}, 81}, /* ено */ - {{0xE4, 0xF1, 0xF2}, 81}, /* дст */ - {{0xE4, 0xE5, 0xE9}, 80}, /* дей */ - {{0xF0, 0xE5, 0xE1}, 80}, /* реб */ - {{0xFC, 0xF1, 0xF2}, 79}, /* ьст */ - {{0xE5, 0xE4, 0xF1}, 79}, /* едс */ - {{0xE0, 0xF0, 0xE8}, 79}, /* ари */ - {{0xE4, 0xE0, 0xED}, 79}, /* дан */ - {{0xEC, 0xEE, 0xE6}, 78}, /* мож */ - {{0xE8, 0xEC, 0xE5}, 78}, /* име */ - {{0xE8, 0xED, 0xEE}, 78}, /* ино */ - {{0xF0, 0xE8, 0xED}, 77}, /* рин */ - {{0xE4, 0xEE, 0xF1}, 77}, /* дос */ - {{0xEF, 0xEE, 0xF1}, 77}, /* пос */ - {{0xF2, 0xE0, 0xEA}, 77}, /* так */ - {{0xF9, 0xE5, 0xE3}, 77}, /* щег */ - {{0xE4, 0xE0, 0xF2}, 77}, /* дат */ - {{0xEF, 0xEB, 0xE0}, 76}, /* пла */ - {{0xF3, 0xF1, 0xEB}, 76}, /* усл */ - {{0xE8, 0xF6, 0xE0}, 76}, /* ица */ - {{0xF0, 0xEE, 0xE2}, 75}, /* ров */ - {{0xFD, 0xF2, 0xEE}, 75}, /* это */ - {{0xF3, 0xF7, 0xE5}, 74}, /* уче */ - {{0xE4, 0xEE, 0xEB}, 73}, /* дол */ - {{0xFC, 0xED, 0xFB}, 73}, /* ьны */ - {{0xF0, 0xE0, 0xE7}, 73}, /* раз */ - {{0xEC, 0xE8, 0xF1}, 73}, /* мис */ - {{0xE0, 0xED, 0xEE}, 72}, /* ано */ - {{0xF1, 0xF0, 0xEE}, 72}, /* сро */ - {{0xE0, 0xE2, 0xE8}, 72}, /* ави */ - {{0xF2, 0xFC, 0xE8}, 71}, /* тьи */ - {{0xFE, 0xF7, 0xE5}, 70}, /* юче */ - {{0xF1, 0xEA, 0xEB}, 70}, /* скл */ - {{0xE8, 0xF1, 0xF1}, 70}, /* исс */ - {{0xE6, 0xE5, 0xF2}, 69}, /* жет */ - {{0xE5, 0xE4, 0xEE}, 69}, /* едо */ - {{0xEB, 0xE5, 0xE4}, 69}, /* лед */ - {{0xEB, 0xEE, 0xE2}, 69}, /* лов */ - {{0xFE, 0xF9, 0xE8}, 68}, /* ющи */ - {{0xE8, 0xE1, 0xEE}, 68}, /* ибо */ - {{0xEB, 0xE0, 0xF2}, 67}, /* лат */ - {{0xF0, 0xEE, 0xEA}, 67}, /* рок */ - {{0xE0, 0xEA, 0xEB}, 67}, /* акл */ - {{0xF0, 0xE8, 0xF9}, 67}, /* рищ */ - {{0xE1, 0xEE, 0xE2}, 67}, /* бов */ - {{0xE8, 0xF1, 0xEA}, 67}, /* иск */ - {{0xE5, 0xE1, 0xEE}, 67}, /* ебо */ - {{0xEB, 0xFC, 0xE7}, 67}, /* льз */ - {{0xF3, 0xEA, 0xE0}, 67}, /* ука */ - {{0xEB, 0xE8, 0xE1}, 66}, /* либ */ - {{0xEE, 0xEC, 0xF3}, 66}, /* ому */ - {{0xEE, 0xE2, 0xEB}, 66}, /* овл */ - {{0xF2, 0xED, 0xEE}, 65}, /* тно */ - {{0xE2, 0xEE, 0xE9}, 64}, /* вой */ - {{0xF2, 0xEE, 0xE3}, 64}, /* тог */ - {{0xF1, 0xEB, 0xEE}, 64}, /* сло */ - {{0xEE, 0xE7, 0xED}, 64}, /* озн */ - {{0xF1, 0xEE, 0xEE}, 64}, /* соо */ - {{0xE7, 0xE0, 0xF2}, 63}, /* зат */ - {{0xE8, 0xF1, 0xEF}, 63}, /* исп */ - {{0xE0, 0xF7, 0xE5}, 63}, /* аче */ - {{0xED, 0xE8, 0xFE}, 63}, /* нию */ - {{0xEE, 0xED, 0xE5}, 63}, /* оне */ - {{0xEE, 0xEB, 0xE6}, 62}, /* олж */ - {{0xEE, 0xE2, 0xF9}, 61}, /* овщ */ - {{0xF0, 0xE0, 0xF1}, 61}, /* рас */ - {{0xE2, 0xE8, 0xE4}, 61}, /* вид */ - {{0xE2, 0xF9, 0xE8}, 61}, /* вщи */ - {{0xF1, 0xED, 0xEE}, 61}, /* сно */ - {{0xE8, 0xF6, 0xEE}, 61}, /* ицо */ - {{0xE8, 0xF7, 0xE5}, 61}, /* иче */ - {{0xE0, 0xE2, 0xE5}, 61}, /* аве */ - {{0xE3, 0xEB, 0xE0}, 61}, /* гла */ - {{0xF7, 0xE5, 0xF2}, 61}, /* чет */ - {{0xF9, 0xE8, 0xEA}, 61}, /* щик */ - {{0xF0, 0xF3, 0xE3}, 60}, /* руг */ - {{0xF2, 0xE0, 0xED}, 60}, /* тан */ - {{0xE8, 0xEC, 0xEE}, 60}, /* имо */ - {{0xE0, 0xEB, 0xFC}, 60}, /* аль */ - {{0xEE, 0xE2, 0xE8}, 60}, /* ови */ - {{0xE6, 0xE4, 0xE0}, 60}, /* жда */ - {{0xEF, 0xEE, 0xE2}, 60}, /* пов */ - {{0xE5, 0xEC, 0xF3}, 60}, /* ему */ - {{0xDF, 0xF2, 0xE5}, 60}, /* яте */ - {{0xF1, 0xE8, 0xE8}, 59}, /* сии */ - {{0xE1, 0xEE, 0xF2}, 59}, /* бот */ - {{0xE2, 0xFB, 0xEF}, 59}, /* вып */ - {{0xE0, 0xE1, 0xEE}, 59}, /* або */ - {{0xEB, 0xDF, 0xFE}, 59}, /* ляю */ - {{0xF1, 0xF3, 0xF9}, 58}, /* сущ */ - {{0xEE, 0xE4, 0xE5}, 58}, /* оде */ - {{0xE8, 0xED, 0xE8}, 58}, /* ини */ - {{0xF0, 0xE0, 0xF2}, 58}, /* рат */ - {{0xDF, 0xE2, 0xEB}, 58}, /* явл */ - {{0xED, 0xE0, 0xE3}, 57}, /* наг */ - {{0xE4, 0xF0, 0xF3}, 57}, /* дру */ - {{0xF0, 0xE0, 0xE1}, 57}, /* раб */ - {{0xE0, 0xE3, 0xF0}, 57}, /* агр */ - {{0xE8, 0xEE, 0xED}, 57}, /* ион */ - {{0xEC, 0xE5, 0xF1}, 57}, /* мес */ - {{0xE0, 0xF6, 0xE8}, 56}, /* аци */ - {{0xEE, 0xF1, 0xF3}, 56}, /* осу */ - {{0xEA, 0xEE, 0xE9}, 55}, /* кой */ - {{0xF1, 0xE2, 0xEE}, 55}, /* сво */ - {{0xE7, 0xEE, 0xE2}, 55}, /* зов */ - {{0xEE, 0xEF, 0xF0}, 54}, /* опр */ - {{0xF1, 0xEE, 0xE1}, 54}, /* соб */ - {{0xE2, 0xEF, 0xF0}, 54}, /* впр */ - {{0xEB, 0xED, 0xE5}, 54}, /* лне */ - {{0xEE, 0xEC, 0xEC}, 54}, /* омм */ - {{0xE5, 0xF0, 0xE0}, 54}, /* ера */ - {{0xF7, 0xE8, 0xF2}, 54}, /* чит */ - {{0xE5, 0xF0, 0xF7}, 54}, /* ерч */ - {{0xF0, 0xF7, 0xE5}, 54}, /* рче */ - {{0xE0, 0xF2, 0xE8}, 54}, /* ати */ - {{0xED, 0xE8, 0xEA}, 54}, /* ник */ - {{0xEC, 0xEC, 0xE5}, 54}, /* мме */ - {{0xF3, 0xF1, 0xF2}, 53}, /* уст */ - {{0xF2, 0xE5, 0xED}, 53}, /* тен */ - {{0xE2, 0xE5, 0xE4}, 53}, /* вед */ - {{0xF1, 0xEE, 0xE2}, 52}, /* сов */ - {{0xE0, 0xE6, 0xE5}, 52}, /* аже */ - {{0xEE, 0xEA, 0xE0}, 52}, /* ока */ - {{0xFB, 0xEC, 0xE8}, 52}, /* ыми */ - {{0xFE, 0xF2, 0xF1}, 52}, /* ютс */ - {{0xEE, 0xEE, 0xF2}, 52}, /* оот */ - {{0xEC, 0xE8, 0xF2}, 52}, /* мит */ - {{0xDF, 0xFE, 0xF9}, 51}, /* яющ */ - {{0xE2, 0xF8, 0xE5}, 51}, /* вше */ - {{0xF1, 0xE8, 0xEE}, 51}, /* сио */ - {{0xEE, 0xED, 0xEE}, 51}, /* оно */ - {{0xE0, 0xE2, 0xE0}, 51}, /* ава */ - {{0xE0, 0xF9, 0xE5}, 51}, /* аще */ - {{0xEB, 0xDF, 0xE5}, 50}, /* ляе */ - {{0xE5, 0xED, 0xE5}, 50}, /* ене */ - {{0xEE, 0xE4, 0xE8}, 50}, /* оди */ - {{0xEF, 0xF3, 0xED}, 49}, /* пун */ - {{0xEB, 0xE8, 0xF7}, 49}, /* лич */ - {{0xE2, 0xEE, 0xEC}, 49}, /* вом */ - {{0xED, 0xEA, 0xF2}, 49}, /* нкт */ - {{0xED, 0xE5, 0xF1}, 49}, /* нес */ - {{0xE2, 0xE8, 0xEB}, 49}, /* вил */ - {{0xE5, 0xE6, 0xE4}, 49}, /* ежд */ - {{0xF0, 0xE5, 0xF1}, 49}, /* рес */ - {{0xFE, 0xF9, 0xE5}, 49}, /* юще */ - {{0xFC, 0xE7, 0xEE}, 49}, /* ьзо */ - {{0xEF, 0xEE, 0xF2}, 49}, /* пот */ - {{0xF3, 0xED, 0xEA}, 49}, /* унк */ - {{0xF1, 0xF2, 0xE5}, 49}, /* сте */ - {{0xEA, 0xEE, 0xE2}, 49}, /* ков */ - {{0xEE, 0xF1, 0xEB}, 48}, /* осл */ - {{0xDF, 0xE5, 0xF2}, 48}, /* яет */ - {{0x85, 0xF1, 0xEB}, 48}, /* Есл */ - {{0x8F, 0xF0, 0xE8}, 48}, /* При */ - {{0xF2, 0xE0, 0xE2}, 48}, /* тав */ - {{0xED, 0xE5, 0xF0}, 48}, /* нер */ - {{0xF7, 0xED, 0xEE}, 47}, /* чно */ - {{0xEF, 0xEE, 0xE4}, 47}, /* под */ - {{0xED, 0xF2, 0xE0}, 47}, /* нта */ - {{0xE8, 0xF9, 0xE5}, 47}, /* ище */ - {{0xEE, 0xE1, 0xF9}, 47}, /* общ */ - {{0xE0, 0xE7, 0xEC}, 47}, /* азм */ - {{0xE6, 0xED, 0xEE}, 47}, /* жно */ - {{0xE2, 0xE8, 0xE8}, 46}, /* вии */ - {{0xF0, 0xE0, 0xF9}, 46}, /* ращ */ - {{0xEE, 0xF0, 0xE5}, 46}, /* оре */ - {{0xE2, 0xF8, 0xE8}, 46}, /* вши */ - {{0xE5, 0xEA, 0xF1}, 46}, /* екс */ - {{0xE2, 0xEE, 0xE3}, 46}, /* вог */ - {{0xF7, 0xF2, 0xEE}, 46}, /* что */ - {{0xE8, 0xF7, 0xED}, 45}, /* ичн */ - {{0xEB, 0xE5, 0xEC}, 45}, /* лем */ - {{0xEC, 0xEE, 0xE3}, 45}, /* мог */ - {{0xF2, 0xE2, 0xEB}, 45}, /* твл */ - {{0xE4, 0xEB, 0xE5}, 45}, /* дле */ - {{0xE4, 0xEB, 0xDF}, 45}, /* для */ - {{0xF0, 0xE5, 0xF2}, 45}, /* рет */ - {{0xE0, 0xF0, 0xE0}, 45}, /* ара */ - {{0xED, 0xDF, 0xF2}, 44}, /* нят */ - {{0xE5, 0xF7, 0xE5}, 44}, /* ече */ - {{0xEE, 0xF2, 0xE5}, 44}, /* оте */ - {{0xEE, 0xF0, 0xFB}, 44}, /* оры */ - {{0xEE, 0xF1, 0xED}, 43}, /* осн */ - {{0xEE, 0xE1, 0xEE}, 43}, /* обо */ - {{0xEE, 0xE3, 0xEB}, 43}, /* огл */ - {{0xE8, 0xED, 0xFB}, 43}, /* ины */ - {{0xE5, 0xF1, 0xF1}, 43}, /* есс */ - {{0xEE, 0xE1, 0xF0}, 43}, /* обр */ - {{0xEA, 0xF0, 0xE0}, 43}, /* кра */ - {{0xE8, 0xDF, 0xEC}, 43}, /* иям */ - {{0xE0, 0xEB, 0xEE}, 43}, /* ало */ - {{0xF0, 0xF3, 0xF7}, 43}, /* руч */ - {{0xEE, 0xF0, 0xE3}, 43}, /* орг */ - {{0xF7, 0xE0, 0xDF}, 42}, /* чая */ - {{0xED, 0xE8, 0xEC}, 42}, /* ним */ - {{0xE8, 0xE7, 0xED}, 42}, /* изн */ - {{0xEF, 0xEE, 0xEA}, 42}, /* пок */ - {{0xF1, 0xF2, 0xF3}, 42}, /* сту */ - {{0xE5, 0xEB, 0xFE}, 42}, /* елю */ - {{0xF2, 0xE8, 0xF2}, 42}, /* тит */ - {{0xF6, 0xE5, 0xED}, 42}, /* цен */ - {{0xF7, 0xE0, 0xF1}, 42}, /* час */ - {{0xE3, 0xE0, 0xED}, 42}, /* ган */ - {{0xF0, 0xE3, 0xE0}, 42}, /* рга */ - {{0xF1, 0xF2, 0xED}, 42}, /* стн */ - {{0xF0, 0xE5, 0xE6}, 42}, /* реж */ - {{0xF3, 0xEC, 0xEC}, 42}, /* умм */ - {{0xF2, 0xE2, 0xF3}, 41}, /* тву */ - {{0xF2, 0xF3, 0xEF}, 41}, /* туп */ - {{0xF1, 0xEA, 0xE8}, 40}, /* ски */ - {{0xE4, 0xE5, 0xEA}, 40}, /* дек */ - {{0xEB, 0xE5, 0xE6}, 40}, /* леж */ - {{0xE5, 0xF1, 0xE5}, 40}, /* есе */ - {{0xE2, 0xE8, 0xE5}, 40}, /* вие */ - {{0xF2, 0xEA, 0xE0}, 40}, /* тка */ - {{0xE5, 0xEA, 0xF0}, 40}, /* екр */ - {{0xEE, 0xE4, 0xEE}, 40}, /* одо */ - {{0xEA, 0xF1, 0xE0}, 40}, /* кса */ - {{0xF0, 0xE5, 0xEA}, 40}, /* рек */ - {{0xED, 0xF2, 0xE5}, 40}, /* нте */ - {{0xF3, 0xE3, 0xE8}, 40}, /* уги */ - {{0xE1, 0xFB, 0xEB}, 40}, /* был */ - {{0xE8, 0xED, 0xDF}, 40}, /* иня */ - {{0xE5, 0xF9, 0xE8}, 39}, /* ещи */ - {{0xE3, 0xE5, 0xED}, 39}, /* ген */ - {{0x8A, 0xEE, 0xE4}, 39}, /* Код */ - {{0xE4, 0xE8, 0xF2}, 39}, /* дит */ - {{0xF1, 0xF5, 0xEE}, 39}, /* схо */ - {{0xE8, 0xED, 0xF2}, 39}, /* инт */ - {{0xF1, 0xF3, 0xEC}, 39}, /* сум */ - {{0xF0, 0xEE, 0xED}, 39}, /* рон */ - {{0xEE, 0xF2, 0xEA}, 39}, /* отк */ - {{0xE4, 0xEE, 0xEA}, 39}, /* док */ - {{0xE8, 0xEB, 0xE0}, 38}, /* ила */ - {{0xF6, 0xE5, 0xF1}, 38}, /* цес */ - {{0xE8, 0xEA, 0xE0}, 38}, /* ика */ - {{0xE7, 0xED, 0xE8}, 38}, /* зни */ - {{0xEE, 0xE2, 0xFB}, 38}, /* овы */ - {{0xEB, 0xE6, 0xED}, 38}, /* лжн */ - {{0xF3, 0xEF, 0xEB}, 38}, /* упл */ - {{0xE3, 0xE4, 0xE0}, 37}, /* гда */ - {{0xEB, 0xE0, 0xE6}, 37}, /* лаж */ - {{0xE6, 0xE5, 0xE4}, 37}, /* жед */ - {{0xE1, 0xE5, 0xE7}, 37}, /* без */ - {{0xE4, 0xE5, 0xF2}, 37}, /* дет */ - {{0xEE, 0xF0, 0xDF}, 37}, /* оря */ - {{0xF0, 0xEE, 0xF1}, 37}, /* рос */ - {{0xEE, 0xE1, 0xEB}, 37}, /* обл */ - {{0xF6, 0xE8, 0xE8}, 37}, /* ции */ - {{0xE4, 0xEE, 0xEC}, 37}, /* дом */ - {{0xED, 0xF6, 0xE5}, 37}, /* нце */ - {{0xF8, 0xE5, 0xE3}, 37}, /* шег */ - {{0xEB, 0xEE, 0xE6}, 37}, /* лож */ - {{0xEE, 0xED, 0xE0}, 37}, /* она */ - {{0xEE, 0xEA, 0xEB}, 37}, /* окл */ - {{0xEE, 0xE3, 0xE4}, 37}, /* огд */ - {{0xF0, 0xEE, 0xE4}, 37}, /* род */ - {{0xE5, 0xED, 0xE0}, 37}, /* ена */ - {{0xEE, 0xED, 0xF6}, 37}, /* онц */ - {{0xEE, 0xF2, 0xED}, 37}, /* отн */ - {{0xF1, 0xEE, 0xE3}, 37}, /* сог */ - {{0xE5, 0xE2, 0xF8}, 37}, /* евш */ - {{0xE2, 0xE8, 0xF2}, 36}, /* вит */ - {{0xE5, 0xF0, 0xEF}, 36}, /* ерп */ - {{0xEE, 0xE4, 0xE0}, 36}, /* ода */ - {{0xE5, 0xF2, 0xE5}, 36}, /* ете */ - {{0xED, 0xE5, 0xEE}, 36}, /* нео */ - {{0xF0, 0xEF, 0xE5}, 36}, /* рпе */ - {{0xE5, 0xF0, 0xF8}, 36}, /* ерш */ - {{0xE8, 0xEC, 0xE8}, 36}, /* ими */ - {{0xE8, 0xE2, 0xF8}, 36}, /* ивш */ - {{0xFB, 0xEF, 0xEB}, 36}, /* ыпл */ - {{0xEF, 0xE5, 0xE2}, 36}, /* пев */ - {{0xE0, 0xE4, 0xE0}, 36}, /* ада */ - {{0xEC, 0xEE, 0xF1}, 35}, /* мос */ - {{0xEE, 0xE1, 0xF1}, 35}, /* обс */ - {{0xED, 0xE5, 0xE4}, 34}, /* нед */ - {{0xE8, 0xEA, 0xEE}, 34}, /* ико */ - {{0xF9, 0xE8, 0xEC}, 34}, /* щим */ - {{0xE4, 0xE5, 0xF0}, 34}, /* дер */ - {{0xF1, 0xEA, 0xE0}, 34}, /* ска */ - {{0xEE, 0xF0, 0xEC}, 34}, /* орм */ - {{0xF3, 0xEC, 0xE5}, 34}, /* уме */ - {{0xEE, 0xEE, 0xE1}, 34}, /* ооб */ - {{0xF0, 0xE8, 0xF1}, 34}, /* рис */ - {{0xEE, 0xE1, 0xFA}, 33}, /* объ */ - {{0xEE, 0xEB, 0xF3}, 33}, /* олу */ - {{0xFA, 0xDF, 0xE2}, 33}, /* ъяв */ - {{0xF0, 0xE5, 0xEC}, 33}, /* рем */ - {{0xF9, 0xE8, 0xF5}, 33}, /* щих */ - {{0xF3, 0xFE, 0xF9}, 33}, /* ующ */ - {{0xEA, 0xE6, 0xE5}, 33}, /* кже */ - {{0xE8, 0xE4, 0xE5}, 33}, /* иде */ - {{0xE1, 0xF1, 0xF2}, 33}, /* бст */ - {{0xE0, 0xEA, 0xE6}, 33}, /* акж */ - {{0xE2, 0xF3, 0xFE}, 33}, /* вую */ - {{0xE0, 0xF1, 0xF5}, 33}, /* асх */ - {{0xE0, 0xED, 0xE0}, 32}, /* ана */ - {{0xED, 0xE0, 0xE4}, 32}, /* над */ - {{0xEE, 0xE1, 0xE5}, 32}, /* обе */ - {{0xFB, 0xF2, 0xEA}, 32}, /* ытк */ - {{0xFD, 0xF2, 0xE8}, 32}, /* эти */ - {{0xEE, 0xE6, 0xED}, 32}, /* ожн */ - {{0xE0, 0xF2, 0xFB}, 31}, /* аты */ - {{0xF1, 0xE4, 0xE5}, 31}, /* сде */ - {{0xE0, 0xFE, 0xF2}, 31}, /* ают */ - {{0xDF, 0xF2, 0xFC}, 31}, /* ять */ - {{0xEE, 0xDF, 0xF2}, 31}, /* оят */ - {{0xE5, 0xF2, 0xFC}, 31}, /* еть */ - {{0xE0, 0xE3, 0xE5}, 31}, /* аге */ - {{0xF7, 0xF0, 0xE5}, 31}, /* чре */ - {{0xE5, 0xED, 0xFB}, 31}, /* ены */ - {{0xF3, 0xE1, 0xFB}, 31}, /* убы */ - {{0xE8, 0xF1, 0xF2}, 30}, /* ист */ - {{0xDF, 0xFE, 0xF2}, 30}, /* яют */ - {{0xF0, 0xDF, 0xE4}, 30}, /* ряд */ - {{0xE3, 0xEE, 0xF1}, 30}, /* гос */ - {{0xE8, 0xEC, 0xE0}, 30}, /* има */ - {{0xE7, 0xE0, 0xF1}, 30}, /* зас */ - {{0xE0, 0xFE, 0xF9}, 30}, /* ающ */ - {{0xEE, 0xE7, 0xE2}, 30}, /* озв */ - {{0xE5, 0xE4, 0xE8}, 30}, /* еди */ - {{0xEE, 0xEC, 0xE5}, 30}, /* оме */ - {{0xED, 0xE8, 0xE9}, 30}, /* ний */ - {{0xF1, 0xF3, 0xE4}, 30}, /* суд */ - {{0xE7, 0xE4, 0xEE}, 29}, /* здо */ - {{0xF1, 0xE2, 0xE8}, 29}, /* сви */ - {{0xEE, 0xEB, 0xE8}, 29}, /* оли */ - {{0xEE, 0xE2, 0xFC}, 29}, /* овь */ - {{0xE2, 0xE8, 0xE9}, 29}, /* вий */ - {{0xE4, 0xEE, 0xF0}, 29}, /* дор */ - {{0xE4, 0xE5, 0xDF}, 29}, /* дея */ - {{0xE5, 0xDF, 0xF2}, 29}, /* еят */ - {{0xF6, 0xEE, 0xEC}, 29}, /* цом */ - {{0xE8, 0xE7, 0xE0}, 28}, /* иза */ - {{0xF1, 0xF7, 0xE5}, 28}, /* сче */ - {{0xEA, 0xF2, 0xE0}, 28}, /* кта */ - {{0xEE, 0xE4, 0xED}, 28}, /* одн */ - {{0xE1, 0xEB, 0xE0}, 28}, /* бла */ - {{0xEE, 0xE4, 0xEB}, 28}, /* одл */ - {{0xE8, 0xF2, 0xE0}, 28}, /* ита */ - {{0x84, 0xEE, 0xE3}, 28}, /* Дог */ - {{0xEE, 0xF1, 0xEE}, 28}, /* осо */ - {{0xED, 0xEE, 0xF8}, 28}, /* нош */ - {{0xEA, 0xF3, 0xF0}, 28}, /* кур */ - {{0xE8, 0xED, 0xE0}, 28}, /* ина */ - {{0xEE, 0xF8, 0xE5}, 28}, /* оше */ - {{0xED, 0xE0, 0xEB}, 28}, /* нал */ - {{0xED, 0xE8, 0xE7}, 27}, /* низ */ - {{0xE7, 0xE2, 0xF0}, 27}, /* звр */ - {{0xE2, 0xF0, 0xE0}, 27}, /* вра */ - {{0xEB, 0xE5, 0xF2}, 27}, /* лет */ - {{0xE5, 0xF9, 0xFC}, 27}, /* ещь */ - {{0xF0, 0xE8, 0xE4}, 27}, /* рид */ - {{0xE4, 0xED, 0xEE}, 27}, /* дно */ - {{0xF0, 0xE8, 0xEE}, 27}, /* рио */ - {{0xEE, 0xE8, 0xEC}, 27}, /* оим */ - {{0xE5, 0xF0, 0xE6}, 27}, /* ерж */ - {{0xF3, 0xE2, 0xE5}, 26}, /* уве */ - {{0xEE, 0xED, 0xEA}, 26}, /* онк */ - {{0xE5, 0xEB, 0xEA}, 26}, /* елк */ - {{0xEB, 0xE0, 0xE2}, 26}, /* лав */ - {{0xE0, 0xF2, 0xEE}, 26}, /* ато */ - {{0xDF, 0xEC, 0xE8}, 26}, /* ями */ - {{0xEC, 0xEC, 0xFB}, 26}, /* ммы */ - {{0xE5, 0xF1, 0xEF}, 26}, /* есп */ - {{0xED, 0xEA, 0xF3}, 26}, /* нку */ - {{0xE8, 0xF6, 0xF3}, 25}, /* ицу */ - {{0xE4, 0xF1, 0xEA}, 25}, /* дск */ - {{0xED, 0xE8, 0xED}, 25}, /* нин */ - {{0xEF, 0xEB, 0xE5}, 25}, /* пле */ - {{0xF4, 0xEE, 0xF0}, 25}, /* фор */ - {{0xEB, 0xE0, 0xF1}, 25}, /* лас */ - {{0xE4, 0xE8, 0xEC}, 25}, /* дим */ - {{0xE5, 0xF1, 0xDF}, 25}, /* еся */ - {{0xED, 0xE8, 0xF7}, 25}, /* нич */ - {{0xEE, 0xE2, 0xF0}, 25}, /* овр */ - {{0xE2, 0xF1, 0xEB}, 25}, /* всл */ - {{0xF0, 0xF8, 0xE5}, 25}, /* рше */ - {{0xE5, 0xF9, 0xE0}, 25}, /* еща */ - {{0xE6, 0xED, 0xFB}, 25}, /* жны */ - {{0xF0, 0xE8, 0xEC}, 25}, /* рим */ - {{0xE7, 0xE0, 0xF6}, 25}, /* зац */ - {{0xE1, 0xF9, 0xE5}, 25}, /* бще */ - {{0xE0, 0xEA, 0xF2}, 25}, /* акт */ - {{0xE0, 0xE4, 0xF1}, 25}, /* адс */ - {{0xF3, 0xF7, 0xF0}, 25}, /* учр */ - {{0xF9, 0xE8, 0xE5}, 25}, /* щие */ - {{0xE6, 0xE8, 0xF2}, 24}, /* жит */ - {{0xE1, 0xF0, 0xE5}, 24}, /* бре */ - {{0xF3, 0xE3, 0xEE}, 24}, /* уго */ - {{0xE8, 0xDF, 0xF5}, 24}, /* иях */ - {{0xF2, 0xFC, 0xFE}, 24}, /* тью */ - {{0xFC, 0xF1, 0xDF}, 24}, /* ься */ - {{0xE2, 0xEE, 0xE2}, 24}, /* вов */ - {{0xEE, 0xF7, 0xED}, 24}, /* очн */ - {{0xE2, 0xEE, 0xEE}, 24}, /* воо */ - {{0xEE, 0xE4, 0xFB}, 24}, /* оды */ - {{0xEB, 0xEE, 0xE3}, 24}, /* лог */ - {{0xE2, 0xE0, 0xE5}, 24}, /* вае */ - {{0xE0, 0xDF, 0xF5}, 24}, /* аях */ - {{0xF2, 0xFC, 0xF1}, 24}, /* тьс */ - {{0xE4, 0xE8, 0xF7}, 24}, /* дич */ - {{0xEA, 0xE8, 0xF5}, 24}, /* ких */ - {{0xF6, 0xE0, 0xEC}, 24}, /* цам */ - {{0xE8, 0xE7, 0xE2}, 24}, /* изв */ - {{0xF2, 0xE8, 0xE2}, 24}, /* тив */ - {{0xE5, 0xEE, 0xE1}, 24}, /* еоб */ - {{0xF1, 0xEE, 0xF1}, 24}, /* сос */ - {{0xF8, 0xE8, 0xEC}, 24}, /* шим */ - {{0xFB, 0xEF, 0xEE}, 24}, /* ыпо */ - {{0xE5, 0xE6, 0xE0}, 24}, /* ежа */ - {{0xF2, 0xEE, 0xE8}, 24}, /* тои */ - {{0xEA, 0xF2, 0xEE}, 24}, /* кто */ - {{0xE5, 0xF7, 0xE0}, 24}, /* еча */ - {{0xE8, 0xE4, 0xE8}, 24}, /* иди */ - {{0xE1, 0xF9, 0xE8}, 23}, /* бщи */ - {{0xF2, 0xFC, 0xE5}, 23}, /* тье */ - {{0xE1, 0xFA, 0xDF}, 23}, /* бъя */ - {{0xED, 0xE0, 0xF7}, 23}, /* нач */ - {{0xF2, 0xE5, 0xF7}, 23}, /* теч */ - {{0xF3, 0xF0, 0xF1}, 23}, /* урс */ - {{0xE2, 0xE5, 0xF7}, 23}, /* веч */ - {{0xE5, 0xEC, 0xE5}, 23}, /* еме */ - {{0xEE, 0xE1, 0xF5}, 23}, /* обх */ - {{0xE1, 0xF5, 0xEE}, 23}, /* бхо */ - {{0xE4, 0xE0, 0xE5}, 23}, /* дае */ - {{0xF0, 0xE5, 0xE7}, 23}, /* рез */ - {{0xEA, 0xE0, 0xE6}, 22}, /* каж */ - {{0xEE, 0xEA, 0xF3}, 22}, /* оку */ - {{0xE0, 0xEC, 0xE5}, 22}, /* аме */ - {{0xED, 0xE5, 0xE7}, 22}, /* нез */ - {{0xFB, 0xE2, 0xE0}, 22}, /* ыва */ - {{0xF1, 0xE2, 0xDF}, 22}, /* свя */ - {{0xF0, 0xE0, 0xE4}, 22}, /* рад */ - {{0xE5, 0xE7, 0xE0}, 22}, /* еза */ - {{0xE8, 0xE2, 0xE0}, 22}, /* ива */ - {{0xEA, 0xE0, 0xEC}, 22}, /* кам */ - {{0xED, 0xE5, 0xEC}, 22}, /* нем */ - {{0xF2, 0xEA, 0xEE}, 22}, /* тко */ - {{0xE7, 0xE2, 0xE5}, 22}, /* зве */ - {{0xE2, 0xDF, 0xE7}, 22}, /* вяз */ - {{0xDF, 0xF2, 0xE8}, 22}, /* яти */ - {{0xEE, 0xF5, 0xF0}, 22}, /* охр */ - {{0xF0, 0xEE, 0xF2}, 22}, /* рот */ - {{0xEE, 0xEB, 0xE5}, 22}, /* оле */ - {{0xE1, 0xF0, 0xE0}, 22}, /* бра */ - {{0xE0, 0xE5, 0xEC}, 22}, /* аем */ - {{0xEB, 0xE0, 0xF8}, 21}, /* лаш */ - {{0xE8, 0xE7, 0xEC}, 21}, /* изм */ - {{0xE3, 0xF3, 0xF2}, 21}, /* гут */ - {{0xEE, 0xE6, 0xE4}, 21}, /* ожд */ - {{0xEA, 0xE0, 0xEA}, 21}, /* как */ - {{0xEA, 0xE0, 0xF7}, 21}, /* кач */ - {{0xED, 0xE0, 0xEC}, 21}, /* нам */ - {{0xE4, 0xEE, 0xF5}, 21}, /* дох */ - {{0xEE, 0xF5, 0xEE}, 21}, /* охо */ - {{0xFE, 0xF0, 0xE8}, 21}, /* юри */ - {{0xE2, 0xE0, 0xEC}, 21}, /* вам */ - {{0xE7, 0xEC, 0xEE}, 21}, /* змо */ - {{0xE4, 0xEA, 0xE5}, 21}, /* дке */ - {{0xE1, 0xE0, 0xED}, 21}, /* бан */ - {{0xE5, 0xEB, 0xE8}, 21}, /* ели */ - {{0xF0, 0xE8, 0xE7}, 21}, /* риз */ - {{0xEB, 0xED, 0xEE}, 21}, /* лно */ - {{0xE2, 0xFB, 0xF8}, 21}, /* выш */ - {{0xE4, 0xF6, 0xE0}, 21}, /* дца */ - {{0xDF, 0xE4, 0xEA}, 21}, /* ядк */ - {{0xEE, 0xF2, 0xF1}, 21}, /* отс */ - {{0xF2, 0xE5, 0xE9}, 21}, /* тей */ - {{0xE0, 0xED, 0xEA}, 21}, /* анк */ - {{0xED, 0xE5, 0xE3}, 21}, /* нег */ - {{0xF6, 0xE0, 0xF2}, 21}, /* цат */ - {{0xE5, 0xEC, 0xFB}, 21}, /* емы */ - {{0xE2, 0xEE, 0xE5}, 21}, /* вое */ - {{0xE4, 0xE0, 0xF7}, 21}, /* дач */ - {{0xEE, 0xE3, 0xF3}, 21}, /* огу */ - {{0xEB, 0xE6, 0xE5}, 21}, /* лже */ - {{0xF2, 0xED, 0xE8}, 21}, /* тни */ - {{0xE7, 0xE0, 0xE2}, 21}, /* зав */ - {{0xE2, 0xE5, 0xF1}, 21}, /* вес */ - {{0xF1, 0xE0, 0xEC}, 20}, /* сам */ - {{0xE0, 0xF0, 0xED}, 20}, /* арн */ - {{0xF7, 0xED, 0xFB}, 20}, /* чны */ - {{0xF1, 0xF0, 0xE5}, 20}, /* сре */ - {{0xF2, 0xE8, 0xDF}, 20}, /* тия */ - {{0xE8, 0xF1, 0xEB}, 20}, /* исл */ - {{0x91, 0xF2, 0xF0}, 20}, /* Стр */ - {{0xED, 0xF2, 0xEE}, 20}, /* нто */ - {{0xF3, 0xF2, 0xF0}, 20}, /* утр */ - {{0xE0, 0xF8, 0xE5}, 20}, /* аше */ - {{0xE5, 0xEB, 0xE0}, 20}, /* ела */ - {{0xF3, 0xE4, 0xEE}, 20}, /* удо */ - {{0xE6, 0xE8, 0xE7}, 19}, /* жиз */ - {{0xEF, 0xE8, 0xF1}, 19}, /* пис */ - {{0xE0, 0xE8, 0xEC}, 19}, /* аим */ - {{0xF7, 0xE8, 0xF1}, 19}, /* чис */ - {{0xE5, 0xE6, 0xE8}, 19}, /* ежи */ - {{0xE2, 0xF1, 0xE5}, 19}, /* все */ - {{0xEB, 0xFC, 0xEA}, 19}, /* льк */ - {{0xE0, 0xF2, 0xF3}, 19}, /* ату */ - {{0xF3, 0xE4, 0xE0}, 19}, /* уда */ - {{0xF8, 0xE8, 0xE9}, 19}, /* ший */ - {{0xE7, 0xE0, 0xF0}, 19}, /* зар */ - {{0xE5, 0xE4, 0xED}, 19}, /* едн */ - {{0xE0, 0xE2, 0xF8}, 19}, /* авш */ - {{0xF0, 0xEE, 0xE8}, 19}, /* рои */ - {{0xE8, 0xE4, 0xE0}, 19}, /* ида */ - {{0xE0, 0xF0, 0xEE}, 19}, /* аро */ - {{0xF2, 0xEE, 0xE9}, 19}, /* той */ - {{0xE6, 0xE0, 0xF9}, 19}, /* жащ */ - {{0xE5, 0xF1, 0xEE}, 19}, /* есо */ - {{0xEF, 0xE0, 0xEB}, 19}, /* пал */ - {{0xF9, 0xE0, 0xE5}, 19}, /* щае */ - {{0xF0, 0xFB, 0xE5}, 19}, /* рые */ - {{0xE5, 0xED, 0xDF}, 19}, /* еня */ - {{0xF9, 0xE8, 0xE9}, 19}, /* щий */ - {{0xEB, 0xF3, 0xE3}, 19}, /* луг */ - {{0xFE, 0xF7, 0xE8}, 18}, /* ючи */ - {{0xF3, 0xEB, 0xFC}, 18}, /* уль */ - {{0xEC, 0xFB, 0xF5}, 18}, /* мых */ - {{0xF0, 0xEE, 0xE3}, 18}, /* рог */ - {{0xF1, 0xEE, 0xF5}, 18}, /* сох */ - {{0xEA, 0xEE, 0xE5}, 18}, /* кое */ - {{0xED, 0xF2, 0xF1}, 18}, /* нтс */ - {{0xE0, 0xE7, 0xED}, 18}, /* азн */ - {{0xF2, 0xED, 0xFB}, 18}, /* тны */ - {{0xEE, 0xE4, 0xDF}, 18}, /* одя */ - {{0xEE, 0xE1, 0xED}, 18}, /* обн */ - {{0xE2, 0xFB, 0xE4}, 18}, /* выд */ - {{0xEE, 0xF1, 0xDF}, 18}, /* ося */ - {{0xFC, 0xF2, 0xE0}, 18}, /* ьта */ - {{0xED, 0xDF, 0xFE}, 18}, /* няю */ - {{0xED, 0xE0, 0xF0}, 18}, /* нар */ - {{0xE5, 0xE7, 0xF3}, 18}, /* езу */ - {{0xE0, 0xF1, 0xED}, 18}, /* асн */ - {{0xE7, 0xF3, 0xEB}, 18}, /* зул */ - {{0xF6, 0xE8, 0xEF}, 18}, /* цип */ - {{0xEA, 0xF2, 0xE5}, 18}, /* кте */ - {{0xE4, 0xEE, 0xEF}, 18}, /* доп */ - {{0xED, 0xF6, 0xE8}, 18}, /* нци */ - {{0xF1, 0xEF, 0xE5}, 18}, /* спе */ - {{0xE8, 0xEC, 0xFB}, 18}, /* имы */ - {{0xEC, 0xEE, 0xEC}, 18}, /* мом */ - {{0xEF, 0xE5, 0xF7}, 18}, /* печ */ - {{0x8E, 0xE1, 0xDF}, 18}, /* Обя */ - {{0x8F, 0xF0, 0xE0}, 18}, /* Пра */ - {{0xEE, 0xEB, 0xEE}, 18}, /* оло */ - {{0xF2, 0xF1, 0xEA}, 18}, /* тск */ - {{0xEB, 0xED, 0xE8}, 18}, /* лни */ - {{0xE5, 0xF0, 0xF2}, 18}, /* ерт */ - {{0xE8, 0xF1, 0xFC}, 18}, /* ись */ - {{0xEB, 0xFC, 0xF2}, 18}, /* льт */ - {{0xF1, 0xF3, 0xF2}, 18}, /* сут */ - {{0xE2, 0xEE, 0xE1}, 17}, /* воб */ - {{0xF0, 0xED, 0xFB}, 17}, /* рны */ - {{0xE1, 0xED, 0xFB}, 17}, /* бны */ - {{0xFB, 0xE4, 0xE0}, 17}, /* ыда */ - {{0xFC, 0xE7, 0xF3}, 17}, /* ьзу */ - {{0xE5, 0xE4, 0xEF}, 17}, /* едп */ - {{0xE0, 0xE4, 0xE5}, 17}, /* аде */ - {{0xE8, 0xEF, 0xE0}, 17}, /* ипа */ - {{0xF1, 0xE5, 0xE9}, 17}, /* сей */ - {{0xE5, 0xE5, 0xF1}, 17}, /* еес */ - {{0xEE, 0xE8, 0xE7}, 17}, /* оиз */ - {{0xEE, 0xF1, 0xE2}, 17}, /* осв */ - {{0xE4, 0xE8, 0xE2}, 17}, /* див */ - {{0xED, 0xE0, 0xED}, 17}, /* нан */ - {{0xE5, 0xF2, 0xE0}, 17}, /* ета */ - {{0xE4, 0xED, 0xE5}, 17}, /* дне */ - {{0xE8, 0xEE, 0xE1}, 17}, /* иоб */ - {{0xF3, 0xE5, 0xF2}, 17}, /* ует */ - {{0xED, 0xE0, 0xF5}, 17}, /* нах */ - {{0xF1, 0xEC, 0xE5}, 17}, /* сме */ - {{0xE0, 0xEB, 0xE8}, 17}, /* али */ - {{0xE1, 0xFA, 0xE5}, 17}, /* бъе */ - {{0xEF, 0xE0, 0xF1}, 17}, /* пас */ - {{0xE7, 0xE0, 0xEB}, 17}, /* зал */ - {{0xF0, 0xE6, 0xE0}, 16}, /* ржа */ - {{0xDF, 0xE2, 0xE8}, 16}, /* яви */ - {{0xE6, 0xE0, 0xF2}, 16}, /* жат */ - {{0xE1, 0xEE, 0xE6}, 16}, /* бож */ - {{0xF1, 0xE8, 0xEB}, 16}, /* сил */ - {{0xED, 0xF3, 0xFE}, 16}, /* ную */ - {{0xEF, 0xE5, 0xED}, 16}, /* пен */ - {{0xEC, 0xE0, 0xF2}, 16}, /* мат */ - {{0xEE, 0xED, 0xED}, 16}, /* онн */ - {{0xE2, 0xE8, 0xED}, 16}, /* вин */ - {{0xF2, 0xEA, 0xE8}, 16}, /* тки */ - {{0xF2, 0xEE, 0xF7}, 16}, /* точ */ - {{0xF1, 0xF7, 0xE8}, 16}, /* счи */ - {{0xED, 0xE8, 0xF6}, 16}, /* ниц */ - {{0xF9, 0xE5, 0xE5}, 16}, /* щее */ - {{0xE1, 0xE5, 0xF1}, 16}, /* бес */ - {{0xE0, 0xE4, 0xF6}, 16}, /* адц */ - {{0x8A, 0xEE, 0xEC}, 16}, /* Ком */ - {{0xFC, 0xE8, 0xEC}, 16}, /* ьим */ - {{0xF3, 0xF2, 0xF1}, 16}, /* утс */ - {{0xE0, 0xF7, 0xE8}, 16}, /* ачи */ - {{0xEF, 0xEE, 0xED}, 16}, /* пон */ - {{0xEA, 0xE0, 0xE5}, 16}, /* кае */ - {{0xE8, 0xE3, 0xF0}, 16}, /* игр */ - {{0xE0, 0xEA, 0xE8}, 16}, /* аки */ - {{0xE0, 0xF9, 0xE8}, 16}, /* ащи */ - {{0xEB, 0xFC, 0xF6}, 16}, /* льц */ - {{0xE2, 0xED, 0xEE}, 16}, /* вно */ - {{0xFB, 0xF8, 0xE5}, 15}, /* ыше */ - {{0x8B, 0xE8, 0xF6}, 15}, /* Лиц */ - {{0xFC, 0xE5, 0xE9}, 15}, /* ьей */ - {{0xF8, 0xE5, 0xEC}, 15}, /* шем */ - {{0xF3, 0xE1, 0xEB}, 15}, /* убл */ - {{0xF0, 0xE0, 0xF6}, 15}, /* рац */ - {{0xEA, 0xF3, 0xEC}, 15}, /* кум */ - {{0xF0, 0xE5, 0xE3}, 15}, /* рег */ - {{0xEE, 0xEF, 0xE0}, 15}, /* опа */ - {{0x82, 0xEE, 0xE7}, 15}, /* Воз */ - {{0xF2, 0xE0, 0xE5}, 15}, /* тае */ - {{0xEE, 0xE1, 0xFB}, 15}, /* обы */ - {{0xE1, 0xEB, 0xE8}, 15}, /* бли */ - {{0xF0, 0xEC, 0xE5}, 15}, /* рме */ - {{0xE2, 0xEE, 0xF1}, 15}, /* вос */ - {{0xE0, 0xF1, 0xE8}, 15}, /* аси */ - {{0xF2, 0xE0, 0xEC}, 15}, /* там */ - {{0xFC, 0xEC, 0xE5}, 15}, /* ьме */ - {{0xEE, 0xE3, 0xE0}, 15}, /* ога */ - {{0xE8, 0xEB, 0xEE}, 15}, /* ило */ - {{0xF1, 0xFC, 0xEC}, 15}, /* сьм */ - {{0xF0, 0xF2, 0xE8}, 15}, /* рти */ - {{0xF2, 0xF1, 0xF3}, 15}, /* тсу */ - {{0xF1, 0xE5, 0xED}, 15}, /* сен */ - {{0xF2, 0xE0, 0xEB}, 15}, /* тал */ - {{0xE4, 0xE0, 0xF0}, 15}, /* дар */ - {{0xE0, 0xEC, 0xEE}, 15}, /* амо */ - {{0xE5, 0xE4, 0xEB}, 15}, /* едл */ - {{0xF1, 0xF3, 0xE1}, 15}, /* суб */ - {{0xE5, 0xE9, 0xF4}, 15}, /* ейф */ - {{0x95, 0xF0, 0xE0}, 15}, /* Хра */ - {{0xEB, 0xE0, 0xEC}, 14}, /* лам */ - {{0xE0, 0xF0, 0xF3}, 14}, /* ару */ - {{0xE3, 0xE8, 0xF5}, 14}, /* гих */ - {{0xF6, 0xE8, 0xDF}, 14}, /* ция */ - {{0xE4, 0xE0, 0xE2}, 14}, /* дав */ - {{0xEB, 0xE8, 0xF8}, 14}, /* лиш */ - {{0xFE, 0xF7, 0xE0}, 14}, /* юча */ - {{0xE0, 0xED, 0xF1}, 14}, /* анс */ - {{0xEE, 0xE3, 0xF0}, 14}, /* огр */ - {{0xE8, 0xF9, 0xE0}, 14}, /* ища */ - {{0xE5, 0xED, 0xFC}, 14}, /* ень */ - {{0xEE, 0xF2, 0xE8}, 14}, /* оти */ - {{0xE0, 0xE4, 0xFB}, 13}, /* ады */ - {{0xE0, 0xF9, 0xE0}, 13}, /* аща */ - {{0xE2, 0xEE, 0xE8}, 13}, /* вои */ - {{0xE2, 0xFB, 0xEC}, 13}, /* вым */ - {{0xE2, 0xFC, 0xDF}, 13}, /* вья */ - {{0xEA, 0xE8, 0xE5}, 13}, /* кие */ - {{0xEB, 0xE8, 0xF1}, 13}, /* лис */ - {{0xEC, 0xE5, 0xE4}, 13}, /* мед */ - {{0xF2, 0xE8, 0xF5}, 13}, /* тих */ - {{0xE5, 0xF2, 0xEE}, 13}, /* ето */ - {{0xE7, 0xEB, 0xEE}, 13}, /* зло */ - {{0xEE, 0xEF, 0xE5}, 13}, /* опе */ - {{0xF1, 0xE8, 0xEC}, 13}, /* сим */ - {{0xDF, 0xE7, 0xE8}, 13}, /* язи */ - {{0xE8, 0xED, 0xE4}, 13}, /* инд */ - {{0xF7, 0xF3, 0xE6}, 13}, /* чуж */ - {{0xEB, 0xEA, 0xE8}, 13}, /* лки */ - {{0xE4, 0xEF, 0xF0}, 13}, /* дпр */ - {{0xED, 0xE4, 0xE8}, 13}, /* нди */ - {{0xEE, 0xF2, 0xE0}, 13}, /* ота */ - {{0xEE, 0xF2, 0xFB}, 13}, /* оты */ - {{0xEB, 0xE0, 0xF7}, 13}, /* лач */ - {{0xEA, 0xE8, 0xEC}, 13}, /* ким */ - {{0xE8, 0xF1, 0xE8}, 13}, /* иси */ - {{0xE2, 0xE0, 0xEB}, 13}, /* вал */ - {{0xE5, 0xEC, 0xEE}, 13}, /* емо */ - {{0xEF, 0xF3, 0xE1}, 13}, /* пуб */ - {{0xDF, 0xE5, 0xEC}, 13}, /* яем */ - {{0xE1, 0xEE, 0xEB}, 13}, /* бол */ - {{0xED, 0xF2, 0xF3}, 13}, /* нту */ - {{0xED, 0xE5, 0xE9}, 13}, /* ней */ - {{0xED, 0xE0, 0xDF}, 13}, /* ная */ - {{0xE5, 0xF1, 0xE0}, 13}, /* еса */ - {{0xF0, 0xED, 0xEE}, 13}, /* рно */ - {{0xF9, 0xE5, 0xEC}, 13}, /* щем */ - {{0xE0, 0xED, 0xFB}, 13}, /* аны */ - {{0x84, 0xEE, 0xE2}, 13}, /* Дов */ - {{0xF7, 0xE8, 0xE2}, 13}, /* чив */ - {{0xE2, 0xE8, 0xF1}, 13}, /* вис */ - {{0xEE, 0xEF, 0xEE}, 13}, /* опо */ - {{0xE2, 0xFC, 0xFE}, 13}, /* вью */ - {{0xE0, 0xEB, 0xE0}, 13}, /* ала */ - {{0xEB, 0xE5, 0xE9}, 12}, /* лей */ - {{0xE0, 0xF7, 0xE0}, 12}, /* ача */ - {{0xE5, 0xE7, 0xE2}, 12}, /* езв */ - {{0xE2, 0xE0, 0xDF}, 12}, /* вая */ - {{0xE5, 0xEE, 0xF1}, 12}, /* еос */ - {{0xDF, 0xF9, 0xE8}, 12}, /* ящи */ - {{0xE8, 0xE2, 0xE8}, 12}, /* иви */ - {{0xED, 0xE5, 0xE5}, 12}, /* нее */ - {{0xF2, 0xF0, 0xF3}, 12}, /* тру */ - {{0xF8, 0xE5, 0xE5}, 12}, /* шее */ - {{0xF1, 0xE0, 0xF5}, 12}, /* сах */ - {{0xE8, 0xED, 0xF6}, 12}, /* инц */ - {{0xEE, 0xEC, 0xEF}, 12}, /* омп */ - {{0xF3, 0xE6, 0xEE}, 12}, /* ужо */ - {{0xF3, 0xE0, 0xEB}, 12}, /* уал */ - {{0xED, 0xE0, 0xF2}, 12}, /* нат */ - {{0xE8, 0xE4, 0xF3}, 12}, /* иду */ - {{0xE2, 0xEB, 0xE0}, 12}, /* вла */ - {{0xE7, 0xE2, 0xE0}, 12}, /* зва */ - {{0xEB, 0xE5, 0xE5}, 12}, /* лее */ - {{0xF0, 0xE5, 0xF5}, 12}, /* рех */ - {{0xE6, 0xE4, 0xF3}, 12}, /* жду */ - {{0xEC, 0xE0, 0xEB}, 12}, /* мал */ - {{0xE5, 0xED, 0xF1}, 12}, /* енс */ - {{0xE8, 0xE9, 0xF1}, 12}, /* ийс */ - {{0xEA, 0xEE, 0xEB}, 12}, /* кол */ - {{0xED, 0xE0, 0xE7}, 12}, /* наз */ - {{0xE4, 0xF3, 0xE0}, 12}, /* дуа */ - {{0xEE, 0xED, 0xE8}, 12}, /* они */ - {{0xF1, 0xE5, 0xEC}, 12}, /* сем */ - {{0xE3, 0xEE, 0xE4}, 12}, /* год */ - {{0xEC, 0xE5, 0xE6}, 12}, /* меж */ - {{0xEE, 0xE7, 0xEB}, 12}, /* озл */ - {{0xE2, 0xEC, 0xE5}, 12}, /* вме */ - {{0xF3, 0xE4, 0xE5}, 12}, /* уде */ - {{0xFC, 0xEA, 0xEE}, 12}, /* ько */ - {{0xE5, 0xE2, 0xFB}, 12}, /* евы */ - {{0xE7, 0xE0, 0xEC}, 12}, /* зам */ - {{0xF1, 0xEE, 0xE4}, 12}, /* сод */ - {{0xF0, 0xEE, 0xE5}, 11}, /* рое */ - {{0xEE, 0xF2, 0xE4}, 11}, /* отд */ - {{0xF1, 0xE8, 0xDF}, 11}, /* сия */ - {{0xE8, 0xEA, 0xF3}, 11}, /* ику */ - {{0xFB, 0xEB, 0xE8}, 11}, /* ыли */ - {{0xE3, 0xE8, 0xEC}, 11}, /* гим */ - {{0xED, 0xFC, 0xF8}, 11}, /* ньш */ - {{0xF2, 0xE8, 0xF7}, 11}, /* тич */ - {{0xF0, 0xE0, 0xEB}, 11}, /* рал */ - {{0xF3, 0xF7, 0xE8}, 11}, /* учи */ - {{0xEC, 0xE5, 0xFE}, 11}, /* мею */ - {{0xF2, 0xE5, 0xEA}, 11}, /* тек */ - {{0xEE, 0xE1, 0xF3}, 11}, /* обу */ - {{0xED, 0xED, 0xF3}, 11}, /* нну */ - {{0xED, 0xE5, 0xEF}, 11}, /* неп */ - {{0xE2, 0xE5, 0xEB}, 11}, /* вел */ - {{0xF2, 0xEC, 0xE5}, 11}, /* тме */ - {{0xE1, 0xEE, 0xE3}, 11}, /* бог */ - {{0xEE, 0xF0, 0xE8}, 11}, /* ори */ - {{0xE0, 0xE2, 0xED}, 11}, /* авн */ - {{0xE4, 0xE5, 0xE5}, 11}, /* дее */ - {{0xE6, 0xEE, 0xEC}, 11}, /* жом */ - {{0x82, 0xF0, 0xE5}, 11}, /* Вре */ - {{0xEC, 0xFB, 0xE5}, 11}, /* мые */ - {{0xFC, 0xF6, 0xE0}, 11}, /* ьца */ - {{0xEE, 0xF6, 0xE5}, 11}, /* оце */ - {{0xE8, 0xF2, 0xFB}, 10}, /* иты */ - {{0xE7, 0xF0, 0xE0}, 10}, /* зра */ - {{0xEE, 0xED, 0xFB}, 10}, /* оны */ - {{0xF0, 0xE5, 0xF8}, 10}, /* реш */ - {{0xF3, 0xF8, 0xE5}, 10}, /* уше */ - {{0xF0, 0xE5, 0xE2}, 10}, /* рев */ - {{0xEE, 0xEF, 0xF3}, 10}, /* опу */ - {{0xDF, 0xF2, 0xFB}, 10}, /* яты */ - {{0xF2, 0xE0, 0xF7}, 10}, /* тач */ - {{0xE5, 0xF0, 0xEE}, 10}, /* еро */ - {{0xE2, 0xEA, 0xEB}, 10}, /* вкл */ - {{0xE7, 0xFB, 0xE2}, 10}, /* зыв */ - {{0xE0, 0xEF, 0xF0}, 10}, /* апр */ - {{0xF0, 0xF3, 0xF8}, 10}, /* руш */ - {{0x8E, 0xF2, 0xE2}, 10}, /* Отв */ - {{0xF0, 0xF1, 0xE0}, 10}, /* рса */ - {{0xE5, 0xEA, 0xF2}, 10}, /* ект */ - {{0xEB, 0xE5, 0xEA}, 10}, /* лек */ - {{0xE5, 0xE5, 0xF2}, 10}, /* еет */ - {{0xEE, 0xEF, 0xEB}, 10}, /* опл */ - {{0xF2, 0xF7, 0xE5}, 10}, /* тче */ - {{0xE3, 0xEE, 0xEC}, 10}, /* гом */ - {{0xF2, 0xEE, 0xE6}, 10}, /* тож */ - {{0xEB, 0xE5, 0xF7}, 10}, /* леч */ - {{0xE5, 0xF2, 0xFB}, 10}, /* еты */ - {{0xEE, 0xE6, 0xE8}, 10}, /* ожи */ - {{0xEC, 0xED, 0xEE}, 10}, /* мно */ - {{0xEC, 0xEE, 0xE9}, 10}, /* мой */ - {{0xF6, 0xE5, 0xEB}, 10}, /* цел */ - {{0xF3, 0xEF, 0xE8}, 10}, /* упи */ - {{0xE0, 0xE5, 0xE2}, 10}, /* аев */ - {{0xEF, 0xEE, 0xEC}, 10}, /* пом */ - {{0xE4, 0xDF, 0xF9}, 10}, /* дящ */ - {{0xF2, 0xF0, 0xE8}, 10}, /* три */ - {{0xF8, 0xE8, 0xE5}, 10}, /* шие */ - {{0xE5, 0xEA, 0xE0}, 10}, /* ека */ - {{0xE5, 0xF8, 0xE5}, 10}, /* еше */ - {{0xE7, 0xE0, 0xE8}, 10}, /* заи */ - {{0xE8, 0xF2, 0xEE}, 10}, /* ито */ - {{0xE7, 0xED, 0xFB}, 10}, /* зны */ - {{0xEE, 0xDF, 0xED}, 10}, /* оян */ - {{0xE8, 0xE6, 0xE5}, 10}, /* иже */ - {{0xE2, 0xED, 0xE5}, 10}, /* вне */ - {{0xF0, 0xF1, 0xF2}, 10}, /* рст */ - {{0xE5, 0xEC, 0xDF}, 10}, /* емя */ - {{0xED, 0xE0, 0xE8}, 10}, /* наи */ - {{0xF2, 0xEE, 0xEB}, 10}, /* тол */ - {{0xEB, 0xE8, 0xF2}, 10}, /* лит */ - {{0xEE, 0xF1, 0xF0}, 10}, /* оср */ - {{0xF2, 0xE4, 0xE5}, 10}, /* тде */ - {{0xE5, 0xEC, 0xE8}, 10}, /* еми */ - {{0xEC, 0xE5, 0xE5}, 10}, /* мее */ - {{0xF0, 0xFB, 0xF5}, 10}, /* рых */ - {{0xED, 0xE8, 0xE2}, 10}, /* нив */ - {{0xE5, 0xF0, 0xF3}, 10}, /* еру */ - {{0xF7, 0xE5, 0xEC}, 10}, /* чем */ - {{0xE4, 0xEE, 0xE1}, 10}, /* доб */ - {{0xE5, 0xEB, 0xEE}, 10}, /* ело */ - {{0xE8, 0xEB, 0xF3}, 10}, /* илу */ - {{0xE0, 0xE4, 0xEB}, 10}, /* адл */ - {{0xE8, 0xF7, 0xF2}, 10}, /* ичт */ - {{0xEC, 0xEB, 0xE5}, 10}, /* мле */ -}; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_ENCODING_DETECT_RESOURCE_H */ diff --git a/include/myhtml/encoding_resource.h b/include/myhtml/encoding_resource.h deleted file mode 100644 index 6ec72e2..0000000 --- a/include/myhtml/encoding_resource.h +++ /dev/null @@ -1,9330 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include - -#ifndef MyHTML_ENCODING_RESOURCE_H -#define MyHTML_ENCODING_RESOURCE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -static const unsigned long myhtml_encoding_map_big5[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 17392, 19506, 17923, 17830, 17784, 160359, 19831, 17843, - 162993, 19682, 163013, 15253, 18230, 18244, 19527, 19520, 148159, 144919, - 160594, 159371, 159954, 19543, 172881, 18255, 17882, 19589, 162924, 19719, - 19108, 18081, 158499, 29221, 154196, 137827, 146950, 147297, 26189, 22267, - 0x0000, 32149, 22813, 166841, 15860, 38708, 162799, 23515, 138590, 23204, - 13861, 171696, 23249, 23479, 23804, 26478, 34195, 170309, 29793, 29853, - 14453, 138579, 145054, 155681, 16108, 153822, 15093, 31484, 40855, 147809, - 166157, 143850, 133770, 143966, 17162, 33924, 40854, 37935, 18736, 34323, - 22678, 38730, 37400, 31184, 31282, 26208, 27177, 34973, 29772, 31685, - 26498, 31276, 21071, 36934, 13542, 29636, 155065, 29894, 40903, 22451, - 18735, 21580, 16689, 145038, 22552, 31346, 162661, 35727, 18094, 159368, - 16769, 155033, 31662, 140476, 40904, 140481, 140489, 140492, 40905, 34052, - 144827, 16564, 40906, 17633, 175615, 25281, 28782, 40907, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12736, - 12737, 12738, 12739, 12740, 131340, 12741, 131281, 131277, 12742, 12743, - 131275, 139240, 12744, 131274, 12745, 12746, 12747, 12748, 131342, 12749, - 12750, 256, 193, 461, 192, 274, 201, 282, 200, 332, - 211, 465, 210, 0x0000, 7870, 0x0000, 7872, 202, 257, 225, - 462, 224, 593, 275, 233, 283, 232, 299, 237, 464, - 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, - 472, 474, 476, 252, 0x0000, 7871, 0x0000, 7873, 234, 609, - 9178, 9179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 172969, 135493, 0x0000, 25866, - 0x0000, 0x0000, 20029, 28381, 40270, 37343, 0x0000, 0x0000, 161589, 25745, - 20250, 20264, 20392, 20822, 20852, 20892, 20964, 21153, 21160, 21307, - 21326, 21457, 21464, 22242, 22768, 22788, 22791, 22834, 22836, 23398, - 23454, 23455, 23706, 24198, 24635, 25993, 26622, 26628, 26725, 27982, - 28860, 30005, 32420, 32428, 32442, 32455, 32463, 32479, 32518, 32567, - 33402, 33487, 33647, 35270, 35774, 35810, 36710, 36711, 36718, 29713, - 31996, 32205, 26950, 31433, 21031, 0x0000, 0x0000, 0x0000, 0x0000, 37260, - 30904, 37214, 32956, 0x0000, 36107, 33014, 133607, 0x0000, 0x0000, 32927, - 40647, 19661, 40393, 40460, 19518, 171510, 159758, 40458, 172339, 13761, - 0x0000, 28314, 33342, 29977, 0x0000, 18705, 39532, 39567, 40857, 31111, - 164972, 138698, 132560, 142054, 20004, 20097, 20096, 20103, 20159, 20203, - 20279, 13388, 20413, 15944, 20483, 20616, 13437, 13459, 13477, 20870, - 22789, 20955, 20988, 20997, 20105, 21113, 21136, 21287, 13767, 21417, - 13649, 21424, 13651, 21442, 21539, 13677, 13682, 13953, 21651, 21667, - 21684, 21689, 21712, 21743, 21784, 21795, 21800, 13720, 21823, 13733, - 13759, 21975, 13765, 163204, 21797, 0x0000, 134210, 134421, 151851, 21904, - 142534, 14828, 131905, 36422, 150968, 169189, 16467, 164030, 30586, 142392, - 14900, 18389, 164189, 158194, 151018, 25821, 134524, 135092, 134357, 135412, - 25741, 36478, 134806, 134155, 135012, 142505, 164438, 148691, 0x0000, 134470, - 170573, 164073, 18420, 151207, 142530, 39602, 14951, 169460, 16365, 13574, - 152263, 169940, 161992, 142660, 40302, 38933, 0x0000, 17369, 155813, 25780, - 21731, 142668, 142282, 135287, 14843, 135279, 157402, 157462, 162208, 25834, - 151634, 134211, 36456, 139681, 166732, 132913, 0x0000, 18443, 131497, 16378, - 22643, 142733, 0x0000, 148936, 132348, 155799, 134988, 134550, 21881, 16571, - 17338, 0x0000, 19124, 141926, 135325, 33194, 39157, 134556, 25465, 14846, - 141173, 36288, 22177, 25724, 15939, 0x0000, 173569, 134665, 142031, 142537, - 0x0000, 135368, 145858, 14738, 14854, 164507, 13688, 155209, 139463, 22098, - 134961, 142514, 169760, 13500, 27709, 151099, 0x0000, 0x0000, 161140, 142987, - 139784, 173659, 167117, 134778, 134196, 157724, 32659, 135375, 141315, 141625, - 13819, 152035, 134796, 135053, 134826, 16275, 134960, 134471, 135503, 134732, - 0x0000, 134827, 134057, 134472, 135360, 135485, 16377, 140950, 25650, 135085, - 144372, 161337, 142286, 134526, 134527, 142417, 142421, 14872, 134808, 135367, - 134958, 173618, 158544, 167122, 167321, 167114, 38314, 21708, 33476, 21945, - 0x0000, 171715, 39974, 39606, 161630, 142830, 28992, 33133, 33004, 23580, - 157042, 33076, 14231, 21343, 164029, 37302, 134906, 134671, 134775, 134907, - 13789, 151019, 13833, 134358, 22191, 141237, 135369, 134672, 134776, 135288, - 135496, 164359, 136277, 134777, 151120, 142756, 23124, 135197, 135198, 135413, - 135414, 22428, 134673, 161428, 164557, 135093, 134779, 151934, 14083, 135094, - 135552, 152280, 172733, 149978, 137274, 147831, 164476, 22681, 21096, 13850, - 153405, 31666, 23400, 18432, 19244, 40743, 18919, 39967, 39821, 154484, - 143677, 22011, 13810, 22153, 20008, 22786, 138177, 194680, 38737, 131206, - 20059, 20155, 13630, 23587, 24401, 24516, 14586, 25164, 25909, 27514, - 27701, 27706, 28780, 29227, 20012, 29357, 149737, 32594, 31035, 31993, - 32595, 156266, 13505, 0x0000, 156491, 32770, 32896, 157202, 158033, 21341, - 34916, 35265, 161970, 35744, 36125, 38021, 38264, 38271, 38376, 167439, - 38886, 39029, 39118, 39134, 39267, 170000, 40060, 40479, 40644, 27503, - 63751, 20023, 131207, 38429, 25143, 38050, 0x0000, 20539, 28158, 171123, - 40870, 15817, 34959, 147790, 28791, 23797, 19232, 152013, 13657, 154928, - 24866, 166450, 36775, 37366, 29073, 26393, 29626, 144001, 172295, 15499, - 137600, 19216, 30948, 29698, 20910, 165647, 16393, 27235, 172730, 16931, - 34319, 133743, 31274, 170311, 166634, 38741, 28749, 21284, 139390, 37876, - 30425, 166371, 40871, 30685, 20131, 20464, 20668, 20015, 20247, 40872, - 21556, 32139, 22674, 22736, 138678, 24210, 24217, 24514, 141074, 25995, - 144377, 26905, 27203, 146531, 27903, 0x0000, 29184, 148741, 29580, 16091, - 150035, 23317, 29881, 35715, 154788, 153237, 31379, 31724, 31939, 32364, - 33528, 34199, 40873, 34960, 40874, 36537, 40875, 36815, 34143, 39392, - 37409, 40876, 167353, 136255, 16497, 17058, 23066, 0x0000, 0x0000, 0x0000, - 39016, 26475, 17014, 22333, 0x0000, 34262, 149883, 33471, 160013, 19585, - 159092, 23931, 158485, 159678, 40877, 40878, 23446, 40879, 26343, 32347, - 28247, 31178, 15752, 17603, 143958, 141206, 17306, 17718, 0x0000, 23765, - 146202, 35577, 23672, 15634, 144721, 23928, 40882, 29015, 17752, 147692, - 138787, 19575, 14712, 13386, 131492, 158785, 35532, 20404, 131641, 22975, - 33132, 38998, 170234, 24379, 134047, 0x0000, 139713, 166253, 16642, 18107, - 168057, 16135, 40883, 172469, 16632, 14294, 18167, 158790, 16764, 165554, - 160767, 17773, 14548, 152730, 17761, 17691, 19849, 19579, 19830, 17898, - 16328, 150287, 13921, 17630, 17597, 16877, 23870, 23880, 23894, 15868, - 14351, 23972, 23993, 14368, 14392, 24130, 24253, 24357, 24451, 14600, - 14612, 14655, 14669, 24791, 24893, 23781, 14729, 25015, 25017, 25039, - 14776, 25132, 25232, 25317, 25368, 14840, 22193, 14851, 25570, 25595, - 25607, 25690, 14923, 25792, 23829, 22049, 40863, 14999, 25990, 15037, - 26111, 26195, 15090, 26258, 15138, 26390, 15170, 26532, 26624, 15192, - 26698, 26756, 15218, 15217, 15227, 26889, 26947, 29276, 26980, 27039, - 27013, 15292, 27094, 15325, 27237, 27252, 27249, 27266, 15340, 27289, - 15346, 27307, 27317, 27348, 27382, 27521, 27585, 27626, 27765, 27818, - 15563, 27906, 27910, 27942, 28033, 15599, 28068, 28081, 28181, 28184, - 28201, 28294, 166336, 28347, 28386, 28378, 40831, 28392, 28393, 28452, - 28468, 15686, 147265, 28545, 28606, 15722, 15733, 29111, 23705, 15754, - 28716, 15761, 28752, 28756, 28783, 28799, 28809, 131877, 17345, 13809, - 134872, 147159, 22462, 159443, 28990, 153568, 13902, 27042, 166889, 23412, - 31305, 153825, 169177, 31333, 31357, 154028, 31419, 31408, 31426, 31427, - 29137, 156813, 16842, 31450, 31453, 31466, 16879, 21682, 154625, 31499, - 31573, 31529, 152334, 154878, 31650, 31599, 33692, 154548, 158847, 31696, - 33825, 31634, 31672, 154912, 15789, 154725, 33938, 31738, 31750, 31797, - 154817, 31812, 31875, 149634, 31910, 26237, 148856, 31945, 31943, 31974, - 31860, 31987, 31989, 31950, 32359, 17693, 159300, 32093, 159446, 29837, - 32137, 32171, 28981, 32179, 32210, 147543, 155689, 32228, 15635, 32245, - 137209, 32229, 164717, 32285, 155937, 155994, 32366, 32402, 17195, 37996, - 32295, 32576, 32577, 32583, 31030, 156368, 39393, 32663, 156497, 32675, - 136801, 131176, 17756, 145254, 17667, 164666, 32762, 156809, 32773, 32776, - 32797, 32808, 32815, 172167, 158915, 32827, 32828, 32865, 141076, 18825, - 157222, 146915, 157416, 26405, 32935, 166472, 33031, 33050, 22704, 141046, - 27775, 156824, 151480, 25831, 136330, 33304, 137310, 27219, 150117, 150165, - 17530, 33321, 133901, 158290, 146814, 20473, 136445, 34018, 33634, 158474, - 149927, 144688, 137075, 146936, 33450, 26907, 194964, 16859, 34123, 33488, - 33562, 134678, 137140, 14017, 143741, 144730, 33403, 33506, 33560, 147083, - 159139, 158469, 158615, 144846, 15807, 33565, 21996, 33669, 17675, 159141, - 33708, 33729, 33747, 13438, 159444, 27223, 34138, 13462, 159298, 143087, - 33880, 154596, 33905, 15827, 17636, 27303, 33866, 146613, 31064, 33960, - 158614, 159351, 159299, 34014, 33807, 33681, 17568, 33939, 34020, 154769, - 16960, 154816, 17731, 34100, 23282, 159385, 17703, 34163, 17686, 26559, - 34326, 165413, 165435, 34241, 159880, 34306, 136578, 159949, 194994, 17770, - 34344, 13896, 137378, 21495, 160666, 34430, 34673, 172280, 34798, 142375, - 34737, 34778, 34831, 22113, 34412, 26710, 17935, 34885, 34886, 161248, - 146873, 161252, 34910, 34972, 18011, 34996, 34997, 25537, 35013, 30583, - 161551, 35207, 35210, 35238, 35241, 35239, 35260, 166437, 35303, 162084, - 162493, 35484, 30611, 37374, 35472, 162393, 31465, 162618, 147343, 18195, - 162616, 29052, 35596, 35615, 152624, 152933, 35647, 35660, 35661, 35497, - 150138, 35728, 35739, 35503, 136927, 17941, 34895, 35995, 163156, 163215, - 195028, 14117, 163155, 36054, 163224, 163261, 36114, 36099, 137488, 36059, - 28764, 36113, 150729, 16080, 36215, 36265, 163842, 135188, 149898, 15228, - 164284, 160012, 31463, 36525, 36534, 36547, 37588, 36633, 36653, 164709, - 164882, 36773, 37635, 172703, 133712, 36787, 18730, 166366, 165181, 146875, - 24312, 143970, 36857, 172052, 165564, 165121, 140069, 14720, 159447, 36919, - 165180, 162494, 36961, 165228, 165387, 37032, 165651, 37060, 165606, 37038, - 37117, 37223, 15088, 37289, 37316, 31916, 166195, 138889, 37390, 27807, - 37441, 37474, 153017, 37561, 166598, 146587, 166668, 153051, 134449, 37676, - 37739, 166625, 166891, 28815, 23235, 166626, 166629, 18789, 37444, 166892, - 166969, 166911, 37747, 37979, 36540, 38277, 38310, 37926, 38304, 28662, - 17081, 140922, 165592, 135804, 146990, 18911, 27676, 38523, 38550, 16748, - 38563, 159445, 25050, 38582, 30965, 166624, 38589, 21452, 18849, 158904, - 131700, 156688, 168111, 168165, 150225, 137493, 144138, 38705, 34370, 38710, - 18959, 17725, 17797, 150249, 28789, 23361, 38683, 38748, 168405, 38743, - 23370, 168427, 38751, 37925, 20688, 143543, 143548, 38793, 38815, 38833, - 38846, 38848, 38866, 38880, 152684, 38894, 29724, 169011, 38911, 38901, - 168989, 162170, 19153, 38964, 38963, 38987, 39014, 15118, 160117, 15697, - 132656, 147804, 153350, 39114, 39095, 39112, 39111, 19199, 159015, 136915, - 21936, 39137, 39142, 39148, 37752, 39225, 150057, 19314, 170071, 170245, - 39413, 39436, 39483, 39440, 39512, 153381, 14020, 168113, 170965, 39648, - 39650, 170757, 39668, 19470, 39700, 39725, 165376, 20532, 39732, 158120, - 14531, 143485, 39760, 39744, 171326, 23109, 137315, 39822, 148043, 39938, - 39935, 39948, 171624, 40404, 171959, 172434, 172459, 172257, 172323, 172511, - 40318, 40323, 172340, 40462, 26760, 40388, 139611, 172435, 172576, 137531, - 172595, 40249, 172217, 172724, 40592, 40597, 40606, 40610, 19764, 40618, - 40623, 148324, 40641, 15200, 14821, 15645, 20274, 14270, 166955, 40706, - 40712, 19350, 37924, 159138, 40727, 40726, 40761, 22175, 22154, 40773, - 39352, 168075, 38898, 33919, 40802, 40809, 31452, 40846, 29206, 19390, - 149877, 149947, 29047, 150008, 148296, 150097, 29598, 166874, 137466, 31135, - 166270, 167478, 37737, 37875, 166468, 37612, 37761, 37835, 166252, 148665, - 29207, 16107, 30578, 31299, 28880, 148595, 148472, 29054, 137199, 28835, - 137406, 144793, 16071, 137349, 152623, 137208, 14114, 136955, 137273, 14049, - 137076, 137425, 155467, 14115, 136896, 22363, 150053, 136190, 135848, 136134, - 136374, 34051, 145062, 34051, 33877, 149908, 160101, 146993, 152924, 147195, - 159826, 17652, 145134, 170397, 159526, 26617, 14131, 15381, 15847, 22636, - 137506, 26640, 16471, 145215, 147681, 147595, 147727, 158753, 21707, 22174, - 157361, 22162, 135135, 134056, 134669, 37830, 166675, 37788, 20216, 20779, - 14361, 148534, 20156, 132197, 131967, 20299, 20362, 153169, 23144, 131499, - 132043, 14745, 131850, 132116, 13365, 20265, 131776, 167603, 131701, 35546, - 131596, 20120, 20685, 20749, 20386, 20227, 150030, 147082, 20290, 20526, - 20588, 20609, 20428, 20453, 20568, 20732, 20825, 20827, 20829, 20830, - 28278, 144789, 147001, 147135, 28018, 137348, 147081, 20904, 20931, 132576, - 17629, 132259, 132242, 132241, 36218, 166556, 132878, 21081, 21156, 133235, - 21217, 37742, 18042, 29068, 148364, 134176, 149932, 135396, 27089, 134685, - 29817, 16094, 29849, 29716, 29782, 29592, 19342, 150204, 147597, 21456, - 13700, 29199, 147657, 21940, 131909, 21709, 134086, 22301, 37469, 38644, - 37734, 22493, 22413, 22399, 13886, 22731, 23193, 166470, 136954, 137071, - 136976, 23084, 22968, 37519, 23166, 23247, 23058, 153926, 137715, 137313, - 148117, 14069, 27909, 29763, 23073, 155267, 23169, 166871, 132115, 37856, - 29836, 135939, 28933, 18802, 37896, 166395, 37821, 14240, 23582, 23710, - 24158, 24136, 137622, 137596, 146158, 24269, 23375, 137475, 137476, 14081, - 137376, 14045, 136958, 14035, 33066, 166471, 138682, 144498, 166312, 24332, - 24334, 137511, 137131, 23147, 137019, 23364, 34324, 161277, 34912, 24702, - 141408, 140843, 24539, 16056, 140719, 140734, 168072, 159603, 25024, 131134, - 131142, 140827, 24985, 24984, 24693, 142491, 142599, 149204, 168269, 25713, - 149093, 142186, 14889, 142114, 144464, 170218, 142968, 25399, 173147, 25782, - 25393, 25553, 149987, 142695, 25252, 142497, 25659, 25963, 26994, 15348, - 143502, 144045, 149897, 144043, 21773, 144096, 137433, 169023, 26318, 144009, - 143795, 15072, 16784, 152964, 166690, 152975, 136956, 152923, 152613, 30958, - 143619, 137258, 143924, 13412, 143887, 143746, 148169, 26254, 159012, 26219, - 19347, 26160, 161904, 138731, 26211, 144082, 144097, 26142, 153714, 14545, - 145466, 145340, 15257, 145314, 144382, 29904, 15254, 26511, 149034, 26806, - 26654, 15300, 27326, 14435, 145365, 148615, 27187, 27218, 27337, 27397, - 137490, 25873, 26776, 27212, 15319, 27258, 27479, 147392, 146586, 37792, - 37618, 166890, 166603, 37513, 163870, 166364, 37991, 28069, 28427, 149996, - 28007, 147327, 15759, 28164, 147516, 23101, 28170, 22599, 27940, 30786, - 28987, 148250, 148086, 28913, 29264, 29319, 29332, 149391, 149285, 20857, - 150180, 132587, 29818, 147192, 144991, 150090, 149783, 155617, 16134, 16049, - 150239, 166947, 147253, 24743, 16115, 29900, 29756, 37767, 29751, 17567, - 159210, 17745, 30083, 16227, 150745, 150790, 16216, 30037, 30323, 173510, - 15129, 29800, 166604, 149931, 149902, 15099, 15821, 150094, 16127, 149957, - 149747, 37370, 22322, 37698, 166627, 137316, 20703, 152097, 152039, 30584, - 143922, 30478, 30479, 30587, 149143, 145281, 14942, 149744, 29752, 29851, - 16063, 150202, 150215, 16584, 150166, 156078, 37639, 152961, 30750, 30861, - 30856, 30930, 29648, 31065, 161601, 153315, 16654, 31131, 33942, 31141, - 27181, 147194, 31290, 31220, 16750, 136934, 16690, 37429, 31217, 134476, - 149900, 131737, 146874, 137070, 13719, 21867, 13680, 13994, 131540, 134157, - 31458, 23129, 141045, 154287, 154268, 23053, 131675, 30960, 23082, 154566, - 31486, 16889, 31837, 31853, 16913, 154547, 155324, 155302, 31949, 150009, - 137136, 31886, 31868, 31918, 27314, 32220, 32263, 32211, 32590, 156257, - 155996, 162632, 32151, 155266, 17002, 158581, 133398, 26582, 131150, 144847, - 22468, 156690, 156664, 149858, 32733, 31527, 133164, 154345, 154947, 31500, - 155150, 39398, 34373, 39523, 27164, 144447, 14818, 150007, 157101, 39455, - 157088, 33920, 160039, 158929, 17642, 33079, 17410, 32966, 33033, 33090, - 157620, 39107, 158274, 33378, 33381, 158289, 33875, 159143, 34320, 160283, - 23174, 16767, 137280, 23339, 137377, 23268, 137432, 34464, 195004, 146831, - 34861, 160802, 23042, 34926, 20293, 34951, 35007, 35046, 35173, 35149, - 153219, 35156, 161669, 161668, 166901, 166873, 166812, 166393, 16045, 33955, - 18165, 18127, 14322, 35389, 35356, 169032, 24397, 37419, 148100, 26068, - 28969, 28868, 137285, 40301, 35999, 36073, 163292, 22938, 30659, 23024, - 17262, 14036, 36394, 36519, 150537, 36656, 36682, 17140, 27736, 28603, - 140065, 18587, 28537, 28299, 137178, 39913, 14005, 149807, 37051, 37015, - 21873, 18694, 37307, 37892, 166475, 16482, 166652, 37927, 166941, 166971, - 34021, 35371, 38297, 38311, 38295, 38294, 167220, 29765, 16066, 149759, - 150082, 148458, 16103, 143909, 38543, 167655, 167526, 167525, 16076, 149997, - 150136, 147438, 29714, 29803, 16124, 38721, 168112, 26695, 18973, 168083, - 153567, 38749, 37736, 166281, 166950, 166703, 156606, 37562, 23313, 35689, - 18748, 29689, 147995, 38811, 38769, 39224, 134950, 24001, 166853, 150194, - 38943, 169178, 37622, 169431, 37349, 17600, 166736, 150119, 166756, 39132, - 166469, 16128, 37418, 18725, 33812, 39227, 39245, 162566, 15869, 39323, - 19311, 39338, 39516, 166757, 153800, 27279, 39457, 23294, 39471, 170225, - 19344, 170312, 39356, 19389, 19351, 37757, 22642, 135938, 22562, 149944, - 136424, 30788, 141087, 146872, 26821, 15741, 37976, 14631, 24912, 141185, - 141675, 24839, 40015, 40019, 40059, 39989, 39952, 39807, 39887, 171565, - 39839, 172533, 172286, 40225, 19630, 147716, 40472, 19632, 40204, 172468, - 172269, 172275, 170287, 40357, 33981, 159250, 159711, 158594, 34300, 17715, - 159140, 159364, 159216, 33824, 34286, 159232, 145367, 155748, 31202, 144796, - 144960, 18733, 149982, 15714, 37851, 37566, 37704, 131775, 30905, 37495, - 37965, 20452, 13376, 36964, 152925, 30781, 30804, 30902, 30795, 137047, - 143817, 149825, 13978, 20338, 28634, 28633, 28702, 28702, 21524, 147893, - 22459, 22771, 22410, 40214, 22487, 28980, 13487, 147884, 29163, 158784, - 151447, 23336, 137141, 166473, 24844, 23246, 23051, 17084, 148616, 14124, - 19323, 166396, 37819, 37816, 137430, 134941, 33906, 158912, 136211, 148218, - 142374, 148417, 22932, 146871, 157505, 32168, 155995, 155812, 149945, 149899, - 166394, 37605, 29666, 16105, 29876, 166755, 137375, 16097, 150195, 27352, - 29683, 29691, 16086, 150078, 150164, 137177, 150118, 132007, 136228, 149989, - 29768, 149782, 28837, 149878, 37508, 29670, 37727, 132350, 37681, 166606, - 166422, 37766, 166887, 153045, 18741, 166530, 29035, 149827, 134399, 22180, - 132634, 134123, 134328, 21762, 31172, 137210, 32254, 136898, 150096, 137298, - 17710, 37889, 14090, 166592, 149933, 22960, 137407, 137347, 160900, 23201, - 14050, 146779, 14000, 37471, 23161, 166529, 137314, 37748, 15565, 133812, - 19094, 14730, 20724, 15721, 15692, 136092, 29045, 17147, 164376, 28175, - 168164, 17643, 27991, 163407, 28775, 27823, 15574, 147437, 146989, 28162, - 28428, 15727, 132085, 30033, 14012, 13512, 18048, 16090, 18545, 22980, - 37486, 18750, 36673, 166940, 158656, 22546, 22472, 14038, 136274, 28926, - 148322, 150129, 143331, 135856, 140221, 26809, 26983, 136088, 144613, 162804, - 145119, 166531, 145366, 144378, 150687, 27162, 145069, 158903, 33854, 17631, - 17614, 159014, 159057, 158850, 159710, 28439, 160009, 33597, 137018, 33773, - 158848, 159827, 137179, 22921, 23170, 137139, 23137, 23153, 137477, 147964, - 14125, 23023, 137020, 14023, 29070, 37776, 26266, 148133, 23150, 23083, - 148115, 27179, 147193, 161590, 148571, 148170, 28957, 148057, 166369, 20400, - 159016, 23746, 148686, 163405, 148413, 27148, 148054, 135940, 28838, 28979, - 148457, 15781, 27871, 194597, 150095, 32357, 23019, 23855, 15859, 24412, - 150109, 137183, 32164, 33830, 21637, 146170, 144128, 131604, 22398, 133333, - 132633, 16357, 139166, 172726, 28675, 168283, 23920, 29583, 31955, 166489, - 168992, 20424, 32743, 29389, 29456, 162548, 29496, 29497, 153334, 29505, - 29512, 16041, 162584, 36972, 29173, 149746, 29665, 33270, 16074, 30476, - 16081, 27810, 22269, 29721, 29726, 29727, 16098, 16112, 16116, 16122, - 29907, 16142, 16211, 30018, 30061, 30066, 30093, 16252, 30152, 30172, - 16320, 30285, 16343, 30324, 16348, 30330, 151388, 29064, 22051, 35200, - 22633, 16413, 30531, 16441, 26465, 16453, 13787, 30616, 16490, 16495, - 23646, 30654, 30667, 22770, 30744, 28857, 30748, 16552, 30777, 30791, - 30801, 30822, 33864, 152885, 31027, 26627, 31026, 16643, 16649, 31121, - 31129, 36795, 31238, 36796, 16743, 31377, 16818, 31420, 33401, 16836, - 31439, 31451, 16847, 20001, 31586, 31596, 31611, 31762, 31771, 16992, - 17018, 31867, 31900, 17036, 31928, 17044, 31981, 36755, 28864, 134351, - 32207, 32212, 32208, 32253, 32686, 32692, 29343, 17303, 32800, 32805, - 31545, 32814, 32817, 32852, 15820, 22452, 28832, 32951, 33001, 17389, - 33036, 29482, 33038, 33042, 30048, 33044, 17409, 15161, 33110, 33113, - 33114, 17427, 22586, 33148, 33156, 17445, 33171, 17453, 33189, 22511, - 33217, 33252, 33364, 17551, 33446, 33398, 33482, 33496, 33535, 17584, - 33623, 38505, 27018, 33797, 28917, 33892, 24803, 33928, 17668, 33982, - 34017, 34040, 34064, 34104, 34130, 17723, 34159, 34160, 34272, 17783, - 34418, 34450, 34482, 34543, 38469, 34699, 17926, 17943, 34990, 35071, - 35108, 35143, 35217, 162151, 35369, 35384, 35476, 35508, 35921, 36052, - 36082, 36124, 18328, 22623, 36291, 18413, 20206, 36410, 21976, 22356, - 36465, 22005, 36528, 18487, 36558, 36578, 36580, 36589, 36594, 36791, - 36801, 36810, 36812, 36915, 39364, 18605, 39136, 37395, 18718, 37416, - 37464, 37483, 37553, 37550, 37567, 37603, 37611, 37619, 37620, 37629, - 37699, 37764, 37805, 18757, 18769, 40639, 37911, 21249, 37917, 37933, - 37950, 18794, 37972, 38009, 38189, 38306, 18855, 38388, 38451, 18917, - 26528, 18980, 38720, 18997, 38834, 38850, 22100, 19172, 24808, 39097, - 19225, 39153, 22596, 39182, 39193, 20916, 39196, 39223, 39234, 39261, - 39266, 19312, 39365, 19357, 39484, 39695, 31363, 39785, 39809, 39901, - 39921, 39924, 19565, 39968, 14191, 138178, 40265, 39994, 40702, 22096, - 40339, 40381, 40384, 40444, 38134, 36790, 40571, 40620, 40625, 40637, - 40646, 38108, 40674, 40689, 40696, 31432, 40772, 131220, 131767, 132000, - 26906, 38083, 22956, 132311, 22592, 38081, 14265, 132565, 132629, 132726, - 136890, 22359, 29043, 133826, 133837, 134079, 21610, 194619, 134091, 21662, - 134139, 134203, 134227, 134245, 134268, 24807, 134285, 22138, 134325, 134365, - 134381, 134511, 134578, 134600, 26965, 39983, 34725, 134660, 134670, 134871, - 135056, 134957, 134771, 23584, 135100, 24075, 135260, 135247, 135286, 26398, - 135291, 135304, 135318, 13895, 135359, 135379, 135471, 135483, 21348, 33965, - 135907, 136053, 135990, 35713, 136567, 136729, 137155, 137159, 20088, 28859, - 137261, 137578, 137773, 137797, 138282, 138352, 138412, 138952, 25283, 138965, - 139029, 29080, 26709, 139333, 27113, 14024, 139900, 140247, 140282, 141098, - 141425, 141647, 33533, 141671, 141715, 142037, 35237, 142056, 36768, 142094, - 38840, 142143, 38983, 39613, 142412, 0x0000, 142472, 142519, 154600, 142600, - 142610, 142775, 142741, 142914, 143220, 143308, 143411, 143462, 144159, 144350, - 24497, 26184, 26303, 162425, 144743, 144883, 29185, 149946, 30679, 144922, - 145174, 32391, 131910, 22709, 26382, 26904, 146087, 161367, 155618, 146961, - 147129, 161278, 139418, 18640, 19128, 147737, 166554, 148206, 148237, 147515, - 148276, 148374, 150085, 132554, 20946, 132625, 22943, 138920, 15294, 146687, - 148484, 148694, 22408, 149108, 14747, 149295, 165352, 170441, 14178, 139715, - 35678, 166734, 39382, 149522, 149755, 150037, 29193, 150208, 134264, 22885, - 151205, 151430, 132985, 36570, 151596, 21135, 22335, 29041, 152217, 152601, - 147274, 150183, 21948, 152646, 152686, 158546, 37332, 13427, 152895, 161330, - 152926, 18200, 152930, 152934, 153543, 149823, 153693, 20582, 13563, 144332, - 24798, 153859, 18300, 166216, 154286, 154505, 154630, 138640, 22433, 29009, - 28598, 155906, 162834, 36950, 156082, 151450, 35682, 156674, 156746, 23899, - 158711, 36662, 156804, 137500, 35562, 150006, 156808, 147439, 156946, 19392, - 157119, 157365, 141083, 37989, 153569, 24981, 23079, 194765, 20411, 22201, - 148769, 157436, 20074, 149812, 38486, 28047, 158909, 13848, 35191, 157593, - 157806, 156689, 157790, 29151, 157895, 31554, 168128, 133649, 157990, 37124, - 158009, 31301, 40432, 158202, 39462, 158253, 13919, 156777, 131105, 31107, - 158260, 158555, 23852, 144665, 33743, 158621, 18128, 158884, 30011, 34917, - 159150, 22710, 14108, 140685, 159819, 160205, 15444, 160384, 160389, 37505, - 139642, 160395, 37680, 160486, 149968, 27705, 38047, 160848, 134904, 34855, - 35061, 141606, 164979, 137137, 28344, 150058, 137248, 14756, 14009, 23568, - 31203, 17727, 26294, 171181, 170148, 35139, 161740, 161880, 22230, 16607, - 136714, 14753, 145199, 164072, 136133, 29101, 33638, 162269, 168360, 23143, - 19639, 159919, 166315, 162301, 162314, 162571, 163174, 147834, 31555, 31102, - 163849, 28597, 172767, 27139, 164632, 21410, 159239, 37823, 26678, 38749, - 164207, 163875, 158133, 136173, 143919, 163912, 23941, 166960, 163971, 22293, - 38947, 166217, 23979, 149896, 26046, 27093, 21458, 150181, 147329, 15377, - 26422, 163984, 164084, 164142, 139169, 164175, 164233, 164271, 164378, 164614, - 164655, 164746, 13770, 164968, 165546, 18682, 25574, 166230, 30728, 37461, - 166328, 17394, 166375, 17375, 166376, 166726, 166868, 23032, 166921, 36619, - 167877, 168172, 31569, 168208, 168252, 15863, 168286, 150218, 36816, 29327, - 22155, 169191, 169449, 169392, 169400, 169778, 170193, 170313, 170346, 170435, - 170536, 170766, 171354, 171419, 32415, 171768, 171811, 19620, 38215, 172691, - 29090, 172799, 19857, 36882, 173515, 19868, 134300, 36798, 21953, 36794, - 140464, 36793, 150163, 17673, 32383, 28502, 27313, 20202, 13540, 166700, - 161949, 14138, 36480, 137205, 163876, 166764, 166809, 162366, 157359, 15851, - 161365, 146615, 153141, 153942, 20122, 155265, 156248, 22207, 134765, 36366, - 23405, 147080, 150686, 25566, 25296, 137206, 137339, 25904, 22061, 154698, - 21530, 152337, 15814, 171416, 19581, 22050, 22046, 32585, 155352, 22901, - 146752, 34672, 19996, 135146, 134473, 145082, 33047, 40286, 36120, 30267, - 40005, 30286, 30649, 37701, 21554, 33096, 33527, 22053, 33074, 33816, - 32957, 21994, 31074, 22083, 21526, 134813, 13774, 22021, 22001, 26353, - 164578, 13869, 30004, 22000, 21946, 21655, 21874, 134209, 134294, 24272, - 151880, 134774, 142434, 134818, 40619, 32090, 21982, 135285, 25245, 38765, - 21652, 36045, 29174, 37238, 25596, 25529, 25598, 21865, 142147, 40050, - 143027, 20890, 13535, 134567, 20903, 21581, 21790, 21779, 30310, 36397, - 157834, 30129, 32950, 34820, 34694, 35015, 33206, 33820, 135361, 17644, - 29444, 149254, 23440, 33547, 157843, 22139, 141044, 163119, 147875, 163187, - 159440, 160438, 37232, 135641, 37384, 146684, 173737, 134828, 134905, 29286, - 138402, 18254, 151490, 163833, 135147, 16634, 40029, 25887, 142752, 18675, - 149472, 171388, 135148, 134666, 24674, 161187, 135149, 0x0000, 155720, 135559, - 29091, 32398, 40272, 19994, 19972, 13687, 23309, 27826, 21351, 13996, - 14812, 21373, 13989, 149016, 22682, 150382, 33325, 21579, 22442, 154261, - 133497, 0x0000, 14930, 140389, 29556, 171692, 19721, 39917, 146686, 171824, - 19547, 151465, 169374, 171998, 33884, 146870, 160434, 157619, 145184, 25390, - 32037, 147191, 146988, 14890, 36872, 21196, 15988, 13946, 17897, 132238, - 30272, 23280, 134838, 30842, 163630, 22695, 16575, 22140, 39819, 23924, - 30292, 173108, 40581, 19681, 30201, 14331, 24857, 143578, 148466, 0x0000, - 22109, 135849, 22439, 149859, 171526, 21044, 159918, 13741, 27722, 40316, - 31830, 39737, 22494, 137068, 23635, 25811, 169168, 156469, 160100, 34477, - 134440, 159010, 150242, 134513, 0x0000, 20990, 139023, 23950, 38659, 138705, - 40577, 36940, 31519, 39682, 23761, 31651, 25192, 25397, 39679, 31695, - 39722, 31870, 39726, 31810, 31878, 39957, 31740, 39689, 40727, 39963, - 149822, 40794, 21875, 23491, 20477, 40600, 20466, 21088, 15878, 21201, - 22375, 20566, 22967, 24082, 38856, 40363, 36700, 21609, 38836, 39232, - 38842, 21292, 24880, 26924, 21466, 39946, 40194, 19515, 38465, 27008, - 20646, 30022, 137069, 39386, 21107, 0x0000, 37209, 38529, 37212, 0x0000, - 37201, 167575, 25471, 159011, 27338, 22033, 37262, 30074, 25221, 132092, - 29519, 31856, 154657, 146685, 0x0000, 149785, 30422, 39837, 20010, 134356, - 33726, 34882, 0x0000, 23626, 27072, 20717, 22394, 21023, 24053, 20174, - 27697, 131570, 20281, 21660, 21722, 21146, 36226, 13822, 24332, 13811, - 0x0000, 27474, 37244, 40869, 39831, 38958, 39092, 39610, 40616, 40580, - 29050, 31508, 0x0000, 27642, 34840, 32632, 0x0000, 22048, 173642, 36471, - 40787, 0x0000, 36308, 36431, 40476, 36353, 25218, 164733, 36392, 36469, - 31443, 150135, 31294, 30936, 27882, 35431, 30215, 166490, 40742, 27854, - 34774, 30147, 172722, 30803, 194624, 36108, 29410, 29553, 35629, 29442, - 29937, 36075, 150203, 34351, 24506, 34976, 17591, 0x0000, 137275, 159237, - 0x0000, 35454, 140571, 0x0000, 24829, 30311, 39639, 40260, 37742, 39823, - 34805, 0x0000, 34831, 36087, 29484, 38689, 39856, 13782, 29362, 19463, - 31825, 39242, 155993, 24921, 19460, 40598, 24957, 0x0000, 22367, 24943, - 25254, 25145, 25294, 14940, 25058, 21418, 144373, 25444, 26626, 13778, - 23895, 166850, 36826, 167481, 0x0000, 20697, 138566, 30982, 21298, 38456, - 134971, 16485, 0x0000, 30718, 0x0000, 31938, 155418, 31962, 31277, 32870, - 32867, 32077, 29957, 29938, 35220, 33306, 26380, 32866, 160902, 32859, - 29936, 33027, 30500, 35209, 157644, 30035, 159441, 34729, 34766, 33224, - 34700, 35401, 36013, 35651, 30507, 29944, 34010, 13877, 27058, 36262, - 0x0000, 35241, 29800, 28089, 34753, 147473, 29927, 15835, 29046, 24740, - 24988, 15569, 29026, 24695, 0x0000, 32625, 166701, 29264, 24809, 19326, - 21024, 15384, 146631, 155351, 161366, 152881, 137540, 135934, 170243, 159196, - 159917, 23745, 156077, 166415, 145015, 131310, 157766, 151310, 17762, 23327, - 156492, 40784, 40614, 156267, 12288, 65292, 12289, 12290, 65294, 8231, - 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65105, 65106, - 183, 65108, 65109, 65110, 65111, 65372, 8211, 65073, 8212, 65075, - 9588, 65076, 65103, 65288, 65289, 65077, 65078, 65371, 65373, 65079, - 65080, 12308, 12309, 65081, 65082, 12304, 12305, 65083, 65084, 12298, - 12299, 65085, 65086, 12296, 12297, 65087, 65088, 12300, 12301, 65089, - 65090, 12302, 12303, 65091, 65092, 65113, 65114, 65115, 65116, 65117, - 65118, 8216, 8217, 8220, 8221, 12317, 12318, 8245, 8242, 65283, - 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, - 9734, 9733, 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, - 175, 65507, 65343, 717, 65097, 65098, 65101, 65102, 65099, 65100, - 65119, 65120, 65121, 65291, 65293, 215, 247, 177, 8730, 65308, - 65310, 65309, 8806, 8807, 8800, 8734, 8786, 8801, 65122, 65123, - 65124, 65125, 65126, 65374, 8745, 8746, 8869, 8736, 8735, 8895, - 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 8853, 8857, - 8593, 8595, 8592, 8594, 8598, 8599, 8601, 8600, 8741, 8739, - 65295, 65340, 8725, 65128, 65284, 65509, 12306, 65504, 65505, 65285, - 65312, 8451, 8457, 65129, 65130, 65131, 13269, 13212, 13213, 13214, - 13262, 13217, 13198, 13199, 13252, 176, 20825, 20827, 20830, 20829, - 20833, 20835, 21991, 29929, 31950, 9601, 9602, 9603, 9604, 9605, - 9606, 9607, 9608, 9615, 9614, 9613, 9612, 9611, 9610, 9609, - 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, - 9488, 9492, 9496, 9581, 9582, 9584, 9583, 9552, 9566, 9578, - 9569, 9698, 9699, 9701, 9700, 9585, 9586, 9587, 65296, 65297, - 65298, 65299, 65300, 65301, 65302, 65303, 65304, 65305, 8544, 8545, - 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 12321, 12322, - 12323, 12324, 12325, 12326, 12327, 12328, 12329, 21313, 21316, 21317, - 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, - 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, - 65333, 65334, 65335, 65336, 65337, 65338, 65345, 65346, 65347, 65348, - 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, - 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, - 65369, 65370, 913, 914, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, - 932, 933, 934, 935, 936, 937, 945, 946, 947, 948, - 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, - 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, - 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, - 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, - 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, - 12579, 12580, 12581, 12582, 12583, 12584, 12585, 729, 713, 714, - 711, 715, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, - 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, - 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, - 9244, 9245, 9246, 9247, 9249, 8364, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 19968, 20057, 19969, 19971, 20035, - 20061, 20102, 20108, 20154, 20799, 20837, 20843, 20960, 20992, 20993, - 21147, 21269, 21313, 21340, 21448, 19977, 19979, 19976, 19978, 20011, - 20024, 20961, 20037, 20040, 20063, 20062, 20110, 20129, 20800, 20995, - 21242, 21315, 21449, 21475, 22303, 22763, 22805, 22823, 22899, 23376, - 23377, 23379, 23544, 23567, 23586, 23608, 23665, 24029, 24037, 24049, - 24050, 24051, 24062, 24178, 24318, 24331, 24339, 25165, 19985, 19984, - 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, 20117, 20114, - 20116, 20130, 20161, 20160, 20163, 20166, 20167, 20173, 20170, 20171, - 20164, 20803, 20801, 20839, 20845, 20846, 20844, 20887, 20982, 20998, - 20999, 21000, 21243, 21246, 21247, 21270, 21305, 21320, 21319, 21317, - 21342, 21380, 21451, 21450, 21453, 22764, 22825, 22827, 22826, 22829, - 23380, 23569, 23588, 23610, 23663, 24052, 24187, 24319, 24340, 24341, - 24515, 25096, 25142, 25163, 25166, 25903, 25991, 26007, 26020, 26041, - 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27595, 27604, 27611, - 27663, 27700, 28779, 29226, 29238, 29243, 29255, 29273, 29275, 29356, - 29579, 19993, 19990, 19989, 19988, 19992, 20027, 20045, 20047, 20046, - 20197, 20184, 20180, 20181, 20182, 20183, 20195, 20196, 20185, 20190, - 20805, 20804, 20873, 20874, 20908, 20985, 20986, 20984, 21002, 21152, - 21151, 21253, 21254, 21271, 21277, 20191, 21322, 21321, 21345, 21344, - 21359, 21358, 21435, 21487, 21476, 21491, 21484, 21486, 21481, 21480, - 21500, 21496, 21493, 21483, 21478, 21482, 21490, 21489, 21488, 21477, - 21485, 21499, 22235, 22234, 22806, 22830, 22833, 22900, 22902, 23381, - 23427, 23612, 24040, 24039, 24038, 24066, 24067, 24179, 24188, 24321, - 24344, 24343, 24517, 25098, 25171, 25172, 25170, 25169, 26021, 26086, - 26414, 26412, 26410, 26411, 26413, 27491, 27597, 27665, 27664, 27704, - 27713, 27712, 27710, 29359, 29572, 29577, 29916, 29926, 29976, 29983, - 29992, 29993, 30000, 30001, 30002, 30003, 30091, 30333, 30382, 30399, - 30446, 30683, 30690, 30707, 31034, 31166, 31348, 31435, 19998, 19999, - 20050, 20051, 20073, 20121, 20132, 20134, 20133, 20223, 20233, 20249, - 20234, 20245, 20237, 20240, 20241, 20239, 20210, 20214, 20219, 20208, - 20211, 20221, 20225, 20235, 20809, 20807, 20806, 20808, 20840, 20849, - 20877, 20912, 21015, 21009, 21010, 21006, 21014, 21155, 21256, 21281, - 21280, 21360, 21361, 21513, 21519, 21516, 21514, 21520, 21505, 21515, - 21508, 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, - 22237, 22323, 22320, 22312, 22317, 22316, 22319, 22313, 22809, 22810, - 22839, 22840, 22916, 22904, 22915, 22909, 22905, 22914, 22913, 23383, - 23384, 23431, 23432, 23429, 23433, 23546, 23574, 23673, 24030, 24070, - 24182, 24180, 24335, 24347, 24537, 24534, 25102, 25100, 25101, 25104, - 25187, 25179, 25176, 25910, 26089, 26088, 26092, 26093, 26354, 26355, - 26377, 26429, 26420, 26417, 26421, 27425, 27492, 27515, 27670, 27741, - 27735, 27737, 27743, 27744, 27728, 27733, 27745, 27739, 27725, 27726, - 28784, 29279, 29277, 30334, 31481, 31859, 31992, 32566, 32650, 32701, - 32769, 32771, 32780, 32786, 32819, 32895, 32905, 32907, 32908, 33251, - 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33406, 34411, - 34880, 34892, 34915, 35199, 38433, 20018, 20136, 20301, 20303, 20295, - 20311, 20318, 20276, 20315, 20309, 20272, 20304, 20305, 20285, 20282, - 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, 20302, - 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, 20918, - 20919, 21029, 21028, 21033, 21034, 21032, 21163, 21161, 21162, 21164, - 21283, 21363, 21365, 21533, 21549, 21534, 21566, 21542, 21582, 21543, - 21574, 21571, 21555, 21576, 21570, 21531, 21545, 21578, 21561, 21563, - 21560, 21550, 21557, 21558, 21536, 21564, 21568, 21553, 21547, 21535, - 21548, 22250, 22256, 22244, 22251, 22346, 22353, 22336, 22349, 22343, - 22350, 22334, 22352, 22351, 22331, 22767, 22846, 22941, 22930, 22952, - 22942, 22947, 22937, 22934, 22925, 22948, 22931, 22922, 22949, 23389, - 23388, 23386, 23387, 23436, 23435, 23439, 23596, 23616, 23617, 23615, - 23614, 23696, 23697, 23700, 23692, 24043, 24076, 24207, 24199, 24202, - 24311, 24324, 24351, 24420, 24418, 24439, 24441, 24536, 24524, 24535, - 24525, 24561, 24555, 24568, 24554, 25106, 25105, 25220, 25239, 25238, - 25216, 25206, 25225, 25197, 25226, 25212, 25214, 25209, 25203, 25234, - 25199, 25240, 25198, 25237, 25235, 25233, 25222, 25913, 25915, 25912, - 26097, 26356, 26463, 26446, 26447, 26448, 26449, 26460, 26454, 26462, - 26441, 26438, 26464, 26451, 26455, 27493, 27599, 27714, 27742, 27801, - 27777, 27784, 27785, 27781, 27803, 27754, 27770, 27792, 27760, 27788, - 27752, 27798, 27794, 27773, 27779, 27762, 27774, 27764, 27782, 27766, - 27789, 27796, 27800, 27778, 28790, 28796, 28797, 28792, 29282, 29281, - 29280, 29380, 29378, 29590, 29996, 29995, 30007, 30008, 30338, 30447, - 30691, 31169, 31168, 31167, 31350, 31995, 32597, 32918, 32915, 32925, - 32920, 32923, 32922, 32946, 33391, 33426, 33419, 33421, 35211, 35282, - 35328, 35895, 35910, 35925, 35997, 36196, 36208, 36275, 36523, 36554, - 36763, 36784, 36802, 36806, 36805, 36804, 24033, 37009, 37026, 37034, - 37030, 37027, 37193, 37318, 37324, 38450, 38446, 38449, 38442, 38444, - 20006, 20054, 20083, 20107, 20123, 20126, 20139, 20140, 20335, 20381, - 20365, 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, - 20360, 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, - 20821, 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, - 21050, 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, - 21329, 21350, 21367, 21368, 21369, 21462, 21460, 21463, 21619, 21621, - 21654, 21624, 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, - 21648, 21617, 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, - 22266, 22403, 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, - 22857, 22855, 22856, 22852, 22868, 22974, 22971, 22996, 22969, 22958, - 22993, 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, - 22981, 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, - 23578, 23624, 23621, 23622, 23735, 23713, 23736, 23721, 23723, 23729, - 23731, 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, - 24220, 24213, 24214, 24310, 24358, 24359, 24361, 24448, 24449, 24447, - 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, - 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, - 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, - 25298, 25307, 25259, 25299, 25300, 25291, 25288, 25256, 25277, 25276, - 25296, 25305, 25287, 25293, 25269, 25306, 25265, 25304, 25302, 25303, - 25286, 25260, 25294, 25918, 26023, 26044, 26106, 26132, 26131, 26124, - 26118, 26114, 26126, 26112, 26127, 26133, 26122, 26119, 26381, 26379, - 26477, 26507, 26517, 26481, 26524, 26483, 26487, 26503, 26525, 26519, - 26479, 26480, 26495, 26505, 26494, 26512, 26485, 26522, 26515, 26492, - 26474, 26482, 27427, 27494, 27495, 27519, 27667, 27675, 27875, 27880, - 27891, 27825, 27852, 27877, 27827, 27837, 27838, 27836, 27874, 27819, - 27861, 27859, 27832, 27844, 27833, 27841, 27822, 27863, 27845, 27889, - 27839, 27835, 27873, 27867, 27850, 27820, 27887, 27868, 27862, 27872, - 28821, 28814, 28818, 28810, 28825, 29228, 29229, 29240, 29256, 29287, - 29289, 29376, 29390, 29401, 29399, 29392, 29609, 29608, 29599, 29611, - 29605, 30013, 30109, 30105, 30106, 30340, 30402, 30450, 30452, 30693, - 30717, 31038, 31040, 31041, 31177, 31176, 31354, 31353, 31482, 31998, - 32596, 32652, 32651, 32773, 32954, 32933, 32930, 32945, 32929, 32939, - 32937, 32948, 32938, 32943, 33253, 33278, 33293, 33459, 33437, 33433, - 33453, 33469, 33439, 33465, 33457, 33452, 33445, 33455, 33464, 33443, - 33456, 33470, 33463, 34382, 34417, 21021, 34920, 36555, 36814, 36820, - 36817, 37045, 37048, 37041, 37046, 37319, 37329, 38263, 38272, 38428, - 38464, 38463, 38459, 38468, 38466, 38585, 38632, 38738, 38750, 20127, - 20141, 20142, 20449, 20405, 20399, 20415, 20448, 20433, 20431, 20445, - 20419, 20406, 20440, 20447, 20426, 20439, 20398, 20432, 20420, 20418, - 20442, 20430, 20446, 20407, 20823, 20882, 20881, 20896, 21070, 21059, - 21066, 21069, 21068, 21067, 21063, 21191, 21193, 21187, 21185, 21261, - 21335, 21371, 21402, 21467, 21676, 21696, 21672, 21710, 21705, 21688, - 21670, 21683, 21703, 21698, 21693, 21674, 21697, 21700, 21704, 21679, - 21675, 21681, 21691, 21673, 21671, 21695, 22271, 22402, 22411, 22432, - 22435, 22434, 22478, 22446, 22419, 22869, 22865, 22863, 22862, 22864, - 23004, 23000, 23039, 23011, 23016, 23043, 23013, 23018, 23002, 23014, - 23041, 23035, 23401, 23459, 23462, 23460, 23458, 23461, 23553, 23630, - 23631, 23629, 23627, 23769, 23762, 24055, 24093, 24101, 24095, 24189, - 24224, 24230, 24314, 24328, 24365, 24421, 24456, 24453, 24458, 24459, - 24455, 24460, 24457, 24594, 24605, 24608, 24613, 24590, 24616, 24653, - 24688, 24680, 24674, 24646, 24643, 24684, 24683, 24682, 24676, 25153, - 25308, 25366, 25353, 25340, 25325, 25345, 25326, 25341, 25351, 25329, - 25335, 25327, 25324, 25342, 25332, 25361, 25346, 25919, 25925, 26027, - 26045, 26082, 26149, 26157, 26144, 26151, 26159, 26143, 26152, 26161, - 26148, 26359, 26623, 26579, 26609, 26580, 26576, 26604, 26550, 26543, - 26613, 26601, 26607, 26564, 26577, 26548, 26586, 26597, 26552, 26575, - 26590, 26611, 26544, 26585, 26594, 26589, 26578, 27498, 27523, 27526, - 27573, 27602, 27607, 27679, 27849, 27915, 27954, 27946, 27969, 27941, - 27916, 27953, 27934, 27927, 27963, 27965, 27966, 27958, 27931, 27893, - 27961, 27943, 27960, 27945, 27950, 27957, 27918, 27947, 28843, 28858, - 28851, 28844, 28847, 28845, 28856, 28846, 28836, 29232, 29298, 29295, - 29300, 29417, 29408, 29409, 29623, 29642, 29627, 29618, 29645, 29632, - 29619, 29978, 29997, 30031, 30028, 30030, 30027, 30123, 30116, 30117, - 30114, 30115, 30328, 30342, 30343, 30344, 30408, 30406, 30403, 30405, - 30465, 30457, 30456, 30473, 30475, 30462, 30460, 30471, 30684, 30722, - 30740, 30732, 30733, 31046, 31049, 31048, 31047, 31161, 31162, 31185, - 31186, 31179, 31359, 31361, 31487, 31485, 31869, 32002, 32005, 32000, - 32009, 32007, 32004, 32006, 32568, 32654, 32703, 32772, 32784, 32781, - 32785, 32822, 32982, 32997, 32986, 32963, 32964, 32972, 32993, 32987, - 32974, 32990, 32996, 32989, 33268, 33314, 33511, 33539, 33541, 33507, - 33499, 33510, 33540, 33509, 33538, 33545, 33490, 33495, 33521, 33537, - 33500, 33492, 33489, 33502, 33491, 33503, 33519, 33542, 34384, 34425, - 34427, 34426, 34893, 34923, 35201, 35284, 35336, 35330, 35331, 35998, - 36000, 36212, 36211, 36276, 36557, 36556, 36848, 36838, 36834, 36842, - 36837, 36845, 36843, 36836, 36840, 37066, 37070, 37057, 37059, 37195, - 37194, 37325, 38274, 38480, 38475, 38476, 38477, 38754, 38761, 38859, - 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 20056, 20147, - 20492, 20493, 20515, 20463, 20518, 20517, 20472, 20521, 20502, 20486, - 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, 20520, 20465, - 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, 20478, 20523, - 20489, 20860, 20900, 20901, 20898, 20941, 20940, 20934, 20939, 21078, - 21084, 21076, 21083, 21085, 21290, 21375, 21407, 21405, 21471, 21736, - 21776, 21761, 21815, 21756, 21733, 21746, 21766, 21754, 21780, 21737, - 21741, 21729, 21769, 21742, 21738, 21734, 21799, 21767, 21757, 21775, - 22275, 22276, 22466, 22484, 22475, 22467, 22537, 22799, 22871, 22872, - 22874, 23057, 23064, 23068, 23071, 23067, 23059, 23020, 23072, 23075, - 23081, 23077, 23052, 23049, 23403, 23640, 23472, 23475, 23478, 23476, - 23470, 23477, 23481, 23480, 23556, 23633, 23637, 23632, 23789, 23805, - 23803, 23786, 23784, 23792, 23798, 23809, 23796, 24046, 24109, 24107, - 24235, 24237, 24231, 24369, 24466, 24465, 24464, 24665, 24675, 24677, - 24656, 24661, 24685, 24681, 24687, 24708, 24735, 24730, 24717, 24724, - 24716, 24709, 24726, 25159, 25331, 25352, 25343, 25422, 25406, 25391, - 25429, 25410, 25414, 25423, 25417, 25402, 25424, 25405, 25386, 25387, - 25384, 25421, 25420, 25928, 25929, 26009, 26049, 26053, 26178, 26185, - 26191, 26179, 26194, 26188, 26181, 26177, 26360, 26388, 26389, 26391, - 26657, 26680, 26696, 26694, 26707, 26681, 26690, 26708, 26665, 26803, - 26647, 26700, 26705, 26685, 26612, 26704, 26688, 26684, 26691, 26666, - 26693, 26643, 26648, 26689, 27530, 27529, 27575, 27683, 27687, 27688, - 27686, 27684, 27888, 28010, 28053, 28040, 28039, 28006, 28024, 28023, - 27993, 28051, 28012, 28041, 28014, 27994, 28020, 28009, 28044, 28042, - 28025, 28037, 28005, 28052, 28874, 28888, 28900, 28889, 28872, 28879, - 29241, 29305, 29436, 29433, 29437, 29432, 29431, 29574, 29677, 29705, - 29678, 29664, 29674, 29662, 30036, 30045, 30044, 30042, 30041, 30142, - 30149, 30151, 30130, 30131, 30141, 30140, 30137, 30146, 30136, 30347, - 30384, 30410, 30413, 30414, 30505, 30495, 30496, 30504, 30697, 30768, - 30759, 30776, 30749, 30772, 30775, 30757, 30765, 30752, 30751, 30770, - 31061, 31056, 31072, 31071, 31062, 31070, 31069, 31063, 31066, 31204, - 31203, 31207, 31199, 31206, 31209, 31192, 31364, 31368, 31449, 31494, - 31505, 31881, 32033, 32023, 32011, 32010, 32032, 32034, 32020, 32016, - 32021, 32026, 32028, 32013, 32025, 32027, 32570, 32607, 32660, 32709, - 32705, 32774, 32792, 32789, 32793, 32791, 32829, 32831, 33009, 33026, - 33008, 33029, 33005, 33012, 33030, 33016, 33011, 33032, 33021, 33034, - 33020, 33007, 33261, 33260, 33280, 33296, 33322, 33323, 33320, 33324, - 33467, 33579, 33618, 33620, 33610, 33592, 33616, 33609, 33589, 33588, - 33615, 33586, 33593, 33590, 33559, 33600, 33585, 33576, 33603, 34388, - 34442, 34474, 34451, 34468, 34473, 34444, 34467, 34460, 34928, 34935, - 34945, 34946, 34941, 34937, 35352, 35344, 35342, 35340, 35349, 35338, - 35351, 35347, 35350, 35343, 35345, 35912, 35962, 35961, 36001, 36002, - 36215, 36524, 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, - 36858, 36852, 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, - 37202, 37197, 37196, 37336, 37341, 37335, 37340, 37337, 38275, 38498, - 38499, 38497, 38491, 38493, 38500, 38488, 38494, 38587, 39138, 39340, - 39592, 39640, 39717, 39730, 39740, 20094, 20602, 20605, 20572, 20551, - 20547, 20556, 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, - 20599, 20559, 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, - 21202, 21209, 21208, 21205, 21264, 21263, 21273, 21311, 21312, 21310, - 21443, 26364, 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, - 21809, 21846, 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, - 21859, 21811, 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, - 22534, 22496, 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, - 23094, 23105, 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, - 23114, 23408, 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, - 23559, 23648, 23644, 23645, 23815, 23814, 23822, 23835, 23830, 23842, - 23825, 23849, 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, - 24115, 24119, 24247, 24248, 24246, 24245, 24254, 24373, 24375, 24407, - 24428, 24425, 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, - 24703, 24739, 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, - 24763, 24757, 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, - 24775, 25114, 25115, 25160, 25504, 25511, 25458, 25494, 25506, 25509, - 25463, 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, - 25512, 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, - 25449, 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, - 25944, 25941, 25940, 26012, 26011, 26028, 26063, 26059, 26060, 26062, - 26205, 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, - 26799, 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, - 26755, 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, - 26754, 27442, 27578, 27627, 27628, 27691, 28046, 28092, 28147, 28121, - 28082, 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, - 28113, 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, - 28085, 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, - 28074, 28140, 28095, 28134, 28921, 28937, 28938, 28925, 28911, 29245, - 29309, 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, - 29699, 29702, 29694, 29709, 29920, 29942, 29943, 29980, 29986, 30053, - 30054, 30050, 30064, 30095, 30164, 30165, 30133, 30154, 30157, 30350, - 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, 30522, 30827, - 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, 31520, 31528, - 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, 31893, 32070, - 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, 32068, 32047, - 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, 32722, 32796, - 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, 33060, 33282, - 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, 33698, 33686, - 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, 33659, 33660, - 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, 34485, 34502, - 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, 34962, 34966, - 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, 35377, 35373, - 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, 36008, 36010, - 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, 36877, 36890, - 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, 36879, 36898, - 36886, 36891, 36884, 37096, 37101, 37117, 37207, 37326, 37365, 37350, - 37347, 37351, 37357, 37353, 38281, 38506, 38517, 38515, 38520, 38512, - 38516, 38518, 38519, 38508, 38592, 38634, 38633, 31456, 31455, 38914, - 38915, 39770, 40165, 40565, 40575, 40613, 40635, 20642, 20621, 20613, - 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, 21106, 21108, - 21109, 21097, 21214, 21213, 21211, 21338, 21413, 21883, 21888, 21927, - 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, 21895, 21899, - 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, 21932, 21937, - 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, 22564, 22576, - 22577, 22561, 22557, 22560, 22777, 22778, 22880, 23159, 23194, 23167, - 23186, 23195, 23207, 23411, 23409, 23506, 23500, 23507, 23504, 23562, - 23563, 23601, 23884, 23888, 23860, 23879, 24061, 24133, 24125, 24128, - 24131, 24190, 24266, 24257, 24258, 24260, 24380, 24429, 24489, 24490, - 24488, 24785, 24801, 24754, 24758, 24800, 24860, 24867, 24826, 24853, - 24816, 24827, 24820, 24936, 24817, 24846, 24822, 24841, 24832, 24850, - 25119, 25161, 25507, 25484, 25551, 25536, 25577, 25545, 25542, 25549, - 25554, 25571, 25552, 25569, 25558, 25581, 25582, 25462, 25588, 25578, - 25563, 25682, 25562, 25593, 25950, 25958, 25954, 25955, 26001, 26000, - 26031, 26222, 26224, 26228, 26230, 26223, 26257, 26234, 26238, 26231, - 26366, 26367, 26399, 26397, 26874, 26837, 26848, 26840, 26839, 26885, - 26847, 26869, 26862, 26855, 26873, 26834, 26866, 26851, 26827, 26829, - 26893, 26898, 26894, 26825, 26842, 26990, 26875, 27454, 27450, 27453, - 27544, 27542, 27580, 27631, 27694, 27695, 27692, 28207, 28216, 28244, - 28193, 28210, 28263, 28234, 28192, 28197, 28195, 28187, 28251, 28248, - 28196, 28246, 28270, 28205, 28198, 28271, 28212, 28237, 28218, 28204, - 28227, 28189, 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, - 28265, 28255, 28953, 28954, 28966, 28976, 28961, 28982, 29038, 28956, - 29260, 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, - 29730, 29733, 29749, 29750, 29748, 29743, 29723, 29734, 29736, 29989, - 29990, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, 30176, - 30331, 30332, 30358, 30355, 30388, 30428, 30543, 30701, 30813, 30828, - 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, 31461, - 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, 31567, - 31569, 31903, 31909, 32094, 32080, 32104, 32085, 32043, 32110, 32114, - 32097, 32102, 32098, 32112, 32115, 21892, 32724, 32725, 32779, 32850, - 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, 33086, 33100, - 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, 33760, 33733, - 33803, 33729, 33775, 33777, 33780, 33879, 33802, 33776, 33804, 33740, - 33789, 33778, 33738, 33848, 33806, 33796, 33756, 33799, 33748, 33759, - 34395, 34527, 34521, 34541, 34516, 34523, 34532, 34512, 34526, 34903, - 35009, 35010, 34993, 35203, 35222, 35387, 35424, 35413, 35422, 35388, - 35393, 35412, 35419, 35408, 35398, 35380, 35386, 35382, 35414, 35937, - 35970, 36015, 36028, 36019, 36029, 36033, 36027, 36032, 36020, 36023, - 36022, 36031, 36024, 36234, 36229, 36225, 36302, 36317, 36299, 36314, - 36305, 36300, 36315, 36294, 36603, 36600, 36604, 36764, 36910, 36917, - 36913, 36920, 36914, 36918, 37122, 37109, 37129, 37118, 37219, 37221, - 37327, 37396, 37397, 37411, 37385, 37406, 37389, 37392, 37383, 37393, - 38292, 38287, 38283, 38289, 38291, 38290, 38286, 38538, 38542, 38539, - 38525, 38533, 38534, 38541, 38514, 38532, 38593, 38597, 38596, 38598, - 38599, 38639, 38642, 38860, 38917, 38918, 38920, 39143, 39146, 39151, - 39145, 39154, 39149, 39342, 39341, 40643, 40653, 40657, 20098, 20653, - 20661, 20658, 20659, 20677, 20670, 20652, 20663, 20667, 20655, 20679, - 21119, 21111, 21117, 21215, 21222, 21220, 21218, 21219, 21295, 21983, - 21992, 21971, 21990, 21966, 21980, 21959, 21969, 21987, 21988, 21999, - 21978, 21985, 21957, 21958, 21989, 21961, 22290, 22291, 22622, 22609, - 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, - 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, - 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, - 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, - 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, - 25121, 25122, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, - 25628, 25620, 25613, 25654, 25622, 25623, 25606, 25964, 26015, 26032, - 26263, 26249, 26247, 26248, 26262, 26244, 26264, 26253, 26371, 27028, - 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, - 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, - 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, - 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, - 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, - 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, - 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, - 29791, 29790, 29761, 29759, 29785, 29787, 29788, 30070, 30072, 30208, - 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, 30430, 30431, - 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, 30556, 30565, - 30568, 30562, 30702, 30862, 30896, 30871, 30872, 30860, 30857, 30844, - 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, 31260, 31258, - 31264, 31252, 31263, 31262, 31391, 31392, 31607, 31680, 31584, 31598, - 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, 32143, 32091, - 32622, 32617, 32618, 32626, 32681, 32680, 32676, 32854, 32856, 32902, - 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, 33145, 33146, - 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, 33894, 33899, - 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, 33901, 33862, - 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, 34558, 34555, - 34562, 34563, 34566, 34570, 34905, 35039, 35028, 35033, 35036, 35032, - 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, 35442, 35443, - 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, 35461, 35437, - 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, 35978, 35977, - 36042, 36039, 36040, 36036, 36018, 36035, 36034, 36037, 36321, 36319, - 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, 36611, 36617, - 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, 36948, 36924, - 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, 36929, 37138, - 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, 37437, 37440, - 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, 37445, 37433, - 37439, 37466, 38296, 38552, 38548, 38549, 38605, 38603, 38601, 38602, - 38647, 38651, 38649, 38646, 38742, 38772, 38774, 38928, 38929, 38931, - 38922, 38930, 38924, 39164, 39156, 39165, 39166, 39347, 39345, 39348, - 39649, 40169, 40578, 40718, 40723, 40736, 20711, 20718, 20709, 20694, - 20717, 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, - 21123, 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, - 22022, 22025, 22029, 22030, 22007, 22038, 22047, 22024, 22032, 22006, - 22296, 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, - 22781, 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, - 23254, 23256, 23267, 23413, 23518, 23527, 23521, 23525, 23526, 23528, - 23522, 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, - 24151, 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, - 24907, 24951, 24930, 24931, 24927, 24922, 24920, 24949, 25130, 25735, - 25688, 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, - 25723, 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, - 27029, 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, - 27088, 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, - 28467, 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, - 28418, 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, - 28459, 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, - 29081, 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, - 29796, 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, - 30217, 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, - 30887, 30899, 30889, 30883, 31118, 31119, 31117, 31278, 31281, 31402, - 31401, 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, - 31631, 31672, 31623, 31620, 31929, 31933, 31934, 32187, 32176, 32156, - 32189, 32190, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, - 32181, 32184, 32173, 32210, 32199, 32172, 32624, 32736, 32737, 32735, - 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, 33154, - 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, 33988, - 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, 33980, - 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, 34645, - 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, 35098, - 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, 35498, - 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, 36051, - 36049, 36050, 36203, 36249, 36245, 36348, 36628, 36626, 36629, 36627, - 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, 36955, - 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37504, 37509, - 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, 38305, 38312, - 38313, 38307, 38309, 38308, 38553, 38556, 38555, 38604, 38610, 38656, - 38780, 38789, 38902, 38935, 38936, 39087, 39089, 39171, 39173, 39180, - 39177, 39361, 39599, 39600, 39654, 39745, 39746, 40180, 40182, 40179, - 40636, 40763, 40778, 20740, 20736, 20731, 20725, 20729, 20738, 20744, - 20745, 20741, 20956, 21127, 21128, 21129, 21133, 21130, 21232, 21426, - 22062, 22075, 22073, 22066, 22079, 22068, 22057, 22099, 22094, 22103, - 22132, 22070, 22063, 22064, 22656, 22687, 22686, 22707, 22684, 22702, - 22697, 22694, 22893, 23305, 23291, 23307, 23285, 23308, 23304, 23534, - 23532, 23529, 23531, 23652, 23653, 23965, 23956, 24162, 24159, 24161, - 24290, 24282, 24287, 24285, 24291, 24288, 24392, 24433, 24503, 24501, - 24950, 24935, 24942, 24925, 24917, 24962, 24956, 24944, 24939, 24958, - 24999, 24976, 25003, 24974, 25004, 24986, 24996, 24980, 25006, 25134, - 25705, 25711, 25721, 25758, 25778, 25736, 25744, 25776, 25765, 25747, - 25749, 25769, 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, - 25779, 25973, 25975, 25976, 26286, 26283, 26292, 26289, 27171, 27167, - 27112, 27137, 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, - 27141, 27117, 27153, 27472, 27470, 27556, 27589, 27590, 28479, 28540, - 28548, 28497, 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, - 28538, 28528, 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, - 29100, 29105, 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, - 29822, 29824, 30079, 30240, 30249, 30239, 30244, 30246, 30241, 30242, - 30362, 30394, 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, - 30906, 30922, 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, - 31287, 31291, 31407, 31406, 31661, 31665, 31684, 31668, 31686, 31687, - 31681, 31648, 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, - 32221, 32232, 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, - 32629, 32631, 32687, 32745, 32806, 33179, 33180, 33181, 33184, 33178, - 33176, 34071, 34109, 34074, 34030, 34092, 34093, 34067, 34065, 34083, - 34081, 34068, 34028, 34085, 34047, 34054, 34690, 34676, 34678, 34656, - 34662, 34680, 34664, 34649, 34647, 34636, 34643, 34907, 34909, 35088, - 35079, 35090, 35091, 35093, 35082, 35516, 35538, 35527, 35524, 35477, - 35531, 35576, 35506, 35529, 35522, 35519, 35504, 35542, 35533, 35510, - 35513, 35547, 35916, 35918, 35948, 36064, 36062, 36070, 36068, 36076, - 36077, 36066, 36067, 36060, 36074, 36065, 36205, 36255, 36259, 36395, - 36368, 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, - 36635, 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, - 36968, 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, - 37251, 37573, 37563, 37559, 37610, 37548, 37604, 37569, 37555, 37564, - 37586, 37575, 37616, 37554, 38317, 38321, 38660, 38662, 38663, 38665, - 38752, 38797, 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, - 39186, 39192, 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, - 39607, 39662, 39663, 39719, 39749, 39748, 39799, 39791, 40198, 40201, - 40195, 40617, 40638, 40654, 22696, 40786, 20754, 20760, 20756, 20752, - 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, - 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, - 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, - 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, - 25032, 25136, 25797, 25793, 25803, 25787, 25788, 25818, 25796, 25799, - 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, - 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, - 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, - 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, - 28601, 28598, 28582, 28576, 28596, 29118, 29129, 29136, 29138, 29128, - 29141, 29113, 29134, 29145, 29148, 29123, 29124, 29544, 29852, 29859, - 29848, 29855, 29854, 29922, 29964, 29965, 30260, 30264, 30266, 30439, - 30437, 30624, 30622, 30623, 30629, 30952, 30938, 30956, 30951, 31142, - 31309, 31310, 31302, 31308, 31307, 31418, 31705, 31761, 31689, 31716, - 31707, 31713, 31721, 31718, 31957, 31958, 32266, 32273, 32264, 32283, - 32291, 32286, 32285, 32265, 32272, 32633, 32690, 32752, 32753, 32750, - 32808, 33203, 33193, 33192, 33275, 33288, 33368, 33369, 34122, 34137, - 34120, 34152, 34153, 34115, 34121, 34157, 34154, 34142, 34691, 34719, - 34718, 34722, 34701, 34913, 35114, 35122, 35109, 35115, 35105, 35242, - 35238, 35558, 35578, 35563, 35569, 35584, 35548, 35559, 35566, 35582, - 35585, 35586, 35575, 35565, 35571, 35574, 35580, 35947, 35949, 35987, - 36084, 36420, 36401, 36404, 36418, 36409, 36405, 36667, 36655, 36664, - 36659, 36776, 36774, 36981, 36980, 36984, 36978, 36988, 36986, 37172, - 37266, 37664, 37686, 37624, 37683, 37679, 37666, 37628, 37675, 37636, - 37658, 37648, 37670, 37665, 37653, 37678, 37657, 38331, 38567, 38568, - 38570, 38613, 38670, 38673, 38678, 38669, 38675, 38671, 38747, 38748, - 38758, 38808, 38960, 38968, 38971, 38967, 38957, 38969, 38948, 39184, - 39208, 39198, 39195, 39201, 39194, 39405, 39394, 39409, 39608, 39612, - 39675, 39661, 39720, 39825, 40213, 40227, 40230, 40232, 40210, 40219, - 40664, 40660, 40845, 40860, 20778, 20767, 20769, 20786, 21237, 22158, - 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, - 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, - 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, - 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, 25986, - 25987, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, 27299, - 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, 28657, - 28639, 28640, 28635, 28644, 28651, 28655, 28544, 28652, 28641, 28649, - 28629, 28654, 28656, 29159, 29151, 29166, 29158, 29157, 29165, 29164, - 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, 29862, 29864, - 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, 30631, 30637, - 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, 31319, 31423, - 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, 31966, 31970, - 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, 32323, 32299, - 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, 32319, 32303, - 32580, 32755, 32764, 32881, 32882, 32880, 32879, 32883, 33222, 33219, - 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, 33289, 33393, - 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, 34183, 34216, - 34186, 34407, 34752, 34769, 34739, 34770, 34758, 34731, 34747, 34746, - 34760, 34763, 35131, 35126, 35140, 35128, 35133, 35244, 35598, 35607, - 35609, 35611, 35594, 35616, 35613, 35588, 35600, 35905, 35903, 35955, - 36090, 36093, 36092, 36088, 36091, 36264, 36425, 36427, 36424, 36426, - 36676, 36670, 36674, 36677, 36671, 36991, 36989, 36996, 36993, 36994, - 36992, 37177, 37283, 37278, 37276, 37709, 37762, 37672, 37749, 37706, - 37733, 37707, 37656, 37758, 37740, 37723, 37744, 37722, 37716, 38346, - 38347, 38348, 38344, 38342, 38577, 38584, 38614, 38684, 38686, 38816, - 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, 39850, 39853, - 40251, 40255, 40587, 40655, 40670, 40668, 40669, 40667, 40766, 40779, - 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, 25139, 25844, - 25842, 25854, 25862, 25850, 25851, 25847, 26039, 26332, 26406, 27315, - 27308, 27331, 27323, 27320, 27330, 27310, 27311, 27487, 27512, 27567, - 28681, 28683, 28670, 28678, 28666, 28689, 28687, 29179, 29180, 29182, - 29176, 29559, 29557, 29863, 29887, 29973, 30294, 30296, 30290, 30653, - 30655, 30651, 30652, 30990, 31150, 31329, 31330, 31328, 31428, 31429, - 31787, 31783, 31786, 31774, 31779, 31777, 31975, 32340, 32341, 32350, - 32346, 32353, 32338, 32345, 32584, 32761, 32763, 32887, 32886, 33229, - 33231, 33290, 34255, 34217, 34253, 34256, 34249, 34224, 34234, 34233, - 34214, 34799, 34796, 34802, 34784, 35206, 35250, 35316, 35624, 35641, - 35628, 35627, 35920, 36101, 36441, 36451, 36454, 36452, 36447, 36437, - 36544, 36681, 36685, 36999, 36995, 37000, 37291, 37292, 37328, 37780, - 37770, 37782, 37794, 37811, 37806, 37804, 37808, 37784, 37786, 37783, - 38356, 38358, 38352, 38357, 38626, 38620, 38617, 38619, 38622, 38692, - 38819, 38822, 38829, 38905, 38989, 38991, 38988, 38990, 38995, 39098, - 39230, 39231, 39229, 39214, 39333, 39438, 39617, 39683, 39686, 39759, - 39758, 39757, 39882, 39881, 39933, 39880, 39872, 40273, 40285, 40288, - 40672, 40725, 40748, 20787, 22181, 22750, 22751, 22754, 23541, 40848, - 24300, 25074, 25079, 25078, 25077, 25856, 25871, 26336, 26333, 27365, - 27357, 27354, 27347, 28699, 28703, 28712, 28698, 28701, 28693, 28696, - 29190, 29197, 29272, 29346, 29560, 29562, 29885, 29898, 29923, 30087, - 30086, 30303, 30305, 30663, 31001, 31153, 31339, 31337, 31806, 31807, - 31800, 31805, 31799, 31808, 32363, 32365, 32377, 32361, 32362, 32645, - 32371, 32694, 32697, 32696, 33240, 34281, 34269, 34282, 34261, 34276, - 34277, 34295, 34811, 34821, 34829, 34809, 34814, 35168, 35167, 35158, - 35166, 35649, 35676, 35672, 35657, 35674, 35662, 35663, 35654, 35673, - 36104, 36106, 36476, 36466, 36487, 36470, 36460, 36474, 36468, 36692, - 36686, 36781, 37002, 37003, 37297, 37294, 37857, 37841, 37855, 37827, - 37832, 37852, 37853, 37846, 37858, 37837, 37848, 37860, 37847, 37864, - 38364, 38580, 38627, 38698, 38695, 38753, 38876, 38907, 39006, 39000, - 39003, 39100, 39237, 39241, 39446, 39449, 39693, 39912, 39911, 39894, - 39899, 40329, 40289, 40306, 40298, 40300, 40594, 40599, 40595, 40628, - 21240, 22184, 22199, 22198, 22196, 22204, 22756, 23360, 23363, 23421, - 23542, 24009, 25080, 25082, 25880, 25876, 25881, 26342, 26407, 27372, - 28734, 28720, 28722, 29200, 29563, 29903, 30306, 30309, 31014, 31018, - 31020, 31019, 31431, 31478, 31820, 31811, 31821, 31983, 31984, 36782, - 32381, 32380, 32386, 32588, 32768, 33242, 33382, 34299, 34297, 34321, - 34298, 34310, 34315, 34311, 34314, 34836, 34837, 35172, 35258, 35320, - 35696, 35692, 35686, 35695, 35679, 35691, 36111, 36109, 36489, 36481, - 36485, 36482, 37300, 37323, 37912, 37891, 37885, 38369, 38704, 39108, - 39250, 39249, 39336, 39467, 39472, 39479, 39477, 39955, 39949, 40569, - 40629, 40680, 40751, 40799, 40803, 40801, 20791, 20792, 22209, 22208, - 22210, 22804, 23660, 24013, 25084, 25086, 25885, 25884, 26005, 26345, - 27387, 27396, 27386, 27570, 28748, 29211, 29351, 29910, 29908, 30313, - 30675, 31824, 32399, 32396, 32700, 34327, 34349, 34330, 34851, 34850, - 34849, 34847, 35178, 35180, 35261, 35700, 35703, 35709, 36115, 36490, - 36493, 36491, 36703, 36783, 37306, 37934, 37939, 37941, 37946, 37944, - 37938, 37931, 38370, 38712, 38713, 38706, 38911, 39015, 39013, 39255, - 39493, 39491, 39488, 39486, 39631, 39764, 39761, 39981, 39973, 40367, - 40372, 40386, 40376, 40605, 40687, 40729, 40796, 40806, 40807, 20796, - 20795, 22216, 22218, 22217, 23423, 24020, 24018, 24398, 25087, 25892, - 27402, 27489, 28753, 28760, 29568, 29924, 30090, 30318, 30316, 31155, - 31840, 31839, 32894, 32893, 33247, 35186, 35183, 35324, 35712, 36118, - 36119, 36497, 36499, 36705, 37192, 37956, 37969, 37970, 38717, 38718, - 38851, 38849, 39019, 39253, 39509, 39501, 39634, 39706, 40009, 39985, - 39998, 39995, 40403, 40407, 40756, 40812, 40810, 40852, 22220, 24022, - 25088, 25891, 25899, 25898, 26348, 27408, 29914, 31434, 31844, 31843, - 31845, 32403, 32406, 32404, 33250, 34360, 34367, 34865, 35722, 37008, - 37007, 37987, 37984, 37988, 38760, 39023, 39260, 39514, 39515, 39511, - 39635, 39636, 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, - 22761, 25900, 28766, 30321, 30322, 30679, 32592, 32648, 34870, 34873, - 34914, 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, - 38724, 38854, 39024, 39519, 39714, 39768, 40031, 40441, 40442, 40572, - 40573, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, 34875, - 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, 40652, - 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, 36522, - 37317, 38013, 38014, 38012, 40055, 40056, 40695, 35924, 38015, 40474, - 29224, 39530, 39729, 40475, 40478, 31858, 9312, 9313, 9314, 9315, - 9316, 9317, 9318, 9319, 9320, 9321, 9332, 9333, 9334, 9335, - 9336, 9337, 9338, 9339, 9340, 9341, 8560, 8561, 8562, 8563, - 8564, 8565, 8566, 8567, 8568, 8569, 20022, 20031, 20101, 20128, - 20866, 20886, 20907, 21241, 21304, 21353, 21430, 22794, 23424, 24027, - 12083, 24191, 24308, 24400, 24417, 25908, 26080, 30098, 30326, 36789, - 38582, 168, 710, 12541, 12542, 12445, 12446, 12291, 20189, 12293, - 12294, 12295, 12540, 65339, 65341, 10045, 12353, 12354, 12355, 12356, - 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, - 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, - 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, - 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, - 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, - 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, - 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, - 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 12449, - 12450, 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, - 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, - 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, - 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, - 12490, 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, - 12500, 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, - 12510, 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, - 12520, 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, - 12530, 12531, 12532, 12533, 12534, 1040, 1041, 1042, 1043, 1044, - 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, - 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, - 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, - 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, - 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, - 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, - 1103, 8679, 8632, 8633, 12751, 131276, 20058, 131210, 20994, 17553, - 40880, 20872, 40881, 161287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 65506, 65508, 65287, 65282, 12849, 8470, - 8481, 12443, 12444, 11904, 11908, 11910, 11911, 11912, 11914, 11916, - 11917, 11925, 11932, 11933, 11941, 11943, 11946, 11948, 11950, 11958, - 11964, 11966, 11974, 11978, 11980, 11981, 11983, 11990, 11991, 11998, - 12003, 0x0000, 0x0000, 0x0000, 643, 592, 603, 596, 629, 339, - 248, 331, 650, 618, 20034, 20060, 20981, 21274, 21378, 19975, - 19980, 20039, 20109, 22231, 64012, 23662, 24435, 19983, 20871, 19982, - 20014, 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, - 22787, 22828, 23568, 24063, 26081, 27571, 27596, 27668, 29247, 20017, - 20028, 20200, 20188, 20201, 20193, 20189, 20186, 21004, 21276, 21324, - 22306, 22307, 22807, 22831, 23425, 23428, 23570, 23611, 23668, 23667, - 24068, 24192, 24194, 24521, 25097, 25168, 27669, 27702, 27715, 27711, - 27707, 29358, 29360, 29578, 31160, 32906, 38430, 20238, 20248, 20268, - 20213, 20244, 20209, 20224, 20215, 20232, 20253, 20226, 20229, 20258, - 20243, 20228, 20212, 20242, 20913, 21011, 21001, 21008, 21158, 21282, - 21279, 21325, 21386, 21511, 22241, 22239, 22318, 22314, 22324, 22844, - 22912, 22908, 22917, 22907, 22910, 22903, 22911, 23382, 23573, 23589, - 23676, 23674, 23675, 23678, 24031, 24181, 24196, 24322, 24346, 24436, - 24533, 24532, 24527, 25180, 25182, 25188, 25185, 25190, 25186, 25177, - 25184, 25178, 25189, 26095, 26094, 26430, 26425, 26424, 26427, 26426, - 26431, 26428, 26419, 27672, 27718, 27730, 27740, 27727, 27722, 27732, - 27723, 27724, 28785, 29278, 29364, 29365, 29582, 29994, 30335, 31349, - 32593, 33400, 33404, 33408, 33405, 33407, 34381, 35198, 37017, 37015, - 37016, 37019, 37012, 38434, 38436, 38432, 38435, 20310, 20283, 20322, - 20297, 20307, 20324, 20286, 20327, 20306, 20319, 20289, 20312, 20269, - 20275, 20287, 20321, 20879, 20921, 21020, 21022, 21025, 21165, 21166, - 21257, 21347, 21362, 21390, 21391, 21552, 21559, 21546, 21588, 21573, - 21529, 21532, 21541, 21528, 21565, 21583, 21569, 21544, 21540, 21575, - 22254, 22247, 22245, 22337, 22341, 22348, 22345, 22347, 22354, 22790, - 22848, 22950, 22936, 22944, 22935, 22926, 22946, 22928, 22927, 22951, - 22945, 23438, 23442, 23592, 23594, 23693, 23695, 23688, 23691, 23689, - 23698, 23690, 23686, 23699, 23701, 24032, 24074, 24078, 24203, 24201, - 24204, 24200, 24205, 24325, 24349, 24440, 24438, 24530, 24529, 24528, - 24557, 24552, 24558, 24563, 24545, 24548, 24547, 24570, 24559, 24567, - 24571, 24576, 24564, 25146, 25219, 25228, 25230, 25231, 25236, 25223, - 25201, 25211, 25210, 25200, 25217, 25224, 25207, 25213, 25202, 25204, - 25911, 26096, 26100, 26099, 26098, 26101, 26437, 26439, 26457, 26453, - 26444, 26440, 26461, 26445, 26458, 26443, 27600, 27673, 27674, 27768, - 27751, 27755, 27780, 27787, 27791, 27761, 27759, 27753, 27802, 27757, - 27783, 27797, 27804, 27750, 27763, 27749, 27771, 27790, 28788, 28794, - 29283, 29375, 29373, 29379, 29382, 29377, 29370, 29381, 29589, 29591, - 29587, 29588, 29586, 30010, 30009, 30100, 30101, 30337, 31037, 32820, - 32917, 32921, 32912, 32914, 32924, 33424, 33423, 33413, 33422, 33425, - 33427, 33418, 33411, 33412, 35960, 36809, 36799, 37023, 37025, 37029, - 37022, 37031, 37024, 38448, 38440, 38447, 38445, 20019, 20376, 20348, - 20357, 20349, 20352, 20359, 20342, 20340, 20361, 20356, 20343, 20300, - 20375, 20330, 20378, 20345, 20353, 20344, 20368, 20380, 20372, 20382, - 20370, 20354, 20373, 20331, 20334, 20894, 20924, 20926, 21045, 21042, - 21043, 21062, 21041, 21180, 21258, 21259, 21308, 21394, 21396, 21639, - 21631, 21633, 21649, 21634, 21640, 21611, 21626, 21630, 21605, 21612, - 21620, 21606, 21645, 21615, 21601, 21600, 21656, 21603, 21607, 21604, - 22263, 22265, 22383, 22386, 22381, 22379, 22385, 22384, 22390, 22400, - 22389, 22395, 22387, 22388, 22370, 22376, 22397, 22796, 22853, 22965, - 22970, 22991, 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, - 22961, 22973, 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, - 23620, 23623, 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, - 23715, 23725, 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, - 24087, 24084, 24089, 24360, 24354, 24355, 24356, 24404, 24450, 24446, - 24445, 24542, 24549, 24621, 24614, 24601, 24626, 24587, 24628, 24586, - 24599, 24627, 24602, 24606, 24620, 24610, 24589, 24592, 24622, 24595, - 24593, 24588, 24585, 24604, 25108, 25149, 25261, 25268, 25297, 25278, - 25258, 25270, 25290, 25262, 25267, 25263, 25275, 25257, 25264, 25272, - 25917, 26024, 26043, 26121, 26108, 26116, 26130, 26120, 26107, 26115, - 26123, 26125, 26117, 26109, 26129, 26128, 26358, 26378, 26501, 26476, - 26510, 26514, 26486, 26491, 26520, 26502, 26500, 26484, 26509, 26508, - 26490, 26527, 26513, 26521, 26499, 26493, 26497, 26488, 26489, 26516, - 27429, 27520, 27518, 27614, 27677, 27795, 27884, 27883, 27886, 27865, - 27830, 27860, 27821, 27879, 27831, 27856, 27842, 27834, 27843, 27846, - 27885, 27890, 27858, 27869, 27828, 27786, 27805, 27776, 27870, 27840, - 27952, 27853, 27847, 27824, 27897, 27855, 27881, 27857, 28820, 28824, - 28805, 28819, 28806, 28804, 28817, 28822, 28802, 28826, 28803, 29290, - 29398, 29387, 29400, 29385, 29404, 29394, 29396, 29402, 29388, 29393, - 29604, 29601, 29613, 29606, 29602, 29600, 29612, 29597, 29917, 29928, - 30015, 30016, 30014, 30092, 30104, 30383, 30451, 30449, 30448, 30453, - 30712, 30716, 30713, 30715, 30714, 30711, 31042, 31039, 31173, 31352, - 31355, 31483, 31861, 31997, 32821, 32911, 32942, 32931, 32952, 32949, - 32941, 33312, 33440, 33472, 33451, 33434, 33432, 33435, 33461, 33447, - 33454, 33468, 33438, 33466, 33460, 33448, 33441, 33449, 33474, 33444, - 33475, 33462, 33442, 34416, 34415, 34413, 34414, 35926, 36818, 36811, - 36819, 36813, 36822, 36821, 36823, 37042, 37044, 37039, 37043, 37040, - 38457, 38461, 38460, 38458, 38467, 20429, 20421, 20435, 20402, 20425, - 20427, 20417, 20436, 20444, 20441, 20411, 20403, 20443, 20423, 20438, - 20410, 20416, 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, - 21399, 21398, 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, - 33549, 21687, 21678, 21718, 21686, 21701, 21702, 21664, 21616, 21692, - 21666, 21694, 21618, 21726, 21680, 22453, 22430, 22431, 22436, 22412, - 22423, 22429, 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, - 22772, 22797, 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, - 23037, 23036, 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, - 23008, 23038, 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, - 23755, 23771, 23774, 23770, 23753, 23751, 23754, 23766, 23763, 23764, - 23759, 23752, 23750, 23758, 23775, 23800, 24057, 24097, 24098, 24099, - 24096, 24100, 24240, 24228, 24226, 24219, 24227, 24229, 24327, 24366, - 24406, 24454, 24631, 24633, 24660, 24690, 24670, 24645, 24659, 24647, - 24649, 24667, 24652, 24640, 24642, 24671, 24612, 24644, 24664, 24678, - 24686, 25154, 25155, 25295, 25357, 25355, 25333, 25358, 25347, 25323, - 25337, 25359, 25356, 25336, 25334, 25344, 25363, 25364, 25338, 25365, - 25339, 25328, 25921, 25923, 26026, 26047, 26166, 26145, 26162, 26165, - 26140, 26150, 26146, 26163, 26155, 26170, 26141, 26164, 26169, 26158, - 26383, 26384, 26561, 26610, 26568, 26554, 26588, 26555, 26616, 26584, - 26560, 26551, 26565, 26603, 26596, 26591, 26549, 26573, 26547, 26615, - 26614, 26606, 26595, 26562, 26553, 26574, 26599, 26608, 26546, 26620, - 26566, 26605, 26572, 26542, 26598, 26587, 26618, 26569, 26570, 26563, - 26602, 26571, 27432, 27522, 27524, 27574, 27606, 27608, 27616, 27680, - 27681, 27944, 27956, 27949, 27935, 27964, 27967, 27922, 27914, 27866, - 27955, 27908, 27929, 27962, 27930, 27921, 27904, 27933, 27970, 27905, - 27928, 27959, 27907, 27919, 27968, 27911, 27936, 27948, 27912, 27938, - 27913, 27920, 28855, 28831, 28862, 28849, 28848, 28833, 28852, 28853, - 28841, 29249, 29257, 29258, 29292, 29296, 29299, 29294, 29386, 29412, - 29416, 29419, 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, - 29637, 29625, 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, - 29638, 29624, 29643, 29932, 29934, 29998, 30023, 30024, 30119, 30122, - 30329, 30404, 30472, 30467, 30468, 30469, 30474, 30455, 30459, 30458, - 30695, 30696, 30726, 30737, 30738, 30725, 30736, 30735, 30734, 30729, - 30723, 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, - 31190, 31182, 31360, 31358, 31441, 31488, 31489, 31866, 31864, 31865, - 31871, 31872, 31873, 32003, 32008, 32001, 32600, 32657, 32653, 32702, - 32775, 32782, 32783, 32788, 32823, 32984, 32967, 32992, 32977, 32968, - 32962, 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, - 32983, 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, - 33512, 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, - 33525, 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, - 33517, 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, - 35283, 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, - 37055, 37077, 37061, 37054, 37063, 37067, 37064, 37332, 37331, 38484, - 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, - 20528, 20507, 20469, 20468, 20531, 20535, 20524, 20470, 20471, 20503, - 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, - 20938, 20932, 20933, 20936, 20942, 21089, 21082, 21074, 21086, 21087, - 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, 21778, 21735, - 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, 21765, 21745, - 21770, 21755, 21751, 21752, 21728, 21774, 21763, 21771, 22273, 22274, - 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, 22456, 22454, - 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, 23062, 23085, - 23086, 23061, 23055, 23063, 23050, 23070, 23091, 23404, 23463, 23469, - 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, 23799, 23808, - 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, 24368, 24423, - 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, 24705, 24733, - 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, 25158, 25330, - 25360, 25430, 25388, 25412, 25413, 25398, 25411, 25572, 25401, 25419, - 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, 25389, 25415, - 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, 25926, 26054, - 26051, 26052, 26050, 26186, 26207, 26183, 26193, 26386, 26387, 26655, - 26650, 26697, 26674, 26675, 26683, 26699, 26703, 26646, 26673, 26652, - 26677, 26667, 26669, 26671, 26702, 26692, 26676, 26653, 26642, 26644, - 26662, 26664, 26670, 26701, 26682, 26661, 26656, 27436, 27439, 27437, - 27441, 27444, 27501, 32898, 27528, 27622, 27620, 27624, 27619, 27618, - 27623, 27685, 28026, 28003, 28004, 28022, 27917, 28001, 28050, 27992, - 28002, 28013, 28015, 28049, 28045, 28143, 28031, 28038, 27998, 28007, - 28000, 28055, 28016, 28028, 27999, 28034, 28056, 27951, 28008, 28043, - 28030, 28032, 28036, 27926, 28035, 28027, 28029, 28021, 28048, 28892, - 28883, 28881, 28893, 28875, 32569, 28898, 28887, 28882, 28894, 28896, - 28884, 28877, 28869, 28870, 28871, 28890, 28878, 28897, 29250, 29304, - 29303, 29302, 29440, 29434, 29428, 29438, 29430, 29427, 29435, 29441, - 29651, 29657, 29669, 29654, 29628, 29671, 29667, 29673, 29660, 29650, - 29659, 29652, 29661, 29658, 29655, 29656, 29672, 29918, 29919, 29940, - 29941, 29985, 30043, 30047, 30128, 30145, 30139, 30148, 30144, 30143, - 30134, 30138, 30346, 30409, 30493, 30491, 30480, 30483, 30482, 30499, - 30481, 30485, 30489, 30490, 30498, 30503, 30755, 30764, 30754, 30773, - 30767, 30760, 30766, 30763, 30753, 30761, 30771, 30762, 30769, 31060, - 31067, 31055, 31068, 31059, 31058, 31057, 31211, 31212, 31200, 31214, - 31213, 31210, 31196, 31198, 31197, 31366, 31369, 31365, 31371, 31372, - 31370, 31367, 31448, 31504, 31492, 31507, 31493, 31503, 31496, 31498, - 31502, 31497, 31506, 31876, 31889, 31882, 31884, 31880, 31885, 31877, - 32030, 32029, 32017, 32014, 32024, 32022, 32019, 32031, 32018, 32015, - 32012, 32604, 32609, 32606, 32608, 32605, 32603, 32662, 32658, 32707, - 32706, 32704, 32790, 32830, 32825, 33018, 33010, 33017, 33013, 33025, - 33019, 33024, 33281, 33327, 33317, 33587, 33581, 33604, 33561, 33617, - 33573, 33622, 33599, 33601, 33574, 33564, 33570, 33602, 33614, 33563, - 33578, 33544, 33596, 33613, 33558, 33572, 33568, 33591, 33583, 33577, - 33607, 33605, 33612, 33619, 33566, 33580, 33611, 33575, 33608, 34387, - 34386, 34466, 34472, 34454, 34445, 34449, 34462, 34439, 34455, 34438, - 34443, 34458, 34437, 34469, 34457, 34465, 34471, 34453, 34456, 34446, - 34461, 34448, 34452, 34883, 34884, 34925, 34933, 34934, 34930, 34944, - 34929, 34943, 34927, 34947, 34942, 34932, 34940, 35346, 35911, 35927, - 35963, 36004, 36003, 36214, 36216, 36277, 36279, 36278, 36561, 36563, - 36862, 36853, 36866, 36863, 36859, 36868, 36860, 36854, 37078, 37088, - 37081, 37082, 37091, 37087, 37093, 37080, 37083, 37079, 37084, 37092, - 37200, 37198, 37199, 37333, 37346, 37338, 38492, 38495, 38588, 39139, - 39647, 39727, 20095, 20592, 20586, 20577, 20574, 20576, 20563, 20555, - 20573, 20594, 20552, 20557, 20545, 20571, 20554, 20578, 20501, 20549, - 20575, 20585, 20587, 20579, 20580, 20550, 20544, 20590, 20595, 20567, - 20561, 20944, 21099, 21101, 21100, 21102, 21206, 21203, 21293, 21404, - 21877, 21878, 21820, 21837, 21840, 21812, 21802, 21841, 21858, 21814, - 21813, 21808, 21842, 21829, 21772, 21810, 21861, 21838, 21817, 21832, - 21805, 21819, 21824, 21835, 22282, 22279, 22523, 22548, 22498, 22518, - 22492, 22516, 22528, 22509, 22525, 22536, 22520, 22539, 22515, 22479, - 22535, 22510, 22499, 22514, 22501, 22508, 22497, 22542, 22524, 22544, - 22503, 22529, 22540, 22513, 22505, 22512, 22541, 22532, 22876, 23136, - 23128, 23125, 23143, 23134, 23096, 23093, 23149, 23120, 23135, 23141, - 23148, 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, - 23182, 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, - 23106, 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, - 23834, 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, - 23843, 23839, 23854, 24126, 24116, 24241, 24244, 24249, 24242, 24243, - 24374, 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, - 24762, 24787, 24788, 24783, 24804, 24793, 24797, 24776, 24753, 24795, - 24759, 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, - 25469, 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, - 25488, 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, - 25503, 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, - 26209, 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, - 26733, 26734, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, - 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, - 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, - 26769, 26764, 26762, 26749, 27446, 27443, 27447, 27448, 27537, 27535, - 27533, 27534, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, - 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, - 28094, 28133, 28124, 28125, 28123, 28148, 28106, 28093, 28141, 28144, - 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, - 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, - 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, - 28939, 28930, 28942, 29310, 29307, 29308, 29311, 29469, 29463, 29447, - 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, - 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, - 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, 30155, 30156, - 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, 30513, 30514, - 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, - 30794, 30796, 30758, 30789, 30800, 31076, 31079, 31081, 31082, 31075, - 31083, 31073, 31163, 31226, 31224, 31222, 31223, 31375, 31380, 31376, - 31541, 31559, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, - 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, - 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, - 32041, 32065, 32071, 32062, 32063, 32074, 32059, 32040, 32611, 32661, - 32668, 32669, 32667, 32714, 32715, 32717, 32720, 32721, 32711, 32719, - 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, 33049, - 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, 33058, - 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, 33704, - 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, 33653, - 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, 33662, - 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, 33654, - 33690, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, - 34504, 34489, 34483, 34488, 34508, 34484, 34491, 34492, 34499, 34493, - 34494, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, 34977, - 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, 34963, - 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, 35897, - 35899, 35932, 35933, 35965, 36005, 36221, 36219, 36217, 36284, 36290, - 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, 36576, 36577, - 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, 37104, 37108, - 37106, 37107, 37076, 37099, 37100, 37097, 37206, 37208, 37210, 37203, - 37205, 37356, 37364, 37361, 37363, 37368, 37348, 37369, 37354, 37355, - 37367, 37352, 37358, 38266, 38278, 38280, 38524, 38509, 38507, 38513, - 38511, 38591, 38762, 38916, 39141, 39319, 20635, 20629, 20628, 20638, - 20619, 20643, 20611, 20620, 20622, 20637, 20584, 20636, 20626, 20610, - 20615, 20831, 20948, 21266, 21265, 21412, 21415, 21905, 21928, 21925, - 21933, 21879, 22085, 21922, 21907, 21896, 21903, 21941, 21889, 21923, - 21906, 21924, 21885, 21900, 21926, 21887, 21909, 21921, 21902, 22284, - 22569, 22583, 22553, 22558, 22567, 22563, 22568, 22517, 22600, 22565, - 22556, 22555, 22579, 22591, 22582, 22574, 22585, 22584, 22573, 22572, - 22587, 22881, 23215, 23188, 23199, 23162, 23202, 23198, 23160, 23206, - 23164, 23205, 23212, 23189, 23214, 23095, 23172, 23178, 23191, 23171, - 23179, 23209, 23163, 23165, 23180, 23196, 23183, 23187, 23197, 23530, - 23501, 23499, 23508, 23505, 23498, 23502, 23564, 23600, 23863, 23875, - 23915, 23873, 23883, 23871, 23861, 23889, 23886, 23893, 23859, 23866, - 23890, 23869, 23857, 23897, 23874, 23865, 23881, 23864, 23868, 23858, - 23862, 23872, 23877, 24132, 24129, 24408, 24486, 24485, 24491, 24777, - 24761, 24780, 24802, 24782, 24772, 24852, 24818, 24842, 24854, 24837, - 24821, 24851, 24824, 24828, 24830, 24769, 24835, 24856, 24861, 24848, - 24831, 24836, 24843, 25162, 25492, 25521, 25520, 25550, 25573, 25576, - 25583, 25539, 25757, 25587, 25546, 25568, 25590, 25557, 25586, 25589, - 25697, 25567, 25534, 25565, 25564, 25540, 25560, 25555, 25538, 25543, - 25548, 25547, 25544, 25584, 25559, 25561, 25906, 25959, 25962, 25956, - 25948, 25960, 25957, 25996, 26013, 26014, 26030, 26064, 26066, 26236, - 26220, 26235, 26240, 26225, 26233, 26218, 26226, 26369, 26892, 26835, - 26884, 26844, 26922, 26860, 26858, 26865, 26895, 26838, 26871, 26859, - 26852, 26870, 26899, 26896, 26867, 26849, 26887, 26828, 26888, 26992, - 26804, 26897, 26863, 26822, 26900, 26872, 26832, 26877, 26876, 26856, - 26891, 26890, 26903, 26830, 26824, 26845, 26846, 26854, 26868, 26833, - 26886, 26836, 26857, 26901, 26917, 26823, 27449, 27451, 27455, 27452, - 27540, 27543, 27545, 27541, 27581, 27632, 27634, 27635, 27696, 28156, - 28230, 28231, 28191, 28233, 28296, 28220, 28221, 28229, 28258, 28203, - 28223, 28225, 28253, 28275, 28188, 28211, 28235, 28224, 28241, 28219, - 28163, 28206, 28254, 28264, 28252, 28257, 28209, 28200, 28256, 28273, - 28267, 28217, 28194, 28208, 28243, 28261, 28199, 28280, 28260, 28279, - 28245, 28281, 28242, 28262, 28213, 28214, 28250, 28960, 28958, 28975, - 28923, 28974, 28977, 28963, 28965, 28962, 28978, 28959, 28968, 28986, - 28955, 29259, 29274, 29320, 29321, 29318, 29317, 29323, 29458, 29451, - 29488, 29474, 29489, 29491, 29479, 29490, 29485, 29478, 29475, 29493, - 29452, 29742, 29740, 29744, 29739, 29718, 29722, 29729, 29741, 29745, - 29732, 29731, 29725, 29737, 29728, 29746, 29947, 29999, 30063, 30060, - 30183, 30170, 30177, 30182, 30173, 30175, 30180, 30167, 30357, 30354, - 30426, 30534, 30535, 30532, 30541, 30533, 30538, 30542, 30539, 30540, - 30686, 30700, 30816, 30820, 30821, 30812, 30829, 30833, 30826, 30830, - 30832, 30825, 30824, 30814, 30818, 31092, 31091, 31090, 31088, 31234, - 31242, 31235, 31244, 31236, 31385, 31462, 31460, 31562, 31547, 31556, - 31560, 31564, 31566, 31552, 31576, 31557, 31906, 31902, 31912, 31905, - 32088, 32111, 32099, 32083, 32086, 32103, 32106, 32079, 32109, 32092, - 32107, 32082, 32084, 32105, 32081, 32095, 32078, 32574, 32575, 32613, - 32614, 32674, 32672, 32673, 32727, 32849, 32847, 32848, 33022, 32980, - 33091, 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, - 33271, 33272, 33273, 33284, 33340, 33341, 33343, 33397, 33595, 33743, - 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, 33782, 33808, - 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, 33752, 33791, - 33761, 33739, 33742, 33750, 33781, 33737, 33801, 33807, 33758, 33809, - 33798, 33730, 33779, 33749, 33786, 33735, 33745, 33770, 33811, 33731, - 33772, 33774, 33732, 33787, 33751, 33762, 33819, 33755, 33790, 34520, - 34530, 34534, 34515, 34531, 34522, 34538, 34525, 34539, 34524, 34540, - 34537, 34519, 34536, 34513, 34888, 34902, 34901, 35002, 35031, 35001, - 35000, 35008, 35006, 34998, 35004, 34999, 35005, 34994, 35073, 35017, - 35221, 35224, 35223, 35293, 35290, 35291, 35406, 35405, 35385, 35417, - 35392, 35415, 35416, 35396, 35397, 35410, 35400, 35409, 35402, 35404, - 35407, 35935, 35969, 35968, 36026, 36030, 36016, 36025, 36021, 36228, - 36224, 36233, 36312, 36307, 36301, 36295, 36310, 36316, 36303, 36309, - 36313, 36296, 36311, 36293, 36591, 36599, 36602, 36601, 36582, 36590, - 36581, 36597, 36583, 36584, 36598, 36587, 36593, 36588, 36596, 36585, - 36909, 36916, 36911, 37126, 37164, 37124, 37119, 37116, 37128, 37113, - 37115, 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, - 37216, 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, - 37394, 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, - 37399, 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, 38536, - 38537, 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, - 38766, 38919, 39081, 39147, 40166, 40697, 20099, 20100, 20150, 20669, - 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, - 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, 21115, - 21116, 21955, 21979, 21964, 21968, 21963, 21962, 21981, 21952, 21972, - 21956, 21993, 21951, 21970, 21901, 21967, 21973, 21986, 21974, 21960, - 22002, 21965, 21977, 21954, 22292, 22611, 22632, 22628, 22607, 22605, - 22601, 22639, 22613, 22606, 22621, 22617, 22629, 22619, 22589, 22627, - 22641, 22780, 23239, 23236, 23243, 23226, 23224, 23217, 23221, 23216, - 23231, 23240, 23227, 23238, 23223, 23232, 23242, 23220, 23222, 23245, - 23225, 23184, 23510, 23512, 23513, 23583, 23603, 23921, 23907, 23882, - 23909, 23922, 23916, 23902, 23912, 23911, 23906, 24048, 24143, 24142, - 24138, 24141, 24139, 24261, 24268, 24262, 24267, 24263, 24384, 24495, - 24493, 24823, 24905, 24906, 24875, 24901, 24886, 24882, 24878, 24902, - 24879, 24911, 24873, 24896, 25120, 37224, 25123, 25125, 25124, 25541, - 25585, 25579, 25616, 25618, 25609, 25632, 25636, 25651, 25667, 25631, - 25621, 25624, 25657, 25655, 25634, 25635, 25612, 25638, 25648, 25640, - 25665, 25653, 25647, 25610, 25626, 25664, 25637, 25639, 25611, 25575, - 25627, 25646, 25633, 25614, 25967, 26002, 26067, 26246, 26252, 26261, - 26256, 26251, 26250, 26265, 26260, 26232, 26400, 26982, 26975, 26936, - 26958, 26978, 26993, 26943, 26949, 26986, 26937, 26946, 26967, 26969, - 27002, 26952, 26953, 26933, 26988, 26931, 26941, 26981, 26864, 27000, - 26932, 26985, 26944, 26991, 26948, 26998, 26968, 26945, 26996, 26956, - 26939, 26955, 26935, 26972, 26959, 26961, 26930, 26962, 26927, 27003, - 26940, 27462, 27461, 27459, 27458, 27464, 27457, 27547, 64013, 27643, - 27644, 27641, 27639, 27640, 28315, 28374, 28360, 28303, 28352, 28319, - 28307, 28308, 28320, 28337, 28345, 28358, 28370, 28349, 28353, 28318, - 28361, 28343, 28336, 28365, 28326, 28367, 28338, 28350, 28355, 28380, - 28376, 28313, 28306, 28302, 28301, 28324, 28321, 28351, 28339, 28368, - 28362, 28311, 28334, 28323, 28999, 29012, 29010, 29027, 29024, 28993, - 29021, 29026, 29042, 29048, 29034, 29025, 28994, 29016, 28995, 29003, - 29040, 29023, 29008, 29011, 28996, 29005, 29018, 29263, 29325, 29324, - 29329, 29328, 29326, 29500, 29506, 29499, 29498, 29504, 29514, 29513, - 29764, 29770, 29771, 29778, 29777, 29783, 29760, 29775, 29776, 29774, - 29762, 29766, 29773, 29780, 29921, 29951, 29950, 29949, 29981, 30073, - 30071, 27011, 30191, 30223, 30211, 30199, 30206, 30204, 30201, 30200, - 30224, 30203, 30198, 30189, 30197, 30205, 30361, 30389, 30429, 30549, - 30559, 30560, 30546, 30550, 30554, 30569, 30567, 30548, 30553, 30573, - 30688, 30855, 30874, 30868, 30863, 30852, 30869, 30853, 30854, 30881, - 30851, 30841, 30873, 30848, 30870, 30843, 31100, 31106, 31101, 31097, - 31249, 31256, 31257, 31250, 31255, 31253, 31266, 31251, 31259, 31248, - 31395, 31394, 31390, 31467, 31590, 31588, 31597, 31604, 31593, 31602, - 31589, 31603, 31601, 31600, 31585, 31608, 31606, 31587, 31922, 31924, - 31919, 32136, 32134, 32128, 32141, 32127, 32133, 32122, 32142, 32123, - 32131, 32124, 32140, 32148, 32132, 32125, 32146, 32621, 32619, 32615, - 32616, 32620, 32678, 32677, 32679, 32731, 32732, 32801, 33124, 33120, - 33143, 33116, 33129, 33115, 33122, 33138, 26401, 33118, 33142, 33127, - 33135, 33092, 33121, 33309, 33353, 33348, 33344, 33346, 33349, 34033, - 33855, 33878, 33910, 33913, 33935, 33933, 33893, 33873, 33856, 33926, - 33895, 33840, 33869, 33917, 33882, 33881, 33908, 33907, 33885, 34055, - 33886, 33847, 33850, 33844, 33914, 33859, 33912, 33842, 33861, 33833, - 33753, 33867, 33839, 33858, 33837, 33887, 33904, 33849, 33870, 33868, - 33874, 33903, 33989, 33934, 33851, 33863, 33846, 33843, 33896, 33918, - 33860, 33835, 33888, 33876, 33902, 33872, 34571, 34564, 34551, 34572, - 34554, 34518, 34549, 34637, 34552, 34574, 34569, 34561, 34550, 34573, - 34565, 35030, 35019, 35021, 35022, 35038, 35035, 35034, 35020, 35024, - 35205, 35227, 35295, 35301, 35300, 35297, 35296, 35298, 35292, 35302, - 35446, 35462, 35455, 35425, 35391, 35447, 35458, 35460, 35445, 35459, - 35457, 35444, 35450, 35900, 35915, 35914, 35941, 35940, 35942, 35974, - 35972, 35973, 36044, 36200, 36201, 36241, 36236, 36238, 36239, 36237, - 36243, 36244, 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, - 36329, 36323, 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, - 36608, 36613, 36615, 36616, 36610, 36619, 36946, 36927, 36932, 36937, - 36925, 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, 37230, - 37231, 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, - 37422, 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, - 37473, 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, - 37462, 37426, 38303, 38300, 38302, 38299, 38546, 38547, 38545, 38551, - 38606, 38650, 38653, 38648, 38645, 38771, 38775, 38776, 38770, 38927, - 38925, 38926, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, - 39595, 39771, 40170, 40173, 40167, 40576, 40701, 20710, 20692, 20695, - 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, 20719, - 20707, 20704, 20952, 21120, 21121, 21225, 21227, 21296, 21420, 22055, - 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, 22010, - 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, 22657, - 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, 22664, - 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, 23274, - 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, 23261, - 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, 23933, - 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, 23949, - 23929, 23935, 24152, 24153, 24147, 24280, 24273, 24279, 24270, 24284, - 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, 24872, - 24897, 24926, 24945, 24947, 24914, 24915, 24946, 24940, 24960, 24948, - 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, 25127, - 25131, 25643, 25677, 25691, 25693, 25716, 25718, 25714, 25715, 25725, - 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, 25696, - 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, 26016, - 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, 27040, - 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, 27021, - 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, 27082, - 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, 27024, - 27074, 27061, 27045, 27078, 27466, 27469, 27467, 27550, 27551, 27552, - 27587, 27588, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, - 28411, 28462, 28425, 28494, 28441, 28442, 28455, 28440, 28475, 28434, - 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, - 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, - 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, - 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, - 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, - 29813, 29810, 29799, 29806, 29952, 29954, 29955, 30077, 30096, 30230, - 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, - 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, - 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, - 31114, 31115, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, - 31275, 31306, 31280, 31279, 31272, 31270, 31400, 31403, 31404, 31470, - 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, - 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, - 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, - 32196, 32198, 32203, 32204, 32175, 32185, 32150, 32188, 32159, 32166, - 32174, 32169, 32161, 32201, 32627, 32738, 32739, 32741, 32734, 32804, - 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, - 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, - 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, - 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, 33960, 34006, - 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, 33937, - 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, 34585, - 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, 34605, - 34620, 34578, 34618, 34609, 34613, 34626, 34598, 34599, 34616, 34596, - 34586, 34608, 34577, 35063, 35047, 35057, 35058, 35066, 35070, 35054, - 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, 35230, - 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, 35901, - 35944, 35945, 36053, 36047, 36055, 36246, 36361, 36354, 36351, 36365, - 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, 36624, - 36625, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, 37146, - 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, 37494, - 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, 37497, - 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, 37512, - 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, 37533, - 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, 38787, - 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, 39085, - 39086, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, 39354, - 39362, 39357, 39367, 39601, 39651, 39655, 39742, 39743, 39776, 39777, - 39775, 40177, 40178, 40181, 40615, 20735, 20739, 20784, 20728, 20742, - 20743, 20726, 20734, 20747, 20748, 20733, 20746, 21131, 21132, 21233, - 21231, 22088, 22082, 22092, 22069, 22081, 22090, 22089, 22086, 22104, - 22106, 22080, 22067, 22077, 22060, 22078, 22072, 22058, 22074, 22298, - 22699, 22685, 22705, 22688, 22691, 22703, 22700, 22693, 22689, 22783, - 23295, 23284, 23293, 23287, 23286, 23299, 23288, 23298, 23289, 23297, - 23303, 23301, 23311, 23655, 23961, 23959, 23967, 23954, 23970, 23955, - 23957, 23968, 23964, 23969, 23962, 23966, 24169, 24157, 24160, 24156, - 32243, 24283, 24286, 24289, 24393, 24498, 24971, 24963, 24953, 25009, - 25008, 24994, 24969, 24987, 24979, 25007, 25005, 24991, 24978, 25002, - 24993, 24973, 24934, 25011, 25133, 25710, 25712, 25750, 25760, 25733, - 25751, 25756, 25743, 25739, 25738, 25740, 25763, 25759, 25704, 25777, - 25752, 25974, 25978, 25977, 25979, 26034, 26035, 26293, 26288, 26281, - 26290, 26295, 26282, 26287, 27136, 27142, 27159, 27109, 27128, 27157, - 27121, 27108, 27168, 27135, 27116, 27106, 27163, 27165, 27134, 27175, - 27122, 27118, 27156, 27127, 27111, 27200, 27144, 27110, 27131, 27149, - 27132, 27115, 27145, 27140, 27160, 27173, 27151, 27126, 27174, 27143, - 27124, 27158, 27473, 27557, 27555, 27554, 27558, 27649, 27648, 27647, - 27650, 28481, 28454, 28542, 28551, 28614, 28562, 28557, 28553, 28556, - 28514, 28495, 28549, 28506, 28566, 28534, 28524, 28546, 28501, 28530, - 28498, 28496, 28503, 28564, 28563, 28509, 28416, 28513, 28523, 28541, - 28519, 28560, 28499, 28555, 28521, 28543, 28565, 28515, 28535, 28522, - 28539, 29106, 29103, 29083, 29104, 29088, 29082, 29097, 29109, 29085, - 29093, 29086, 29092, 29089, 29098, 29084, 29095, 29107, 29336, 29338, - 29528, 29522, 29534, 29535, 29536, 29533, 29531, 29537, 29530, 29529, - 29538, 29831, 29833, 29834, 29830, 29825, 29821, 29829, 29832, 29820, - 29817, 29960, 29959, 30078, 30245, 30238, 30233, 30237, 30236, 30243, - 30234, 30248, 30235, 30364, 30365, 30366, 30363, 30605, 30607, 30601, - 30600, 30925, 30907, 30927, 30924, 30929, 30926, 30932, 30920, 30915, - 30916, 30921, 31130, 31137, 31136, 31132, 31138, 31131, 27510, 31289, - 31410, 31412, 31411, 31671, 31691, 31678, 31660, 31694, 31663, 31673, - 31690, 31669, 31941, 31944, 31948, 31947, 32247, 32219, 32234, 32231, - 32215, 32225, 32259, 32250, 32230, 32246, 32241, 32240, 32238, 32223, - 32630, 32684, 32688, 32685, 32749, 32747, 32746, 32748, 32742, 32744, - 32868, 32871, 33187, 33183, 33182, 33173, 33186, 33177, 33175, 33302, - 33359, 33363, 33362, 33360, 33358, 33361, 34084, 34107, 34063, 34048, - 34089, 34062, 34057, 34061, 34079, 34058, 34087, 34076, 34043, 34091, - 34042, 34056, 34060, 34036, 34090, 34034, 34069, 34039, 34027, 34035, - 34044, 34066, 34026, 34025, 34070, 34046, 34088, 34077, 34094, 34050, - 34045, 34078, 34038, 34097, 34086, 34023, 34024, 34032, 34031, 34041, - 34072, 34080, 34096, 34059, 34073, 34095, 34402, 34646, 34659, 34660, - 34679, 34785, 34675, 34648, 34644, 34651, 34642, 34657, 34650, 34641, - 34654, 34669, 34666, 34640, 34638, 34655, 34653, 34671, 34668, 34682, - 34670, 34652, 34661, 34639, 34683, 34677, 34658, 34663, 34665, 34906, - 35077, 35084, 35092, 35083, 35095, 35096, 35097, 35078, 35094, 35089, - 35086, 35081, 35234, 35236, 35235, 35309, 35312, 35308, 35535, 35526, - 35512, 35539, 35537, 35540, 35541, 35515, 35543, 35518, 35520, 35525, - 35544, 35523, 35514, 35517, 35545, 35902, 35917, 35983, 36069, 36063, - 36057, 36072, 36058, 36061, 36071, 36256, 36252, 36257, 36251, 36384, - 36387, 36389, 36388, 36398, 36373, 36379, 36374, 36369, 36377, 36390, - 36391, 36372, 36370, 36376, 36371, 36380, 36375, 36378, 36652, 36644, - 36632, 36634, 36640, 36643, 36630, 36631, 36979, 36976, 36975, 36967, - 36971, 37167, 37163, 37161, 37162, 37170, 37158, 37166, 37253, 37254, - 37258, 37249, 37250, 37252, 37248, 37584, 37571, 37572, 37568, 37593, - 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, - 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, - 37598, 37607, 37585, 37587, 37557, 37601, 37574, 37556, 38268, 38316, - 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, 38746, - 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, 38952, - 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, 39190, 39191, - 39189, 39388, 39373, 39375, 39379, 39380, 39374, 39369, 39382, 39384, - 39371, 39383, 39372, 39603, 39660, 39659, 39667, 39666, 39665, 39750, - 39747, 39783, 39796, 39793, 39782, 39798, 39797, 39792, 39784, 39780, - 39788, 40188, 40186, 40189, 40191, 40183, 40199, 40192, 40185, 40187, - 40200, 40197, 40196, 40579, 40659, 40719, 40720, 20764, 20755, 20759, - 20762, 20753, 20958, 21300, 21473, 22128, 22112, 22126, 22131, 22118, - 22115, 22125, 22130, 22110, 22135, 22300, 22299, 22728, 22717, 22729, - 22719, 22714, 22722, 22716, 22726, 23319, 23321, 23323, 23329, 23316, - 23315, 23312, 23318, 23336, 23322, 23328, 23326, 23535, 23980, 23985, - 23977, 23975, 23989, 23984, 23982, 23978, 23976, 23986, 23981, 23983, - 23988, 24167, 24168, 24166, 24175, 24297, 24295, 24294, 24296, 24293, - 24395, 24508, 24989, 25000, 24982, 25029, 25012, 25030, 25025, 25036, - 25018, 25023, 25016, 24972, 25815, 25814, 25808, 25807, 25801, 25789, - 25737, 25795, 25819, 25843, 25817, 25907, 25983, 25980, 26018, 26312, - 26302, 26304, 26314, 26315, 26319, 26301, 26299, 26298, 26316, 26403, - 27188, 27238, 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, - 27227, 27217, 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, - 27215, 27220, 27247, 27241, 27232, 27196, 27230, 27222, 27221, 27213, - 27214, 27206, 27477, 27476, 27478, 27559, 27562, 27563, 27592, 27591, - 27652, 27651, 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, - 28510, 28612, 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, - 28588, 28586, 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, - 28594, 28592, 29125, 29122, 29119, 29112, 29142, 29120, 29121, 29131, - 29140, 29130, 29127, 29135, 29117, 29144, 29116, 29126, 29146, 29147, - 29341, 29342, 29545, 29542, 29543, 29548, 29541, 29547, 29546, 29823, - 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, 30253, - 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, 30618, - 30621, 30625, 30620, 30619, 30626, 30627, 30613, 30617, 30615, 30941, - 30953, 30949, 30954, 30942, 30947, 30939, 30945, 30946, 30957, 30943, - 30944, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, 31415, - 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, 31700, - 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, 31952, - 31953, 32274, 32289, 32279, 32268, 32287, 32288, 32275, 32270, 32284, - 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, 32293, 32292, - 32579, 32635, 32636, 32634, 32689, 32751, 32810, 32809, 32876, 33201, - 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, 33202, 33207, - 33191, 33266, 33365, 33366, 33367, 34134, 34117, 34155, 34125, 34131, - 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, 34119, - 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, 34144, - 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, 34715, - 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, 34681, 34695, - 34723, 34693, 34704, 34705, 34717, 34692, 34708, 34716, 34714, 34697, - 35102, 35110, 35120, 35117, 35118, 35111, 35121, 35106, 35113, 35107, - 35119, 35116, 35103, 35313, 35552, 35554, 35570, 35572, 35573, 35549, - 35604, 35556, 35551, 35568, 35528, 35550, 35553, 35560, 35583, 35567, - 35579, 35985, 35986, 35984, 36085, 36078, 36081, 36080, 36083, 36204, - 36206, 36261, 36263, 36403, 36414, 36408, 36416, 36421, 36406, 36412, - 36413, 36417, 36400, 36415, 36541, 36662, 36654, 36661, 36658, 36665, - 36663, 36660, 36982, 36985, 36987, 36998, 37114, 37171, 37173, 37174, - 37267, 37264, 37265, 37261, 37263, 37671, 37662, 37640, 37663, 37638, - 37647, 37754, 37688, 37692, 37659, 37667, 37650, 37633, 37702, 37677, - 37646, 37645, 37579, 37661, 37626, 37669, 37651, 37625, 37623, 37684, - 37634, 37668, 37631, 37673, 37689, 37685, 37674, 37652, 37644, 37643, - 37630, 37641, 37632, 37627, 37654, 38332, 38349, 38334, 38329, 38330, - 38326, 38335, 38325, 38333, 38569, 38612, 38667, 38674, 38672, 38809, - 38807, 38804, 38896, 38904, 38965, 38959, 38962, 39204, 39199, 39207, - 39209, 39326, 39406, 39404, 39397, 39396, 39408, 39395, 39402, 39401, - 39399, 39609, 39615, 39604, 39611, 39670, 39674, 39673, 39671, 39731, - 39808, 39813, 39815, 39804, 39806, 39803, 39810, 39827, 39826, 39824, - 39802, 39829, 39805, 39816, 40229, 40215, 40224, 40222, 40212, 40233, - 40221, 40216, 40226, 40208, 40217, 40223, 40584, 40582, 40583, 40622, - 40621, 40661, 40662, 40698, 40722, 40765, 20774, 20773, 20770, 20772, - 20768, 20777, 21236, 22163, 22156, 22157, 22150, 22148, 22147, 22142, - 22146, 22143, 22145, 22742, 22740, 22735, 22738, 23341, 23333, 23346, - 23331, 23340, 23335, 23334, 23343, 23342, 23419, 23537, 23538, 23991, - 24172, 24170, 24510, 24507, 25027, 25013, 25020, 25063, 25056, 25061, - 25060, 25064, 25054, 25839, 25833, 25827, 25835, 25828, 25832, 25985, - 25984, 26038, 26074, 26322, 27277, 27286, 27265, 27301, 27273, 27295, - 27291, 27297, 27294, 27271, 27283, 27278, 27285, 27267, 27304, 27300, - 27281, 27263, 27302, 27290, 27269, 27276, 27282, 27483, 27565, 27657, - 28620, 28585, 28660, 28628, 28643, 28636, 28653, 28647, 28646, 28638, - 28658, 28637, 28642, 28648, 29153, 29169, 29160, 29170, 29156, 29168, - 29154, 29555, 29550, 29551, 29847, 29874, 29867, 29840, 29866, 29869, - 29873, 29861, 29871, 29968, 29969, 29970, 29967, 30084, 30275, 30280, - 30281, 30279, 30372, 30441, 30645, 30635, 30642, 30647, 30646, 30644, - 30641, 30632, 30704, 30963, 30973, 30978, 30971, 30972, 30962, 30981, - 30969, 30974, 30980, 31147, 31144, 31324, 31323, 31318, 31320, 31316, - 31322, 31422, 31424, 31425, 31749, 31759, 31730, 31744, 31743, 31739, - 31758, 31732, 31755, 31731, 31746, 31753, 31747, 31745, 31736, 31741, - 31750, 31728, 31729, 31760, 31754, 31976, 32301, 32316, 32322, 32307, - 38984, 32312, 32298, 32329, 32320, 32327, 32297, 32332, 32304, 32315, - 32310, 32324, 32314, 32581, 32639, 32638, 32637, 32756, 32754, 32812, - 33211, 33220, 33228, 33226, 33221, 33223, 33212, 33257, 33371, 33370, - 33372, 34179, 34176, 34191, 34215, 34197, 34208, 34187, 34211, 34171, - 34212, 34202, 34206, 34167, 34172, 34185, 34209, 34170, 34168, 34135, - 34190, 34198, 34182, 34189, 34201, 34205, 34177, 34210, 34178, 34184, - 34181, 34169, 34166, 34200, 34192, 34207, 34408, 34750, 34730, 34733, - 34757, 34736, 34732, 34745, 34741, 34748, 34734, 34761, 34755, 34754, - 34764, 34743, 34735, 34756, 34762, 34740, 34742, 34751, 34744, 34749, - 34782, 34738, 35125, 35123, 35132, 35134, 35137, 35154, 35127, 35138, - 35245, 35247, 35246, 35314, 35315, 35614, 35608, 35606, 35601, 35589, - 35595, 35618, 35599, 35602, 35605, 35591, 35597, 35592, 35590, 35612, - 35603, 35610, 35919, 35952, 35954, 35953, 35951, 35989, 35988, 36089, - 36207, 36430, 36429, 36435, 36432, 36428, 36423, 36675, 36672, 36997, - 36990, 37176, 37274, 37282, 37275, 37273, 37279, 37281, 37277, 37280, - 37793, 37763, 37807, 37732, 37718, 37703, 37756, 37720, 37724, 37750, - 37705, 37712, 37713, 37728, 37741, 37775, 37708, 37738, 37753, 37719, - 37717, 37714, 37711, 37745, 37751, 37755, 37729, 37726, 37731, 37735, - 37760, 37710, 37721, 38343, 38336, 38345, 38339, 38341, 38327, 38574, - 38576, 38572, 38688, 38687, 38680, 38685, 38681, 38810, 38817, 38812, - 38814, 38813, 38869, 38868, 38897, 38977, 38980, 38986, 38985, 38981, - 38979, 39205, 39211, 39212, 39210, 39219, 39218, 39215, 39213, 39217, - 39216, 39320, 39331, 39329, 39426, 39418, 39412, 39415, 39417, 39416, - 39414, 39419, 39421, 39422, 39420, 39427, 39614, 39678, 39677, 39681, - 39676, 39752, 39834, 39848, 39838, 39835, 39846, 39841, 39845, 39844, - 39814, 39842, 39840, 39855, 40243, 40257, 40295, 40246, 40238, 40239, - 40241, 40248, 40240, 40261, 40258, 40259, 40254, 40247, 40256, 40253, - 32757, 40237, 40586, 40585, 40589, 40624, 40648, 40666, 40699, 40703, - 40740, 40739, 40738, 40788, 40864, 20785, 20781, 20782, 22168, 22172, - 22167, 22170, 22173, 22169, 22896, 23356, 23657, 23658, 24000, 24173, - 24174, 25048, 25055, 25069, 25070, 25073, 25066, 25072, 25067, 25046, - 25065, 25855, 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, - 26330, 26331, 26328, 27333, 27321, 27325, 27361, 27334, 27322, 27318, - 27319, 27335, 27316, 27309, 27486, 27593, 27659, 28679, 28684, 28685, - 28673, 28677, 28692, 28686, 28671, 28672, 28667, 28710, 28668, 28663, - 28682, 29185, 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, - 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, - 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30975, - 30988, 30995, 30996, 30985, 30992, 30994, 30993, 31149, 31148, 31327, - 31772, 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, - 31781, 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, - 32352, 32343, 32339, 32693, 32691, 32759, 32760, 32885, 33233, 33234, - 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, - 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, - 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, - 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, - 34776, 34787, 34724, 34775, 34777, 34817, 34804, 34792, 34781, 35155, - 35147, 35151, 35148, 35142, 35152, 35153, 35145, 35626, 35623, 35619, - 35635, 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, - 35622, 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, - 35992, 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, - 36438, 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, - 36678, 36679, 36680, 36683, 37160, 37178, 37179, 37182, 37288, 37285, - 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, - 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37773, - 37809, 37777, 37810, 37796, 37800, 37812, 37795, 37797, 38354, 38355, - 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, - 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, - 38873, 38870, 38872, 38906, 38992, 38993, 38994, 39096, 39233, 39228, - 39226, 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, - 39430, 39616, 39644, 39688, 39684, 39685, 39721, 39733, 39754, 39756, - 39755, 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, - 39876, 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, - 40278, 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, - 40671, 40705, 40704, 40726, 40741, 40747, 40746, 40745, 40744, 40780, - 40789, 20788, 20789, 21142, 21239, 21428, 22187, 22189, 22182, 22183, - 22186, 22188, 22746, 22749, 22747, 22802, 23357, 23358, 23359, 24003, - 24176, 24511, 25083, 25863, 25872, 25869, 25865, 25868, 25870, 25988, - 26078, 26077, 26334, 27367, 27360, 27340, 27345, 27353, 27339, 27359, - 27356, 27344, 27371, 27343, 27341, 27358, 27488, 27568, 27660, 28697, - 28711, 28704, 28694, 28715, 28705, 28706, 28707, 28713, 28695, 28708, - 28700, 28714, 29196, 29194, 29191, 29186, 29189, 29349, 29350, 29348, - 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, 30665, 30666, - 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, 31152, 31335, - 31336, 31795, 31804, 31801, 31788, 31803, 31980, 31978, 32374, 32373, - 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, 32587, 32586, - 32643, 32646, 32695, 32765, 32766, 32888, 33239, 33237, 33380, 33377, - 33379, 34283, 34289, 34285, 34265, 34273, 34280, 34266, 34263, 34284, - 34290, 34296, 34264, 34271, 34275, 34268, 34257, 34288, 34278, 34287, - 34270, 34274, 34816, 34810, 34819, 34806, 34807, 34825, 34828, 34827, - 34822, 34812, 34824, 34815, 34826, 34818, 35170, 35162, 35163, 35159, - 35169, 35164, 35160, 35165, 35161, 35208, 35255, 35254, 35318, 35664, - 35656, 35658, 35648, 35667, 35670, 35668, 35659, 35669, 35665, 35650, - 35666, 35671, 35907, 35959, 35958, 35994, 36102, 36103, 36105, 36268, - 36266, 36269, 36267, 36461, 36472, 36467, 36458, 36463, 36475, 36546, - 36690, 36689, 36687, 36688, 36691, 36788, 37184, 37183, 37296, 37293, - 37854, 37831, 37839, 37826, 37850, 37840, 37881, 37868, 37836, 37849, - 37801, 37862, 37834, 37844, 37870, 37859, 37845, 37828, 37838, 37824, - 37842, 37863, 38269, 38362, 38363, 38625, 38697, 38699, 38700, 38696, - 38694, 38835, 38839, 38838, 38877, 38878, 38879, 39004, 39001, 39005, - 38999, 39103, 39101, 39099, 39102, 39240, 39239, 39235, 39334, 39335, - 39450, 39445, 39461, 39453, 39460, 39451, 39458, 39456, 39463, 39459, - 39454, 39452, 39444, 39618, 39691, 39690, 39694, 39692, 39735, 39914, - 39915, 39904, 39902, 39908, 39910, 39906, 39920, 39892, 39895, 39916, - 39900, 39897, 39909, 39893, 39905, 39898, 40311, 40321, 40330, 40324, - 40328, 40305, 40320, 40312, 40326, 40331, 40332, 40317, 40299, 40308, - 40309, 40304, 40297, 40325, 40307, 40315, 40322, 40303, 40313, 40319, - 40327, 40296, 40596, 40593, 40640, 40700, 40749, 40768, 40769, 40781, - 40790, 40791, 40792, 21303, 22194, 22197, 22195, 22755, 23365, 24006, - 24007, 24302, 24303, 24512, 24513, 25081, 25879, 25878, 25877, 25875, - 26079, 26344, 26339, 26340, 27379, 27376, 27370, 27368, 27385, 27377, - 27374, 27375, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, - 28735, 28730, 28729, 28736, 28731, 28723, 28737, 29203, 29204, 29352, - 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, 30670, 30671, - 30669, 30706, 31013, 31011, 31015, 31016, 31012, 31017, 31154, 31342, - 31340, 31341, 31479, 31817, 31816, 31818, 31815, 31813, 31982, 32379, - 32382, 32385, 32384, 32698, 32767, 32889, 33243, 33241, 33291, 33384, - 33385, 34338, 34303, 34305, 34302, 34331, 34304, 34294, 34308, 34313, - 34309, 34316, 34301, 34841, 34832, 34833, 34839, 34835, 34838, 35171, - 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, 35685, 35687, - 35693, 36270, 36486, 36488, 36484, 36697, 36694, 36695, 36693, 36696, - 36698, 37005, 37187, 37185, 37303, 37301, 37298, 37299, 37899, 37907, - 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, 37913, 37901, - 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, 37897, 37880, - 37898, 37887, 37884, 37900, 37878, 37905, 37894, 38366, 38368, 38367, - 38702, 38703, 38841, 38843, 38909, 38910, 39008, 39010, 39011, 39007, - 39105, 39106, 39248, 39246, 39257, 39244, 39243, 39251, 39474, 39476, - 39473, 39468, 39466, 39478, 39465, 39470, 39480, 39469, 39623, 39626, - 39622, 39696, 39698, 39697, 39947, 39944, 39927, 39941, 39954, 39928, - 40000, 39943, 39950, 39942, 39959, 39956, 39945, 40351, 40345, 40356, - 40349, 40338, 40344, 40336, 40347, 40352, 40340, 40348, 40362, 40343, - 40353, 40346, 40354, 40360, 40350, 40355, 40383, 40361, 40342, 40358, - 40359, 40601, 40603, 40602, 40677, 40676, 40679, 40678, 40752, 40750, - 40795, 40800, 40798, 40797, 40793, 40849, 20794, 20793, 21144, 21143, - 22211, 22205, 22206, 23368, 23367, 24011, 24015, 24305, 25085, 25883, - 27394, 27388, 27395, 27384, 27392, 28739, 28740, 28746, 28744, 28745, - 28741, 28742, 29213, 29210, 29209, 29566, 29975, 30314, 30672, 31021, - 31025, 31023, 31828, 31827, 31986, 32394, 32391, 32392, 32395, 32390, - 32397, 32589, 32699, 32816, 33245, 34328, 34346, 34342, 34335, 34339, - 34332, 34329, 34343, 34350, 34337, 34336, 34345, 34334, 34341, 34857, - 34845, 34843, 34848, 34852, 34844, 34859, 34890, 35181, 35177, 35182, - 35179, 35322, 35705, 35704, 35653, 35706, 35707, 36112, 36116, 36271, - 36494, 36492, 36702, 36699, 36701, 37190, 37188, 37189, 37305, 37951, - 37947, 37942, 37929, 37949, 37948, 37936, 37945, 37930, 37943, 37932, - 37952, 37937, 38373, 38372, 38371, 38709, 38714, 38847, 38881, 39012, - 39113, 39110, 39104, 39256, 39254, 39481, 39485, 39494, 39492, 39490, - 39489, 39482, 39487, 39629, 39701, 39703, 39704, 39702, 39738, 39762, - 39979, 39965, 39964, 39980, 39971, 39976, 39977, 39972, 39969, 40375, - 40374, 40380, 40385, 40391, 40394, 40399, 40382, 40389, 40387, 40379, - 40373, 40398, 40377, 40378, 40364, 40392, 40369, 40365, 40396, 40371, - 40397, 40370, 40570, 40604, 40683, 40686, 40685, 40731, 40728, 40730, - 40753, 40782, 40805, 40804, 40850, 20153, 22214, 22213, 22219, 22897, - 23371, 23372, 24021, 24017, 24306, 25889, 25888, 25894, 25890, 27403, - 27400, 27401, 27661, 28757, 28758, 28759, 28754, 29214, 29215, 29353, - 29567, 29912, 29909, 29913, 29911, 30317, 30381, 31029, 31156, 31344, - 31345, 31831, 31836, 31833, 31835, 31834, 31988, 31985, 32401, 32591, - 32647, 33246, 33387, 34356, 34357, 34355, 34348, 34354, 34358, 34860, - 34856, 34854, 34858, 34853, 35185, 35263, 35262, 35323, 35710, 35716, - 35714, 35718, 35717, 35711, 36117, 36501, 36500, 36506, 36498, 36496, - 36502, 36503, 36704, 36706, 37191, 37964, 37968, 37962, 37963, 37967, - 37959, 37957, 37960, 37961, 37958, 38719, 38883, 39018, 39017, 39115, - 39252, 39259, 39502, 39507, 39508, 39500, 39503, 39496, 39498, 39497, - 39506, 39504, 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, - 39999, 40004, 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, - 39990, 40411, 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, - 40425, 40409, 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, - 40755, 40754, 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, - 22898, 23373, 24024, 34863, 24399, 25089, 25091, 25092, 25897, 25893, - 26006, 26347, 27409, 27410, 27407, 27594, 28763, 28762, 29218, 29570, - 29569, 29571, 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, - 34361, 34364, 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, - 35188, 35187, 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, - 36708, 36707, 37308, 37986, 37973, 37981, 37975, 37982, 38852, 38853, - 38912, 39510, 39513, 39710, 39711, 39712, 40018, 40024, 40016, 40010, - 40013, 40011, 40021, 40025, 40012, 40014, 40443, 40439, 40431, 40419, - 40427, 40440, 40420, 40438, 40417, 40430, 40422, 40434, 40432, 40418, - 40428, 40436, 40435, 40424, 40429, 40642, 40656, 40690, 40691, 40710, - 40732, 40760, 40759, 40758, 40771, 40783, 40817, 40816, 40814, 40815, - 22227, 22221, 23374, 23661, 25901, 26349, 26350, 27411, 28767, 28769, - 28765, 28768, 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, - 32407, 32649, 33389, 34371, 34872, 34871, 34869, 34891, 35732, 35733, - 36510, 36511, 36512, 36509, 37310, 37309, 37314, 37995, 37992, 37993, - 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, - 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, - 40453, 40448, 40449, 40457, 40447, 40445, 40452, 40608, 40734, 40774, - 40820, 40821, 40822, 22228, 25902, 26040, 27416, 27417, 27415, 27418, - 28770, 29222, 29354, 30680, 30681, 31033, 31849, 31851, 31990, 32410, - 32408, 32411, 32409, 33248, 33249, 34374, 34375, 34376, 35193, 35194, - 35196, 35195, 35327, 35736, 35737, 36517, 36516, 36515, 37998, 37997, - 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, - 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, - 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, - 38004, 38008, 38006, 38005, 39520, 40052, 40051, 40049, 40053, 40468, - 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, 34878, 34877, - 34879, 35742, 35996, 36521, 36553, 38731, 39027, 39028, 39116, 39265, - 39339, 39524, 39526, 39527, 39716, 40469, 40471, 40776, 25095, 27422, - 29223, 34380, 36520, 38018, 38016, 38017, 39529, 39528, 39726, 40473, - 29225, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, - 28777, 28778, 40612, 40830, 40777, 40856, 30849, 37561, 35023, 22715, - 24658, 31911, 23290, 9556, 9574, 9559, 9568, 9580, 9571, 9562, - 9577, 9565, 9554, 9572, 9557, 9566, 9578, 9569, 9560, 9575, - 9563, 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, - 9553, 9552, 9581, 9582, 9584, 9583, 65517, 132423, 37595, 132575, - 147397, 34124, 17077, 29679, 20917, 13897, 149826, 166372, 37700, 137691, - 33518, 146632, 30780, 26436, 25311, 149811, 166314, 131744, 158643, 135941, - 20395, 140525, 20488, 159017, 162436, 144896, 150193, 140563, 20521, 131966, - 24484, 131968, 131911, 28379, 132127, 20605, 20737, 13434, 20750, 39020, - 14147, 33814, 149924, 132231, 20832, 144308, 20842, 134143, 139516, 131813, - 140592, 132494, 143923, 137603, 23426, 34685, 132531, 146585, 20914, 20920, - 40244, 20937, 20943, 20945, 15580, 20947, 150182, 20915, 20962, 21314, - 20973, 33741, 26942, 145197, 24443, 21003, 21030, 21052, 21173, 21079, - 21140, 21177, 21189, 31765, 34114, 21216, 34317, 158483, 21253, 166622, - 21833, 28377, 147328, 133460, 147436, 21299, 21316, 134114, 27851, 136998, - 26651, 29653, 24650, 16042, 14540, 136936, 29149, 17570, 21357, 21364, - 165547, 21374, 21375, 136598, 136723, 30694, 21395, 166555, 21408, 21419, - 21422, 29607, 153458, 16217, 29596, 21441, 21445, 27721, 20041, 22526, - 21465, 15019, 134031, 21472, 147435, 142755, 21494, 134263, 21523, 28793, - 21803, 26199, 27995, 21613, 158547, 134516, 21853, 21647, 21668, 18342, - 136973, 134877, 15796, 134477, 166332, 140952, 21831, 19693, 21551, 29719, - 21894, 21929, 22021, 137431, 147514, 17746, 148533, 26291, 135348, 22071, - 26317, 144010, 26276, 26285, 22093, 22095, 30961, 22257, 38791, 21502, - 22272, 22255, 22253, 166758, 13859, 135759, 22342, 147877, 27758, 28811, - 22338, 14001, 158846, 22502, 136214, 22531, 136276, 148323, 22566, 150517, - 22620, 22698, 13665, 22752, 22748, 135740, 22779, 23551, 22339, 172368, - 148088, 37843, 13729, 22815, 26790, 14019, 28249, 136766, 23076, 21843, - 136850, 34053, 22985, 134478, 158849, 159018, 137180, 23001, 137211, 137138, - 159142, 28017, 137256, 136917, 23033, 159301, 23211, 23139, 14054, 149929, - 23159, 14088, 23190, 29797, 23251, 159649, 140628, 15749, 137489, 14130, - 136888, 24195, 21200, 23414, 25992, 23420, 162318, 16388, 18525, 131588, - 23509, 24928, 137780, 154060, 132517, 23539, 23453, 19728, 23557, 138052, - 23571, 29646, 23572, 138405, 158504, 23625, 18653, 23685, 23785, 23791, - 23947, 138745, 138807, 23824, 23832, 23878, 138916, 23738, 24023, 33532, - 14381, 149761, 139337, 139635, 33415, 14390, 15298, 24110, 27274, 24181, - 24186, 148668, 134355, 21414, 20151, 24272, 21416, 137073, 24073, 24308, - 164994, 24313, 24315, 14496, 24316, 26686, 37915, 24333, 131521, 194708, - 15070, 18606, 135994, 24378, 157832, 140240, 24408, 140401, 24419, 38845, - 159342, 24434, 37696, 166454, 24487, 23990, 15711, 152144, 139114, 159992, - 140904, 37334, 131742, 166441, 24625, 26245, 137335, 14691, 15815, 13881, - 22416, 141236, 31089, 15936, 24734, 24740, 24755, 149890, 149903, 162387, - 29860, 20705, 23200, 24932, 33828, 24898, 194726, 159442, 24961, 20980, - 132694, 24967, 23466, 147383, 141407, 25043, 166813, 170333, 25040, 14642, - 141696, 141505, 24611, 24924, 25886, 25483, 131352, 25285, 137072, 25301, - 142861, 25452, 149983, 14871, 25656, 25592, 136078, 137212, 25744, 28554, - 142902, 38932, 147596, 153373, 25825, 25829, 38011, 14950, 25658, 14935, - 25933, 28438, 150056, 150051, 25989, 25965, 25951, 143486, 26037, 149824, - 19255, 26065, 16600, 137257, 26080, 26083, 24543, 144384, 26136, 143863, - 143864, 26180, 143780, 143781, 26187, 134773, 26215, 152038, 26227, 26228, - 138813, 143921, 165364, 143816, 152339, 30661, 141559, 39332, 26370, 148380, - 150049, 15147, 27130, 145346, 26462, 26471, 26466, 147917, 168173, 26583, - 17641, 26658, 28240, 37436, 26625, 144358, 159136, 26717, 144495, 27105, - 27147, 166623, 26995, 26819, 144845, 26881, 26880, 15666, 14849, 144956, - 15232, 26540, 26977, 166474, 17148, 26934, 27032, 15265, 132041, 33635, - 20624, 27129, 144985, 139562, 27205, 145155, 27293, 15347, 26545, 27336, - 168348, 15373, 27421, 133411, 24798, 27445, 27508, 141261, 28341, 146139, - 132021, 137560, 14144, 21537, 146266, 27617, 147196, 27612, 27703, 140427, - 149745, 158545, 27738, 33318, 27769, 146876, 17605, 146877, 147876, 149772, - 149760, 146633, 14053, 15595, 134450, 39811, 143865, 140433, 32655, 26679, - 159013, 159137, 159211, 28054, 27996, 28284, 28420, 149887, 147589, 159346, - 34099, 159604, 20935, 27804, 28189, 33838, 166689, 28207, 146991, 29779, - 147330, 31180, 28239, 23185, 143435, 28664, 14093, 28573, 146992, 28410, - 136343, 147517, 17749, 37872, 28484, 28508, 15694, 28532, 168304, 15675, - 28575, 147780, 28627, 147601, 147797, 147513, 147440, 147380, 147775, 20959, - 147798, 147799, 147776, 156125, 28747, 28798, 28839, 28801, 28876, 28885, - 28886, 28895, 16644, 15848, 29108, 29078, 148087, 28971, 28997, 23176, - 29002, 29038, 23708, 148325, 29007, 37730, 148161, 28972, 148570, 150055, - 150050, 29114, 166888, 28861, 29198, 37954, 29205, 22801, 37955, 29220, - 37697, 153093, 29230, 29248, 149876, 26813, 29269, 29271, 15957, 143428, - 26637, 28477, 29314, 29482, 29483, 149539, 165931, 18669, 165892, 29480, - 29486, 29647, 29610, 134202, 158254, 29641, 29769, 147938, 136935, 150052, - 26147, 14021, 149943, 149901, 150011, 29687, 29717, 26883, 150054, 29753, - 132547, 16087, 29788, 141485, 29792, 167602, 29767, 29668, 29814, 33721, - 29804, 14128, 29812, 37873, 27180, 29826, 18771, 150156, 147807, 150137, - 166799, 23366, 166915, 137374, 29896, 137608, 29966, 29929, 29982, 167641, - 137803, 23511, 167596, 37765, 30029, 30026, 30055, 30062, 151426, 16132, - 150803, 30094, 29789, 30110, 30132, 30210, 30252, 30289, 30287, 30319, - 30326, 156661, 30352, 33263, 14328, 157969, 157966, 30369, 30373, 30391, - 30412, 159647, 33890, 151709, 151933, 138780, 30494, 30502, 30528, 25775, - 152096, 30552, 144044, 30639, 166244, 166248, 136897, 30708, 30729, 136054, - 150034, 26826, 30895, 30919, 30931, 38565, 31022, 153056, 30935, 31028, - 30897, 161292, 36792, 34948, 166699, 155779, 140828, 31110, 35072, 26882, - 31104, 153687, 31133, 162617, 31036, 31145, 28202, 160038, 16040, 31174, - 168205, 31188, -}; - -static const unsigned long myhtml_encoding_map_euc_kr[] = { - 44034, 44035, 44037, 44038, 44043, 44044, 44045, 44046, 44047, 44056, - 44062, 44063, 44065, 44066, 44067, 44069, 44070, 44071, 44072, 44073, - 44074, 44075, 44078, 44082, 44083, 44084, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 44085, 44086, 44087, 44090, 44091, 44093, 44094, 44095, - 44097, 44098, 44099, 44100, 44101, 44102, 44103, 44104, 44105, 44106, - 44108, 44110, 44111, 44112, 44113, 44114, 44115, 44117, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 44118, 44119, 44121, 44122, 44123, 44125, - 44126, 44127, 44128, 44129, 44130, 44131, 44132, 44133, 44134, 44135, - 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44146, 44147, - 44149, 44150, 44153, 44155, 44156, 44157, 44158, 44159, 44162, 44167, - 44168, 44173, 44174, 44175, 44177, 44178, 44179, 44181, 44182, 44183, - 44184, 44185, 44186, 44187, 44190, 44194, 44195, 44196, 44197, 44198, - 44199, 44203, 44205, 44206, 44209, 44210, 44211, 44212, 44213, 44214, - 44215, 44218, 44222, 44223, 44224, 44226, 44227, 44229, 44230, 44231, - 44233, 44234, 44235, 44237, 44238, 44239, 44240, 44241, 44242, 44243, - 44244, 44246, 44248, 44249, 44250, 44251, 44252, 44253, 44254, 44255, - 44258, 44259, 44261, 44262, 44265, 44267, 44269, 44270, 44274, 44276, - 44279, 44280, 44281, 44282, 44283, 44286, 44287, 44289, 44290, 44291, - 44293, 44295, 44296, 44297, 44298, 44299, 44302, 44304, 44306, 44307, - 44308, 44309, 44310, 44311, 44313, 44314, 44315, 44317, 44318, 44319, - 44321, 44322, 44323, 44324, 44325, 44326, 44327, 44328, 44330, 44331, - 44334, 44335, 44336, 44337, 44338, 44339, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 44342, 44343, 44345, 44346, 44347, 44349, 44350, 44351, - 44352, 44353, 44354, 44355, 44358, 44360, 44362, 44363, 44364, 44365, - 44366, 44367, 44369, 44370, 44371, 44373, 44374, 44375, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 44377, 44378, 44379, 44380, 44381, 44382, - 44383, 44384, 44386, 44388, 44389, 44390, 44391, 44392, 44393, 44394, - 44395, 44398, 44399, 44401, 44402, 44407, 44408, 44409, 44410, 44414, - 44416, 44419, 44420, 44421, 44422, 44423, 44426, 44427, 44429, 44430, - 44431, 44433, 44434, 44435, 44436, 44437, 44438, 44439, 44440, 44441, - 44442, 44443, 44446, 44447, 44448, 44449, 44450, 44451, 44453, 44454, - 44455, 44456, 44457, 44458, 44459, 44460, 44461, 44462, 44463, 44464, - 44465, 44466, 44467, 44468, 44469, 44470, 44472, 44473, 44474, 44475, - 44476, 44477, 44478, 44479, 44482, 44483, 44485, 44486, 44487, 44489, - 44490, 44491, 44492, 44493, 44494, 44495, 44498, 44500, 44501, 44502, - 44503, 44504, 44505, 44506, 44507, 44509, 44510, 44511, 44513, 44514, - 44515, 44517, 44518, 44519, 44520, 44521, 44522, 44523, 44524, 44525, - 44526, 44527, 44528, 44529, 44530, 44531, 44532, 44533, 44534, 44535, - 44538, 44539, 44541, 44542, 44546, 44547, 44548, 44549, 44550, 44551, - 44554, 44556, 44558, 44559, 44560, 44561, 44562, 44563, 44565, 44566, - 44567, 44568, 44569, 44570, 44571, 44572, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 44573, 44574, 44575, 44576, 44577, 44578, 44579, 44580, - 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, - 44591, 44594, 44595, 44597, 44598, 44601, 44603, 44604, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 44605, 44606, 44607, 44610, 44612, 44615, - 44616, 44617, 44619, 44623, 44625, 44626, 44627, 44629, 44631, 44632, - 44633, 44634, 44635, 44638, 44642, 44643, 44644, 44646, 44647, 44650, - 44651, 44653, 44654, 44655, 44657, 44658, 44659, 44660, 44661, 44662, - 44663, 44666, 44670, 44671, 44672, 44673, 44674, 44675, 44678, 44679, - 44680, 44681, 44682, 44683, 44685, 44686, 44687, 44688, 44689, 44690, - 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, - 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, - 44711, 44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, - 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, - 44731, 44735, 44737, 44738, 44739, 44741, 44742, 44743, 44744, 44745, - 44746, 44747, 44750, 44754, 44755, 44756, 44757, 44758, 44759, 44762, - 44763, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, - 44774, 44775, 44777, 44778, 44780, 44782, 44783, 44784, 44785, 44786, - 44787, 44789, 44790, 44791, 44793, 44794, 44795, 44797, 44798, 44799, - 44800, 44801, 44802, 44803, 44804, 44805, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 44806, 44809, 44810, 44811, 44812, 44814, 44815, 44817, - 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, - 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 44836, 44837, 44838, 44839, 44840, 44841, - 44842, 44843, 44846, 44847, 44849, 44851, 44853, 44854, 44855, 44856, - 44857, 44858, 44859, 44862, 44864, 44868, 44869, 44870, 44871, 44874, - 44875, 44876, 44877, 44878, 44879, 44881, 44882, 44883, 44884, 44885, - 44886, 44887, 44888, 44889, 44890, 44891, 44894, 44895, 44896, 44897, - 44898, 44899, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, - 44910, 44911, 44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, - 44920, 44922, 44923, 44924, 44925, 44926, 44927, 44929, 44930, 44931, - 44933, 44934, 44935, 44937, 44938, 44939, 44940, 44941, 44942, 44943, - 44946, 44947, 44948, 44950, 44951, 44952, 44953, 44954, 44955, 44957, - 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, - 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, - 44978, 44979, 44980, 44981, 44982, 44983, 44986, 44987, 44989, 44990, - 44991, 44993, 44994, 44995, 44996, 44997, 44998, 45002, 45004, 45007, - 45008, 45009, 45010, 45011, 45013, 45014, 45015, 45016, 45017, 45018, - 45019, 45021, 45022, 45023, 45024, 45025, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 45026, 45027, 45028, 45029, 45030, 45031, 45034, 45035, - 45036, 45037, 45038, 45039, 45042, 45043, 45045, 45046, 45047, 45049, - 45050, 45051, 45052, 45053, 45054, 45055, 45058, 45059, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 45061, 45062, 45063, 45064, 45065, 45066, - 45067, 45069, 45070, 45071, 45073, 45074, 45075, 45077, 45078, 45079, - 45080, 45081, 45082, 45083, 45086, 45087, 45088, 45089, 45090, 45091, - 45092, 45093, 45094, 45095, 45097, 45098, 45099, 45100, 45101, 45102, - 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112, - 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, - 45123, 45126, 45127, 45129, 45131, 45133, 45135, 45136, 45137, 45138, - 45142, 45144, 45146, 45147, 45148, 45150, 45151, 45152, 45153, 45154, - 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, - 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, - 45175, 45176, 45177, 45178, 45179, 45182, 45183, 45185, 45186, 45187, - 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45198, 45200, 45202, - 45203, 45204, 45205, 45206, 45207, 45211, 45213, 45214, 45219, 45220, - 45221, 45222, 45223, 45226, 45232, 45234, 45238, 45239, 45241, 45242, - 45243, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45254, 45258, - 45259, 45260, 45261, 45262, 45263, 45266, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 45267, 45269, 45270, 45271, 45273, 45274, 45275, 45276, - 45277, 45278, 45279, 45281, 45282, 45283, 45284, 45286, 45287, 45288, - 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 45297, 45298, 45299, 45300, 45301, 45302, - 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, - 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45322, 45325, 45326, - 45327, 45329, 45332, 45333, 45334, 45335, 45338, 45342, 45343, 45344, - 45345, 45346, 45350, 45351, 45353, 45354, 45355, 45357, 45358, 45359, - 45360, 45361, 45362, 45363, 45366, 45370, 45371, 45372, 45373, 45374, - 45375, 45378, 45379, 45381, 45382, 45383, 45385, 45386, 45387, 45388, - 45389, 45390, 45391, 45394, 45395, 45398, 45399, 45401, 45402, 45403, - 45405, 45406, 45407, 45409, 45410, 45411, 45412, 45413, 45414, 45415, - 45416, 45417, 45418, 45419, 45420, 45421, 45422, 45423, 45424, 45425, - 45426, 45427, 45428, 45429, 45430, 45431, 45434, 45435, 45437, 45438, - 45439, 45441, 45443, 45444, 45445, 45446, 45447, 45450, 45452, 45454, - 45455, 45456, 45457, 45461, 45462, 45463, 45465, 45466, 45467, 45469, - 45470, 45471, 45472, 45473, 45474, 45475, 45476, 45477, 45478, 45479, - 45481, 45482, 45483, 45484, 45485, 45486, 45487, 45488, 45489, 45490, - 45491, 45492, 45493, 45494, 45495, 45496, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 45497, 45498, 45499, 45500, 45501, 45502, 45503, 45504, - 45505, 45506, 45507, 45508, 45509, 45510, 45511, 45512, 45513, 45514, - 45515, 45517, 45518, 45519, 45521, 45522, 45523, 45525, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 45526, 45527, 45528, 45529, 45530, 45531, - 45534, 45536, 45537, 45538, 45539, 45540, 45541, 45542, 45543, 45546, - 45547, 45549, 45550, 45551, 45553, 45554, 45555, 45556, 45557, 45558, - 45559, 45560, 45562, 45564, 45566, 45567, 45568, 45569, 45570, 45571, - 45574, 45575, 45577, 45578, 45581, 45582, 45583, 45584, 45585, 45586, - 45587, 45590, 45592, 45594, 45595, 45596, 45597, 45598, 45599, 45601, - 45602, 45603, 45604, 45605, 45606, 45607, 45608, 45609, 45610, 45611, - 45612, 45613, 45614, 45615, 45616, 45617, 45618, 45619, 45621, 45622, - 45623, 45624, 45625, 45626, 45627, 45629, 45630, 45631, 45632, 45633, - 45634, 45635, 45636, 45637, 45638, 45639, 45640, 45641, 45642, 45643, - 45644, 45645, 45646, 45647, 45648, 45649, 45650, 45651, 45652, 45653, - 45654, 45655, 45657, 45658, 45659, 45661, 45662, 45663, 45665, 45666, - 45667, 45668, 45669, 45670, 45671, 45674, 45675, 45676, 45677, 45678, - 45679, 45680, 45681, 45682, 45683, 45686, 45687, 45688, 45689, 45690, - 45691, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45702, 45703, - 45704, 45706, 45707, 45708, 45709, 45710, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 45711, 45714, 45715, 45717, 45718, 45719, 45723, 45724, - 45725, 45726, 45727, 45730, 45732, 45735, 45736, 45737, 45739, 45741, - 45742, 45743, 45745, 45746, 45747, 45749, 45750, 45751, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 45752, 45753, 45754, 45755, 45756, 45757, - 45758, 45759, 45760, 45761, 45762, 45763, 45764, 45765, 45766, 45767, - 45770, 45771, 45773, 45774, 45775, 45777, 45779, 45780, 45781, 45782, - 45783, 45786, 45788, 45790, 45791, 45792, 45793, 45795, 45799, 45801, - 45802, 45808, 45809, 45810, 45814, 45820, 45821, 45822, 45826, 45827, - 45829, 45830, 45831, 45833, 45834, 45835, 45836, 45837, 45838, 45839, - 45842, 45846, 45847, 45848, 45849, 45850, 45851, 45853, 45854, 45855, - 45856, 45857, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, - 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, - 45876, 45877, 45878, 45879, 45880, 45881, 45882, 45883, 45884, 45885, - 45886, 45887, 45888, 45889, 45890, 45891, 45892, 45893, 45894, 45895, - 45896, 45897, 45898, 45899, 45900, 45901, 45902, 45903, 45904, 45905, - 45906, 45907, 45911, 45913, 45914, 45917, 45920, 45921, 45922, 45923, - 45926, 45928, 45930, 45932, 45933, 45935, 45938, 45939, 45941, 45942, - 45943, 45945, 45946, 45947, 45948, 45949, 45950, 45951, 45954, 45958, - 45959, 45960, 45961, 45962, 45963, 45965, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 45966, 45967, 45969, 45970, 45971, 45973, 45974, 45975, - 45976, 45977, 45978, 45979, 45980, 45981, 45982, 45983, 45986, 45987, - 45988, 45989, 45990, 45991, 45993, 45994, 45995, 45997, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 45998, 45999, 46000, 46001, 46002, 46003, - 46004, 46005, 46006, 46007, 46008, 46009, 46010, 46011, 46012, 46013, - 46014, 46015, 46016, 46017, 46018, 46019, 46022, 46023, 46025, 46026, - 46029, 46031, 46033, 46034, 46035, 46038, 46040, 46042, 46044, 46046, - 46047, 46049, 46050, 46051, 46053, 46054, 46055, 46057, 46058, 46059, - 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46067, 46068, 46069, - 46070, 46071, 46072, 46073, 46074, 46075, 46077, 46078, 46079, 46080, - 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46088, 46089, 46090, - 46091, 46092, 46093, 46094, 46095, 46097, 46098, 46099, 46100, 46101, - 46102, 46103, 46105, 46106, 46107, 46109, 46110, 46111, 46113, 46114, - 46115, 46116, 46117, 46118, 46119, 46122, 46124, 46125, 46126, 46127, - 46128, 46129, 46130, 46131, 46133, 46134, 46135, 46136, 46137, 46138, - 46139, 46140, 46141, 46142, 46143, 46144, 46145, 46146, 46147, 46148, - 46149, 46150, 46151, 46152, 46153, 46154, 46155, 46156, 46157, 46158, - 46159, 46162, 46163, 46165, 46166, 46167, 46169, 46170, 46171, 46172, - 46173, 46174, 46175, 46178, 46180, 46182, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 46183, 46184, 46185, 46186, 46187, 46189, 46190, 46191, - 46192, 46193, 46194, 46195, 46196, 46197, 46198, 46199, 46200, 46201, - 46202, 46203, 46204, 46205, 46206, 46207, 46209, 46210, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 46211, 46212, 46213, 46214, 46215, 46217, - 46218, 46219, 46220, 46221, 46222, 46223, 46224, 46225, 46226, 46227, - 46228, 46229, 46230, 46231, 46232, 46233, 46234, 46235, 46236, 46238, - 46239, 46240, 46241, 46242, 46243, 46245, 46246, 46247, 46249, 46250, - 46251, 46253, 46254, 46255, 46256, 46257, 46258, 46259, 46260, 46262, - 46264, 46266, 46267, 46268, 46269, 46270, 46271, 46273, 46274, 46275, - 46277, 46278, 46279, 46281, 46282, 46283, 46284, 46285, 46286, 46287, - 46289, 46290, 46291, 46292, 46294, 46295, 46296, 46297, 46298, 46299, - 46302, 46303, 46305, 46306, 46309, 46311, 46312, 46313, 46314, 46315, - 46318, 46320, 46322, 46323, 46324, 46325, 46326, 46327, 46329, 46330, - 46331, 46332, 46333, 46334, 46335, 46336, 46337, 46338, 46339, 46340, - 46341, 46342, 46343, 46344, 46345, 46346, 46347, 46348, 46349, 46350, - 46351, 46352, 46353, 46354, 46355, 46358, 46359, 46361, 46362, 46365, - 46366, 46367, 46368, 46369, 46370, 46371, 46374, 46379, 46380, 46381, - 46382, 46383, 46386, 46387, 46389, 46390, 46391, 46393, 46394, 46395, - 46396, 46397, 46398, 46399, 46402, 46406, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 46407, 46408, 46409, 46410, 46414, 46415, 46417, 46418, - 46419, 46421, 46422, 46423, 46424, 46425, 46426, 46427, 46430, 46434, - 46435, 46436, 46437, 46438, 46439, 46440, 46441, 46442, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 46443, 46444, 46445, 46446, 46447, 46448, - 46449, 46450, 46451, 46452, 46453, 46454, 46455, 46456, 46457, 46458, - 46459, 46460, 46461, 46462, 46463, 46464, 46465, 46466, 46467, 46468, - 46469, 46470, 46471, 46472, 46473, 46474, 46475, 46476, 46477, 46478, - 46479, 46480, 46481, 46482, 46483, 46484, 46485, 46486, 46487, 46488, - 46489, 46490, 46491, 46492, 46493, 46494, 46495, 46498, 46499, 46501, - 46502, 46503, 46505, 46508, 46509, 46510, 46511, 46514, 46518, 46519, - 46520, 46521, 46522, 46526, 46527, 46529, 46530, 46531, 46533, 46534, - 46535, 46536, 46537, 46538, 46539, 46542, 46546, 46547, 46548, 46549, - 46550, 46551, 46553, 46554, 46555, 46556, 46557, 46558, 46559, 46560, - 46561, 46562, 46563, 46564, 46565, 46566, 46567, 46568, 46569, 46570, - 46571, 46573, 46574, 46575, 46576, 46577, 46578, 46579, 46580, 46581, - 46582, 46583, 46584, 46585, 46586, 46587, 46588, 46589, 46590, 46591, - 46592, 46593, 46594, 46595, 46596, 46597, 46598, 46599, 46600, 46601, - 46602, 46603, 46604, 46605, 46606, 46607, 46610, 46611, 46613, 46614, - 46615, 46617, 46618, 46619, 46620, 46621, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 46622, 46623, 46624, 46625, 46626, 46627, 46628, 46630, - 46631, 46632, 46633, 46634, 46635, 46637, 46638, 46639, 46640, 46641, - 46642, 46643, 46645, 46646, 46647, 46648, 46649, 46650, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 46651, 46652, 46653, 46654, 46655, 46656, - 46657, 46658, 46659, 46660, 46661, 46662, 46663, 46665, 46666, 46667, - 46668, 46669, 46670, 46671, 46672, 46673, 46674, 46675, 46676, 46677, - 46678, 46679, 46680, 46681, 46682, 46683, 46684, 46685, 46686, 46687, - 46688, 46689, 46690, 46691, 46693, 46694, 46695, 46697, 46698, 46699, - 46700, 46701, 46702, 46703, 46704, 46705, 46706, 46707, 46708, 46709, - 46710, 46711, 46712, 46713, 46714, 46715, 46716, 46717, 46718, 46719, - 46720, 46721, 46722, 46723, 46724, 46725, 46726, 46727, 46728, 46729, - 46730, 46731, 46732, 46733, 46734, 46735, 46736, 46737, 46738, 46739, - 46740, 46741, 46742, 46743, 46744, 46745, 46746, 46747, 46750, 46751, - 46753, 46754, 46755, 46757, 46758, 46759, 46760, 46761, 46762, 46765, - 46766, 46767, 46768, 46770, 46771, 46772, 46773, 46774, 46775, 46776, - 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, - 46787, 46788, 46789, 46790, 46791, 46792, 46793, 46794, 46795, 46796, - 46797, 46798, 46799, 46800, 46801, 46802, 46803, 46805, 46806, 46807, - 46808, 46809, 46810, 46811, 46812, 46813, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 46814, 46815, 46816, 46817, 46818, 46819, 46820, 46821, - 46822, 46823, 46824, 46825, 46826, 46827, 46828, 46829, 46830, 46831, - 46833, 46834, 46835, 46837, 46838, 46839, 46841, 46842, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 46843, 46844, 46845, 46846, 46847, 46850, - 46851, 46852, 46854, 46855, 46856, 46857, 46858, 46859, 46860, 46861, - 46862, 46863, 46864, 46865, 46866, 46867, 46868, 46869, 46870, 46871, - 46872, 46873, 46874, 46875, 46876, 46877, 46878, 46879, 46880, 46881, - 46882, 46883, 46884, 46885, 46886, 46887, 46890, 46891, 46893, 46894, - 46897, 46898, 46899, 46900, 46901, 46902, 46903, 46906, 46908, 46909, - 46910, 46911, 46912, 46913, 46914, 46915, 46917, 46918, 46919, 46921, - 46922, 46923, 46925, 46926, 46927, 46928, 46929, 46930, 46931, 46934, - 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46945, - 46946, 46947, 46949, 46950, 46951, 46953, 46954, 46955, 46956, 46957, - 46958, 46959, 46962, 46964, 46966, 46967, 46968, 46969, 46970, 46971, - 46974, 46975, 46977, 46978, 46979, 46981, 46982, 46983, 46984, 46985, - 46986, 46987, 46990, 46995, 46996, 46997, 47002, 47003, 47005, 47006, - 47007, 47009, 47010, 47011, 47012, 47013, 47014, 47015, 47018, 47022, - 47023, 47024, 47025, 47026, 47027, 47030, 47031, 47033, 47034, 47035, - 47036, 47037, 47038, 47039, 47040, 47041, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 47042, 47043, 47044, 47045, 47046, 47048, 47050, 47051, - 47052, 47053, 47054, 47055, 47056, 47057, 47058, 47059, 47060, 47061, - 47062, 47063, 47064, 47065, 47066, 47067, 47068, 47069, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 47070, 47071, 47072, 47073, 47074, 47075, - 47076, 47077, 47078, 47079, 47080, 47081, 47082, 47083, 47086, 47087, - 47089, 47090, 47091, 47093, 47094, 47095, 47096, 47097, 47098, 47099, - 47102, 47106, 47107, 47108, 47109, 47110, 47114, 47115, 47117, 47118, - 47119, 47121, 47122, 47123, 47124, 47125, 47126, 47127, 47130, 47132, - 47134, 47135, 47136, 47137, 47138, 47139, 47142, 47143, 47145, 47146, - 47147, 47149, 47150, 47151, 47152, 47153, 47154, 47155, 47158, 47162, - 47163, 47164, 47165, 47166, 47167, 47169, 47170, 47171, 47173, 47174, - 47175, 47176, 47177, 47178, 47179, 47180, 47181, 47182, 47183, 47184, - 47186, 47188, 47189, 47190, 47191, 47192, 47193, 47194, 47195, 47198, - 47199, 47201, 47202, 47203, 47205, 47206, 47207, 47208, 47209, 47210, - 47211, 47214, 47216, 47218, 47219, 47220, 47221, 47222, 47223, 47225, - 47226, 47227, 47229, 47230, 47231, 47232, 47233, 47234, 47235, 47236, - 47237, 47238, 47239, 47240, 47241, 47242, 47243, 47244, 47246, 47247, - 47248, 47249, 47250, 47251, 47252, 47253, 47254, 47255, 47256, 47257, - 47258, 47259, 47260, 47261, 47262, 47263, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 47264, 47265, 47266, 47267, 47268, 47269, 47270, 47271, - 47273, 47274, 47275, 47276, 47277, 47278, 47279, 47281, 47282, 47283, - 47285, 47286, 47287, 47289, 47290, 47291, 47292, 47293, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 47294, 47295, 47298, 47300, 47302, 47303, - 47304, 47305, 47306, 47307, 47309, 47310, 47311, 47313, 47314, 47315, - 47317, 47318, 47319, 47320, 47321, 47322, 47323, 47324, 47326, 47328, - 47330, 47331, 47332, 47333, 47334, 47335, 47338, 47339, 47341, 47342, - 47343, 47345, 47346, 47347, 47348, 47349, 47350, 47351, 47354, 47356, - 47358, 47359, 47360, 47361, 47362, 47363, 47365, 47366, 47367, 47368, - 47369, 47370, 47371, 47372, 47373, 47374, 47375, 47376, 47377, 47378, - 47379, 47380, 47381, 47382, 47383, 47385, 47386, 47387, 47388, 47389, - 47390, 47391, 47393, 47394, 47395, 47396, 47397, 47398, 47399, 47400, - 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47409, 47410, - 47411, 47412, 47413, 47414, 47415, 47416, 47417, 47418, 47419, 47422, - 47423, 47425, 47426, 47427, 47429, 47430, 47431, 47432, 47433, 47434, - 47435, 47437, 47438, 47440, 47442, 47443, 47444, 47445, 47446, 47447, - 47450, 47451, 47453, 47454, 47455, 47457, 47458, 47459, 47460, 47461, - 47462, 47463, 47466, 47468, 47470, 47471, 47472, 47473, 47474, 47475, - 47478, 47479, 47481, 47482, 47483, 47485, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 47486, 47487, 47488, 47489, 47490, 47491, 47494, 47496, - 47499, 47500, 47503, 47504, 47505, 47506, 47507, 47508, 47509, 47510, - 47511, 47512, 47513, 47514, 47515, 47516, 47517, 47518, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 47519, 47520, 47521, 47522, 47523, 47524, - 47525, 47526, 47527, 47528, 47529, 47530, 47531, 47534, 47535, 47537, - 47538, 47539, 47541, 47542, 47543, 47544, 47545, 47546, 47547, 47550, - 47552, 47554, 47555, 47556, 47557, 47558, 47559, 47562, 47563, 47565, - 47571, 47572, 47573, 47574, 47575, 47578, 47580, 47583, 47584, 47586, - 47590, 47591, 47593, 47594, 47595, 47597, 47598, 47599, 47600, 47601, - 47602, 47603, 47606, 47611, 47612, 47613, 47614, 47615, 47618, 47619, - 47620, 47621, 47622, 47623, 47625, 47626, 47627, 47628, 47629, 47630, - 47631, 47632, 47633, 47634, 47635, 47636, 47638, 47639, 47640, 47641, - 47642, 47643, 47644, 47645, 47646, 47647, 47648, 47649, 47650, 47651, - 47652, 47653, 47654, 47655, 47656, 47657, 47658, 47659, 47660, 47661, - 47662, 47663, 47664, 47665, 47666, 47667, 47668, 47669, 47670, 47671, - 47674, 47675, 47677, 47678, 47679, 47681, 47683, 47684, 47685, 47686, - 47687, 47690, 47692, 47695, 47696, 47697, 47698, 47702, 47703, 47705, - 47706, 47707, 47709, 47710, 47711, 47712, 47713, 47714, 47715, 47718, - 47722, 47723, 47724, 47725, 47726, 47727, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 47730, 47731, 47733, 47734, 47735, 47737, 47738, 47739, - 47740, 47741, 47742, 47743, 47744, 47745, 47746, 47750, 47752, 47753, - 47754, 47755, 47757, 47758, 47759, 47760, 47761, 47762, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 47763, 47764, 47765, 47766, 47767, 47768, - 47769, 47770, 47771, 47772, 47773, 47774, 47775, 47776, 47777, 47778, - 47779, 47780, 47781, 47782, 47783, 47786, 47789, 47790, 47791, 47793, - 47795, 47796, 47797, 47798, 47799, 47802, 47804, 47806, 47807, 47808, - 47809, 47810, 47811, 47813, 47814, 47815, 47817, 47818, 47819, 47820, - 47821, 47822, 47823, 47824, 47825, 47826, 47827, 47828, 47829, 47830, - 47831, 47834, 47835, 47836, 47837, 47838, 47839, 47840, 47841, 47842, - 47843, 47844, 47845, 47846, 47847, 47848, 47849, 47850, 47851, 47852, - 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, - 47863, 47864, 47865, 47866, 47867, 47869, 47870, 47871, 47873, 47874, - 47875, 47877, 47878, 47879, 47880, 47881, 47882, 47883, 47884, 47886, - 47888, 47890, 47891, 47892, 47893, 47894, 47895, 47897, 47898, 47899, - 47901, 47902, 47903, 47905, 47906, 47907, 47908, 47909, 47910, 47911, - 47912, 47914, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, - 47927, 47929, 47930, 47935, 47936, 47937, 47938, 47939, 47942, 47944, - 47946, 47947, 47948, 47950, 47953, 47954, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 47955, 47957, 47958, 47959, 47961, 47962, 47963, 47964, - 47965, 47966, 47967, 47968, 47970, 47972, 47973, 47974, 47975, 47976, - 47977, 47978, 47979, 47981, 47982, 47983, 47984, 47985, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 47986, 47987, 47988, 47989, 47990, 47991, - 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, - 48002, 48003, 48004, 48005, 48006, 48007, 48009, 48010, 48011, 48013, - 48014, 48015, 48017, 48018, 48019, 48020, 48021, 48022, 48023, 48024, - 48025, 48026, 48027, 48028, 48029, 48030, 48031, 48032, 48033, 48034, - 48035, 48037, 48038, 48039, 48041, 48042, 48043, 48045, 48046, 48047, - 48048, 48049, 48050, 48051, 48053, 48054, 48056, 48057, 48058, 48059, - 48060, 48061, 48062, 48063, 48065, 48066, 48067, 48069, 48070, 48071, - 48073, 48074, 48075, 48076, 48077, 48078, 48079, 48081, 48082, 48084, - 48085, 48086, 48087, 48088, 48089, 48090, 48091, 48092, 48093, 48094, - 48095, 48096, 48097, 48098, 48099, 48100, 48101, 48102, 48103, 48104, - 48105, 48106, 48107, 48108, 48109, 48110, 48111, 48112, 48113, 48114, - 48115, 48116, 48117, 48118, 48119, 48122, 48123, 48125, 48126, 48129, - 48131, 48132, 48133, 48134, 48135, 48138, 48142, 48144, 48146, 48147, - 48153, 48154, 48160, 48161, 48162, 48163, 48166, 48168, 48170, 48171, - 48172, 48174, 48175, 48178, 48179, 48181, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 48182, 48183, 48185, 48186, 48187, 48188, 48189, 48190, - 48191, 48194, 48198, 48199, 48200, 48202, 48203, 48206, 48207, 48209, - 48210, 48211, 48212, 48213, 48214, 48215, 48216, 48217, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 48218, 48219, 48220, 48222, 48223, 48224, - 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, - 48235, 48236, 48237, 48238, 48239, 48240, 48241, 48242, 48243, 48244, - 48245, 48246, 48247, 48248, 48249, 48250, 48251, 48252, 48253, 48254, - 48255, 48256, 48257, 48258, 48259, 48262, 48263, 48265, 48266, 48269, - 48271, 48272, 48273, 48274, 48275, 48278, 48280, 48283, 48284, 48285, - 48286, 48287, 48290, 48291, 48293, 48294, 48297, 48298, 48299, 48300, - 48301, 48302, 48303, 48306, 48310, 48311, 48312, 48313, 48314, 48315, - 48318, 48319, 48321, 48322, 48323, 48325, 48326, 48327, 48328, 48329, - 48330, 48331, 48332, 48334, 48338, 48339, 48340, 48342, 48343, 48345, - 48346, 48347, 48349, 48350, 48351, 48352, 48353, 48354, 48355, 48356, - 48357, 48358, 48359, 48360, 48361, 48362, 48363, 48364, 48365, 48366, - 48367, 48368, 48369, 48370, 48371, 48375, 48377, 48378, 48379, 48381, - 48382, 48383, 48384, 48385, 48386, 48387, 48390, 48392, 48394, 48395, - 48396, 48397, 48398, 48399, 48401, 48402, 48403, 48405, 48406, 48407, - 48408, 48409, 48410, 48411, 48412, 48413, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 48414, 48415, 48416, 48417, 48418, 48419, 48421, 48422, - 48423, 48424, 48425, 48426, 48427, 48429, 48430, 48431, 48432, 48433, - 48434, 48435, 48436, 48437, 48438, 48439, 48440, 48441, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 48442, 48443, 48444, 48445, 48446, 48447, - 48449, 48450, 48451, 48452, 48453, 48454, 48455, 48458, 48459, 48461, - 48462, 48463, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48474, - 48475, 48476, 48477, 48478, 48479, 48480, 48481, 48482, 48483, 48485, - 48486, 48487, 48489, 48490, 48491, 48492, 48493, 48494, 48495, 48496, - 48497, 48498, 48499, 48500, 48501, 48502, 48503, 48504, 48505, 48506, - 48507, 48508, 48509, 48510, 48511, 48514, 48515, 48517, 48518, 48523, - 48524, 48525, 48526, 48527, 48530, 48532, 48534, 48535, 48536, 48539, - 48541, 48542, 48543, 48544, 48545, 48546, 48547, 48549, 48550, 48551, - 48552, 48553, 48554, 48555, 48556, 48557, 48558, 48559, 48561, 48562, - 48563, 48564, 48565, 48566, 48567, 48569, 48570, 48571, 48572, 48573, - 48574, 48575, 48576, 48577, 48578, 48579, 48580, 48581, 48582, 48583, - 48584, 48585, 48586, 48587, 48588, 48589, 48590, 48591, 48592, 48593, - 48594, 48595, 48598, 48599, 48601, 48602, 48603, 48605, 48606, 48607, - 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48618, - 48619, 48620, 48621, 48622, 48623, 48625, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 48626, 48627, 48629, 48630, 48631, 48633, 48634, 48635, - 48636, 48637, 48638, 48639, 48641, 48642, 48644, 48646, 48647, 48648, - 48649, 48650, 48651, 48654, 48655, 48657, 48658, 48659, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 48661, 48662, 48663, 48664, 48665, 48666, - 48667, 48670, 48672, 48673, 48674, 48675, 48676, 48677, 48678, 48679, - 48680, 48681, 48682, 48683, 48684, 48685, 48686, 48687, 48688, 48689, - 48690, 48691, 48692, 48693, 48694, 48695, 48696, 48697, 48698, 48699, - 48700, 48701, 48702, 48703, 48704, 48705, 48706, 48707, 48710, 48711, - 48713, 48714, 48715, 48717, 48719, 48720, 48721, 48722, 48723, 48726, - 48728, 48732, 48733, 48734, 48735, 48738, 48739, 48741, 48742, 48743, - 48745, 48747, 48748, 48749, 48750, 48751, 48754, 48758, 48759, 48760, - 48761, 48762, 48766, 48767, 48769, 48770, 48771, 48773, 48774, 48775, - 48776, 48777, 48778, 48779, 48782, 48786, 48787, 48788, 48789, 48790, - 48791, 48794, 48795, 48796, 48797, 48798, 48799, 48800, 48801, 48802, - 48803, 48804, 48805, 48806, 48807, 48809, 48810, 48811, 48812, 48813, - 48814, 48815, 48816, 48817, 48818, 48819, 48820, 48821, 48822, 48823, - 48824, 48825, 48826, 48827, 48828, 48829, 48830, 48831, 48832, 48833, - 48834, 48835, 48836, 48837, 48838, 48839, 48840, 48841, 48842, 48843, - 48844, 48845, 48846, 48847, 48850, 48851, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 48853, 48854, 48857, 48858, 48859, 48860, 48861, 48862, - 48863, 48865, 48866, 48870, 48871, 48872, 48873, 48874, 48875, 48877, - 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 48886, 48887, 48888, 48889, 48890, 48891, - 48892, 48893, 48894, 48895, 48896, 48898, 48899, 48900, 48901, 48902, - 48903, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48914, - 48915, 48916, 48917, 48918, 48919, 48922, 48926, 48927, 48928, 48929, - 48930, 48931, 48932, 48933, 48934, 48935, 48936, 48937, 48938, 48939, - 48940, 48941, 48942, 48943, 48944, 48945, 48946, 48947, 48948, 48949, - 48950, 48951, 48952, 48953, 48954, 48955, 48956, 48957, 48958, 48959, - 48962, 48963, 48965, 48966, 48967, 48969, 48970, 48971, 48972, 48973, - 48974, 48975, 48978, 48979, 48980, 48982, 48983, 48984, 48985, 48986, - 48987, 48988, 48989, 48990, 48991, 48992, 48993, 48994, 48995, 48996, - 48997, 48998, 48999, 49000, 49001, 49002, 49003, 49004, 49005, 49006, - 49007, 49008, 49009, 49010, 49011, 49012, 49013, 49014, 49015, 49016, - 49017, 49018, 49019, 49020, 49021, 49022, 49023, 49024, 49025, 49026, - 49027, 49028, 49029, 49030, 49031, 49032, 49033, 49034, 49035, 49036, - 49037, 49038, 49039, 49040, 49041, 49042, 49043, 49045, 49046, 49047, - 49048, 49049, 49050, 49051, 49052, 49053, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 49054, 49055, 49056, 49057, 49058, 49059, 49060, 49061, - 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, - 49073, 49074, 49075, 49076, 49077, 49078, 49079, 49080, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 49081, 49082, 49083, 49084, 49085, 49086, - 49087, 49088, 49089, 49090, 49091, 49092, 49094, 49095, 49096, 49097, - 49098, 49099, 49102, 49103, 49105, 49106, 49107, 49109, 49110, 49111, - 49112, 49113, 49114, 49115, 49117, 49118, 49120, 49122, 49123, 49124, - 49125, 49126, 49127, 49128, 49129, 49130, 49131, 49132, 49133, 49134, - 49135, 49136, 49137, 49138, 49139, 49140, 49141, 49142, 49143, 49144, - 49145, 49146, 49147, 49148, 49149, 49150, 49151, 49152, 49153, 49154, - 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49162, 49163, 49164, - 49165, 49166, 49167, 49168, 49169, 49170, 49171, 49172, 49173, 49174, - 49175, 49176, 49177, 49178, 49179, 49180, 49181, 49182, 49183, 49184, - 49185, 49186, 49187, 49188, 49189, 49190, 49191, 49192, 49193, 49194, - 49195, 49196, 49197, 49198, 49199, 49200, 49201, 49202, 49203, 49204, - 49205, 49206, 49207, 49208, 49209, 49210, 49211, 49213, 49214, 49215, - 49216, 49217, 49218, 49219, 49220, 49221, 49222, 49223, 49224, 49225, - 49226, 49227, 49228, 49229, 49230, 49231, 49232, 49234, 49235, 49236, - 49237, 49238, 49239, 49241, 49242, 49243, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 49245, 49246, 49247, 49249, 49250, 49251, 49252, 49253, - 49254, 49255, 49258, 49259, 49260, 49261, 49262, 49263, 49264, 49265, - 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49273, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 49274, 49275, 49276, 49277, 49278, 49279, - 49280, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, - 49290, 49291, 49292, 49293, 49294, 49295, 49298, 49299, 49301, 49302, - 49303, 49305, 49306, 49307, 49308, 49309, 49310, 49311, 49314, 49316, - 49318, 49319, 49320, 49321, 49322, 49323, 49326, 49329, 49330, 49335, - 49336, 49337, 49338, 49339, 49342, 49346, 49347, 49348, 49350, 49351, - 49354, 49355, 49357, 49358, 49359, 49361, 49362, 49363, 49364, 49365, - 49366, 49367, 49370, 49374, 49375, 49376, 49377, 49378, 49379, 49382, - 49383, 49385, 49386, 49387, 49389, 49390, 49391, 49392, 49393, 49394, - 49395, 49398, 49400, 49402, 49403, 49404, 49405, 49406, 49407, 49409, - 49410, 49411, 49413, 49414, 49415, 49417, 49418, 49419, 49420, 49421, - 49422, 49423, 49425, 49426, 49427, 49428, 49430, 49431, 49432, 49433, - 49434, 49435, 49441, 49442, 49445, 49448, 49449, 49450, 49451, 49454, - 49458, 49459, 49460, 49461, 49463, 49466, 49467, 49469, 49470, 49471, - 49473, 49474, 49475, 49476, 49477, 49478, 49479, 49482, 49486, 49487, - 49488, 49489, 49490, 49491, 49494, 49495, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 49497, 49498, 49499, 49501, 49502, 49503, 49504, 49505, - 49506, 49507, 49510, 49514, 49515, 49516, 49517, 49518, 49519, 49521, - 49522, 49523, 49525, 49526, 49527, 49529, 49530, 49531, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 49532, 49533, 49534, 49535, 49536, 49537, - 49538, 49539, 49540, 49542, 49543, 49544, 49545, 49546, 49547, 49551, - 49553, 49554, 49555, 49557, 49559, 49560, 49561, 49562, 49563, 49566, - 49568, 49570, 49571, 49572, 49574, 49575, 49578, 49579, 49581, 49582, - 49583, 49585, 49586, 49587, 49588, 49589, 49590, 49591, 49592, 49593, - 49594, 49595, 49596, 49598, 49599, 49600, 49601, 49602, 49603, 49605, - 49606, 49607, 49609, 49610, 49611, 49613, 49614, 49615, 49616, 49617, - 49618, 49619, 49621, 49622, 49625, 49626, 49627, 49628, 49629, 49630, - 49631, 49633, 49634, 49635, 49637, 49638, 49639, 49641, 49642, 49643, - 49644, 49645, 49646, 49647, 49650, 49652, 49653, 49654, 49655, 49656, - 49657, 49658, 49659, 49662, 49663, 49665, 49666, 49667, 49669, 49670, - 49671, 49672, 49673, 49674, 49675, 49678, 49680, 49682, 49683, 49684, - 49685, 49686, 49687, 49690, 49691, 49693, 49694, 49697, 49698, 49699, - 49700, 49701, 49702, 49703, 49706, 49708, 49710, 49712, 49715, 49717, - 49718, 49719, 49720, 49721, 49722, 49723, 49724, 49725, 49726, 49727, - 49728, 49729, 49730, 49731, 49732, 49733, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 49734, 49735, 49737, 49738, 49739, 49740, 49741, 49742, - 49743, 49746, 49747, 49749, 49750, 49751, 49753, 49754, 49755, 49756, - 49757, 49758, 49759, 49761, 49762, 49763, 49764, 49766, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 49767, 49768, 49769, 49770, 49771, 49774, - 49775, 49777, 49778, 49779, 49781, 49782, 49783, 49784, 49785, 49786, - 49787, 49790, 49792, 49794, 49795, 49796, 49797, 49798, 49799, 49802, - 49803, 49804, 49805, 49806, 49807, 49809, 49810, 49811, 49812, 49813, - 49814, 49815, 49817, 49818, 49820, 49822, 49823, 49824, 49825, 49826, - 49827, 49830, 49831, 49833, 49834, 49835, 49838, 49839, 49840, 49841, - 49842, 49843, 49846, 49848, 49850, 49851, 49852, 49853, 49854, 49855, - 49856, 49857, 49858, 49859, 49860, 49861, 49862, 49863, 49864, 49865, - 49866, 49867, 49868, 49869, 49870, 49871, 49872, 49873, 49874, 49875, - 49876, 49877, 49878, 49879, 49880, 49881, 49882, 49883, 49886, 49887, - 49889, 49890, 49893, 49894, 49895, 49896, 49897, 49898, 49902, 49904, - 49906, 49907, 49908, 49909, 49911, 49914, 49917, 49918, 49919, 49921, - 49922, 49923, 49924, 49925, 49926, 49927, 49930, 49931, 49934, 49935, - 49936, 49937, 49938, 49942, 49943, 49945, 49946, 49947, 49949, 49950, - 49951, 49952, 49953, 49954, 49955, 49958, 49959, 49962, 49963, 49964, - 49965, 49966, 49967, 49968, 49969, 49970, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 49971, 49972, 49973, 49974, 49975, 49976, 49977, 49978, - 49979, 49980, 49981, 49982, 49983, 49984, 49985, 49986, 49987, 49988, - 49990, 49991, 49992, 49993, 49994, 49995, 49996, 49997, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 49998, 49999, 50000, 50001, 50002, 50003, - 50004, 50005, 50006, 50007, 50008, 50009, 50010, 50011, 50012, 50013, - 50014, 50015, 50016, 50017, 50018, 50019, 50020, 50021, 50022, 50023, - 50026, 50027, 50029, 50030, 50031, 50033, 50035, 50036, 50037, 50038, - 50039, 50042, 50043, 50046, 50047, 50048, 50049, 50050, 50051, 50053, - 50054, 50055, 50057, 50058, 50059, 50061, 50062, 50063, 50064, 50065, - 50066, 50067, 50068, 50069, 50070, 50071, 50072, 50073, 50074, 50075, - 50076, 50077, 50078, 50079, 50080, 50081, 50082, 50083, 50084, 50085, - 50086, 50087, 50088, 50089, 50090, 50091, 50092, 50093, 50094, 50095, - 50096, 50097, 50098, 50099, 50100, 50101, 50102, 50103, 50104, 50105, - 50106, 50107, 50108, 50109, 50110, 50111, 50113, 50114, 50115, 50116, - 50117, 50118, 50119, 50120, 50121, 50122, 50123, 50124, 50125, 50126, - 50127, 50128, 50129, 50130, 50131, 50132, 50133, 50134, 50135, 50138, - 50139, 50141, 50142, 50145, 50147, 50148, 50149, 50150, 50151, 50154, - 50155, 50156, 50158, 50159, 50160, 50161, 50162, 50163, 50166, 50167, - 50169, 50170, 50171, 50172, 50173, 50174, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 50175, 50176, 50177, 50178, 50179, 50180, 50181, 50182, - 50183, 50185, 50186, 50187, 50188, 50189, 50190, 50191, 50193, 50194, - 50195, 50196, 50197, 50198, 50199, 50200, 50201, 50202, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 50203, 50204, 50205, 50206, 50207, 50208, - 50209, 50210, 50211, 50213, 50214, 50215, 50216, 50217, 50218, 50219, - 50221, 50222, 50223, 50225, 50226, 50227, 50229, 50230, 50231, 50232, - 50233, 50234, 50235, 50238, 50239, 50240, 50241, 50242, 50243, 50244, - 50245, 50246, 50247, 50249, 50250, 50251, 50252, 50253, 50254, 50255, - 50256, 50257, 50258, 50259, 50260, 50261, 50262, 50263, 50264, 50265, - 50266, 50267, 50268, 50269, 50270, 50271, 50272, 50273, 50274, 50275, - 50278, 50279, 50281, 50282, 50283, 50285, 50286, 50287, 50288, 50289, - 50290, 50291, 50294, 50295, 50296, 50298, 50299, 50300, 50301, 50302, - 50303, 50305, 50306, 50307, 50308, 50309, 50310, 50311, 50312, 50313, - 50314, 50315, 50316, 50317, 50318, 50319, 50320, 50321, 50322, 50323, - 50325, 50326, 50327, 50328, 50329, 50330, 50331, 50333, 50334, 50335, - 50336, 50337, 50338, 50339, 50340, 50341, 50342, 50343, 50344, 50345, - 50346, 50347, 50348, 50349, 50350, 50351, 50352, 50353, 50354, 50355, - 50356, 50357, 50358, 50359, 50361, 50362, 50363, 50365, 50366, 50367, - 50368, 50369, 50370, 50371, 50372, 50373, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 50374, 50375, 50376, 50377, 50378, 50379, 50380, 50381, - 50382, 50383, 50384, 50385, 50386, 50387, 50388, 50389, 50390, 50391, - 50392, 50393, 50394, 50395, 50396, 50397, 50398, 50399, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 50400, 50401, 50402, 50403, 50404, 50405, - 50406, 50407, 50408, 50410, 50411, 50412, 50413, 50414, 50415, 50418, - 50419, 50421, 50422, 50423, 50425, 50427, 50428, 50429, 50430, 50434, - 50435, 50436, 50437, 50438, 50439, 50440, 50441, 50442, 50443, 50445, - 50446, 50447, 50449, 50450, 50451, 50453, 50454, 50455, 50456, 50457, - 50458, 50459, 50461, 50462, 50463, 50464, 50465, 50466, 50467, 50468, - 50469, 50470, 50471, 50474, 50475, 50477, 50478, 50479, 50481, 50482, - 50483, 50484, 50485, 50486, 50487, 50490, 50492, 50494, 50495, 50496, - 50497, 50498, 50499, 50502, 50503, 50507, 50511, 50512, 50513, 50514, - 50518, 50522, 50523, 50524, 50527, 50530, 50531, 50533, 50534, 50535, - 50537, 50538, 50539, 50540, 50541, 50542, 50543, 50546, 50550, 50551, - 50552, 50553, 50554, 50555, 50558, 50559, 50561, 50562, 50563, 50565, - 50566, 50568, 50569, 50570, 50571, 50574, 50576, 50578, 50579, 50580, - 50582, 50585, 50586, 50587, 50589, 50590, 50591, 50593, 50594, 50595, - 50596, 50597, 50598, 50599, 50600, 50602, 50603, 50604, 50605, 50606, - 50607, 50608, 50609, 50610, 50611, 50614, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 50615, 50618, 50623, 50624, 50625, 50626, 50627, 50635, - 50637, 50639, 50642, 50643, 50645, 50646, 50647, 50649, 50650, 50651, - 50652, 50653, 50654, 50655, 50658, 50660, 50662, 50663, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 50664, 50665, 50666, 50667, 50671, 50673, - 50674, 50675, 50677, 50680, 50681, 50682, 50683, 50690, 50691, 50692, - 50697, 50698, 50699, 50701, 50702, 50703, 50705, 50706, 50707, 50708, - 50709, 50710, 50711, 50714, 50717, 50718, 50719, 50720, 50721, 50722, - 50723, 50726, 50727, 50729, 50730, 50731, 50735, 50737, 50738, 50742, - 50744, 50746, 50748, 50749, 50750, 50751, 50754, 50755, 50757, 50758, - 50759, 50761, 50762, 50763, 50764, 50765, 50766, 50767, 50770, 50774, - 50775, 50776, 50777, 50778, 50779, 50782, 50783, 50785, 50786, 50787, - 50788, 50789, 50790, 50791, 50792, 50793, 50794, 50795, 50797, 50798, - 50800, 50802, 50803, 50804, 50805, 50806, 50807, 50810, 50811, 50813, - 50814, 50815, 50817, 50818, 50819, 50820, 50821, 50822, 50823, 50826, - 50828, 50830, 50831, 50832, 50833, 50834, 50835, 50838, 50839, 50841, - 50842, 50843, 50845, 50846, 50847, 50848, 50849, 50850, 50851, 50854, - 50856, 50858, 50859, 50860, 50861, 50862, 50863, 50866, 50867, 50869, - 50870, 50871, 50875, 50876, 50877, 50878, 50879, 50882, 50884, 50886, - 50887, 50888, 50889, 50890, 50891, 50894, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 50895, 50897, 50898, 50899, 50901, 50902, 50903, 50904, - 50905, 50906, 50907, 50910, 50911, 50914, 50915, 50916, 50917, 50918, - 50919, 50922, 50923, 50925, 50926, 50927, 50929, 50930, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 50931, 50932, 50933, 50934, 50935, 50938, - 50939, 50940, 50942, 50943, 50944, 50945, 50946, 50947, 50950, 50951, - 50953, 50954, 50955, 50957, 50958, 50959, 50960, 50961, 50962, 50963, - 50966, 50968, 50970, 50971, 50972, 50973, 50974, 50975, 50978, 50979, - 50981, 50982, 50983, 50985, 50986, 50987, 50988, 50989, 50990, 50991, - 50994, 50996, 50998, 51000, 51001, 51002, 51003, 51006, 51007, 51009, - 51010, 51011, 51013, 51014, 51015, 51016, 51017, 51019, 51022, 51024, - 51033, 51034, 51035, 51037, 51038, 51039, 51041, 51042, 51043, 51044, - 51045, 51046, 51047, 51049, 51050, 51052, 51053, 51054, 51055, 51056, - 51057, 51058, 51059, 51062, 51063, 51065, 51066, 51067, 51071, 51072, - 51073, 51074, 51078, 51083, 51084, 51085, 51087, 51090, 51091, 51093, - 51097, 51099, 51100, 51101, 51102, 51103, 51106, 51111, 51112, 51113, - 51114, 51115, 51118, 51119, 51121, 51122, 51123, 51125, 51126, 51127, - 51128, 51129, 51130, 51131, 51134, 51138, 51139, 51140, 51141, 51142, - 51143, 51146, 51147, 51149, 51151, 51153, 51154, 51155, 51156, 51157, - 51158, 51159, 51161, 51162, 51163, 51164, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51166, 51167, 51168, 51169, 51170, 51171, 51173, 51174, - 51175, 51177, 51178, 51179, 51181, 51182, 51183, 51184, 51185, 51186, - 51187, 51188, 51189, 51190, 51191, 51192, 51193, 51194, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51195, 51196, 51197, 51198, 51199, 51202, - 51203, 51205, 51206, 51207, 51209, 51211, 51212, 51213, 51214, 51215, - 51218, 51220, 51223, 51224, 51225, 51226, 51227, 51230, 51231, 51233, - 51234, 51235, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51246, - 51248, 51250, 51251, 51252, 51253, 51254, 51255, 51257, 51258, 51259, - 51261, 51262, 51263, 51265, 51266, 51267, 51268, 51269, 51270, 51271, - 51274, 51275, 51278, 51279, 51280, 51281, 51282, 51283, 51285, 51286, - 51287, 51288, 51289, 51290, 51291, 51292, 51293, 51294, 51295, 51296, - 51297, 51298, 51299, 51300, 51301, 51302, 51303, 51304, 51305, 51306, - 51307, 51308, 51309, 51310, 51311, 51314, 51315, 51317, 51318, 51319, - 51321, 51323, 51324, 51325, 51326, 51327, 51330, 51332, 51336, 51337, - 51338, 51342, 51343, 51344, 51345, 51346, 51347, 51349, 51350, 51351, - 51352, 51353, 51354, 51355, 51356, 51358, 51360, 51362, 51363, 51364, - 51365, 51366, 51367, 51369, 51370, 51371, 51372, 51373, 51374, 51375, - 51376, 51377, 51378, 51379, 51380, 51381, 51382, 51383, 51384, 51385, - 51386, 51387, 51390, 51391, 51392, 51393, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51394, 51395, 51397, 51398, 51399, 51401, 51402, 51403, - 51405, 51406, 51407, 51408, 51409, 51410, 51411, 51414, 51416, 51418, - 51419, 51420, 51421, 51422, 51423, 51426, 51427, 51429, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51430, 51431, 51432, 51433, 51434, 51435, - 51436, 51437, 51438, 51439, 51440, 51441, 51442, 51443, 51444, 51446, - 51447, 51448, 51449, 51450, 51451, 51454, 51455, 51457, 51458, 51459, - 51463, 51464, 51465, 51466, 51467, 51470, 12288, 12289, 12290, 183, - 8229, 8230, 168, 12291, 173, 8213, 8741, 65340, 8764, 8216, - 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, - 12301, 12302, 12303, 12304, 12305, 177, 215, 247, 8800, 8804, - 8805, 8734, 8756, 176, 8242, 8243, 8451, 8491, 65504, 65505, - 65509, 9794, 9792, 8736, 8869, 8978, 8706, 8711, 8801, 8786, - 167, 8251, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, - 9632, 9651, 9650, 9661, 9660, 8594, 8592, 8593, 8595, 8596, - 12307, 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 8712, - 8715, 8838, 8839, 8834, 8835, 8746, 8745, 8743, 8744, 65506, - 51472, 51474, 51475, 51476, 51477, 51478, 51479, 51481, 51482, 51483, - 51484, 51485, 51486, 51487, 51488, 51489, 51490, 51491, 51492, 51493, - 51494, 51495, 51496, 51497, 51498, 51499, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51501, 51502, 51503, 51504, 51505, 51506, 51507, 51509, - 51510, 51511, 51512, 51513, 51514, 51515, 51516, 51517, 51518, 51519, - 51520, 51521, 51522, 51523, 51524, 51525, 51526, 51527, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51528, 51529, 51530, 51531, 51532, 51533, - 51534, 51535, 51538, 51539, 51541, 51542, 51543, 51545, 51546, 51547, - 51548, 51549, 51550, 51551, 51554, 51556, 51557, 51558, 51559, 51560, - 51561, 51562, 51563, 51565, 51566, 51567, 8658, 8660, 8704, 8707, - 180, 65374, 711, 728, 733, 730, 729, 184, 731, 161, - 191, 720, 8750, 8721, 8719, 164, 8457, 8240, 9665, 9664, - 9655, 9654, 9828, 9824, 9825, 9829, 9831, 9827, 8857, 9672, - 9635, 9680, 9681, 9618, 9636, 9637, 9640, 9639, 9638, 9641, - 9832, 9743, 9742, 9756, 9758, 182, 8224, 8225, 8597, 8599, - 8601, 8598, 8600, 9837, 9833, 9834, 9836, 12927, 12828, 8470, - 13255, 8482, 13250, 13272, 8481, 8364, 174, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 51569, 51570, 51571, 51573, 51574, 51575, 51576, 51577, 51578, 51579, - 51581, 51582, 51583, 51584, 51585, 51586, 51587, 51588, 51589, 51590, - 51591, 51594, 51595, 51597, 51598, 51599, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51601, 51602, 51603, 51604, 51605, 51606, 51607, 51610, - 51612, 51614, 51615, 51616, 51617, 51618, 51619, 51620, 51621, 51622, - 51623, 51624, 51625, 51626, 51627, 51628, 51629, 51630, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51631, 51632, 51633, 51634, 51635, 51636, - 51637, 51638, 51639, 51640, 51641, 51642, 51643, 51644, 51645, 51646, - 51647, 51650, 51651, 51653, 51654, 51657, 51659, 51660, 51661, 51662, - 51663, 51666, 51668, 51671, 51672, 51675, 65281, 65282, 65283, 65284, - 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, - 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, - 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, - 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, - 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, - 65335, 65336, 65337, 65338, 65339, 65510, 65341, 65342, 65343, 65344, - 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, - 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, - 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, - 51678, 51679, 51681, 51683, 51685, 51686, 51688, 51689, 51690, 51691, - 51694, 51698, 51699, 51700, 51701, 51702, 51703, 51706, 51707, 51709, - 51710, 51711, 51713, 51714, 51715, 51716, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51717, 51718, 51719, 51722, 51726, 51727, 51728, 51729, - 51730, 51731, 51733, 51734, 51735, 51737, 51738, 51739, 51740, 51741, - 51742, 51743, 51744, 51745, 51746, 51747, 51748, 51749, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51750, 51751, 51752, 51754, 51755, 51756, - 51757, 51758, 51759, 51760, 51761, 51762, 51763, 51764, 51765, 51766, - 51767, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, - 51777, 51778, 51779, 51780, 51781, 51782, 12593, 12594, 12595, 12596, - 12597, 12598, 12599, 12600, 12601, 12602, 12603, 12604, 12605, 12606, - 12607, 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615, 12616, - 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, - 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 12636, - 12637, 12638, 12639, 12640, 12641, 12642, 12643, 12644, 12645, 12646, - 12647, 12648, 12649, 12650, 12651, 12652, 12653, 12654, 12655, 12656, - 12657, 12658, 12659, 12660, 12661, 12662, 12663, 12664, 12665, 12666, - 12667, 12668, 12669, 12670, 12671, 12672, 12673, 12674, 12675, 12676, - 12677, 12678, 12679, 12680, 12681, 12682, 12683, 12684, 12685, 12686, - 51783, 51784, 51785, 51786, 51787, 51790, 51791, 51793, 51794, 51795, - 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51806, 51810, 51811, - 51812, 51813, 51814, 51815, 51817, 51818, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51826, - 51827, 51828, 51829, 51830, 51831, 51832, 51833, 51834, 51835, 51836, - 51838, 51839, 51840, 51841, 51842, 51843, 51845, 51846, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51847, 51848, 51849, 51850, 51851, 51852, - 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, - 51863, 51865, 51866, 51867, 51868, 51869, 51870, 51871, 51872, 51873, - 51874, 51875, 51876, 51877, 51878, 51879, 8560, 8561, 8562, 8563, - 8564, 8565, 8566, 8567, 8568, 8569, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, - 8553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 913, 914, - 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, - 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, - 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, - 955, 956, 957, 958, 959, 960, 961, 963, 964, 965, - 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, - 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, - 51902, 51903, 51905, 51906, 51907, 51909, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 51910, 51911, 51912, 51913, 51914, 51915, 51918, 51920, - 51922, 51924, 51925, 51926, 51927, 51930, 51931, 51932, 51933, 51934, - 51935, 51937, 51938, 51939, 51940, 51941, 51942, 51943, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 51944, 51945, 51946, 51947, 51949, 51950, - 51951, 51952, 51953, 51954, 51955, 51957, 51958, 51959, 51960, 51961, - 51962, 51963, 51964, 51965, 51966, 51967, 51968, 51969, 51970, 51971, - 51972, 51973, 51974, 51975, 51977, 51978, 9472, 9474, 9484, 9488, - 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, 9487, - 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, - 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, - 9498, 9497, 9494, 9493, 9486, 9485, 9502, 9503, 9505, 9506, - 9510, 9511, 9513, 9514, 9517, 9518, 9521, 9522, 9525, 9526, - 9529, 9530, 9533, 9534, 9536, 9537, 9539, 9540, 9541, 9542, - 9543, 9544, 9545, 9546, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 51979, 51980, 51981, 51982, 51983, 51985, 51986, 51987, 51989, 51990, - 51991, 51993, 51994, 51995, 51996, 51997, 51998, 51999, 52002, 52003, - 52004, 52005, 52006, 52007, 52008, 52009, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52010, 52011, 52012, 52013, 52014, 52015, 52016, 52017, - 52018, 52019, 52020, 52021, 52022, 52023, 52024, 52025, 52026, 52027, - 52028, 52029, 52030, 52031, 52032, 52034, 52035, 52036, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52037, 52038, 52039, 52042, 52043, 52045, - 52046, 52047, 52049, 52050, 52051, 52052, 52053, 52054, 52055, 52058, - 52059, 52060, 52062, 52063, 52064, 52065, 52066, 52067, 52069, 52070, - 52071, 52072, 52073, 52074, 52075, 52076, 13205, 13206, 13207, 8467, - 13208, 13252, 13219, 13220, 13221, 13222, 13209, 13210, 13211, 13212, - 13213, 13214, 13215, 13216, 13217, 13218, 13258, 13197, 13198, 13199, - 13263, 13192, 13193, 13256, 13223, 13224, 13232, 13233, 13234, 13235, - 13236, 13237, 13238, 13239, 13240, 13241, 13184, 13185, 13186, 13187, - 13188, 13242, 13243, 13244, 13245, 13246, 13247, 13200, 13201, 13202, - 13203, 13204, 8486, 13248, 13249, 13194, 13195, 13196, 13270, 13253, - 13229, 13230, 13231, 13275, 13225, 13226, 13227, 13228, 13277, 13264, - 13267, 13251, 13257, 13276, 13254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52077, 52078, 52079, 52080, 52081, 52082, 52083, 52084, 52085, 52086, - 52087, 52090, 52091, 52092, 52093, 52094, 52095, 52096, 52097, 52098, - 52099, 52100, 52101, 52102, 52103, 52104, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52105, 52106, 52107, 52108, 52109, 52110, 52111, 52112, - 52113, 52114, 52115, 52116, 52117, 52118, 52119, 52120, 52121, 52122, - 52123, 52125, 52126, 52127, 52128, 52129, 52130, 52131, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52132, 52133, 52134, 52135, 52136, 52137, - 52138, 52139, 52140, 52141, 52142, 52143, 52144, 52145, 52146, 52147, - 52148, 52149, 52150, 52151, 52153, 52154, 52155, 52156, 52157, 52158, - 52159, 52160, 52161, 52162, 52163, 52164, 198, 208, 170, 294, - 0x0000, 306, 0x0000, 319, 321, 216, 338, 186, 222, 358, - 330, 0x0000, 12896, 12897, 12898, 12899, 12900, 12901, 12902, 12903, - 12904, 12905, 12906, 12907, 12908, 12909, 12910, 12911, 12912, 12913, - 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, - 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, - 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, - 9444, 9445, 9446, 9447, 9448, 9449, 9312, 9313, 9314, 9315, - 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, - 9326, 189, 8531, 8532, 188, 190, 8539, 8540, 8541, 8542, - 52165, 52166, 52167, 52168, 52169, 52170, 52171, 52172, 52173, 52174, - 52175, 52176, 52177, 52178, 52179, 52181, 52182, 52183, 52184, 52185, - 52186, 52187, 52188, 52189, 52190, 52191, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52192, 52193, 52194, 52195, 52197, 52198, 52200, 52202, - 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, - 52213, 52214, 52215, 52216, 52217, 52218, 52219, 52220, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52221, 52222, 52223, 52224, 52225, 52226, - 52227, 52228, 52229, 52230, 52231, 52232, 52233, 52234, 52235, 52238, - 52239, 52241, 52242, 52243, 52245, 52246, 52247, 52248, 52249, 52250, - 52251, 52254, 52255, 52256, 52259, 52260, 230, 273, 240, 295, - 305, 307, 312, 320, 322, 248, 339, 223, 254, 359, - 331, 329, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, - 12808, 12809, 12810, 12811, 12812, 12813, 12814, 12815, 12816, 12817, - 12818, 12819, 12820, 12821, 12822, 12823, 12824, 12825, 12826, 12827, - 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, - 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, - 9392, 9393, 9394, 9395, 9396, 9397, 9332, 9333, 9334, 9335, - 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, - 9346, 185, 178, 179, 8308, 8319, 8321, 8322, 8323, 8324, - 52261, 52262, 52266, 52267, 52269, 52271, 52273, 52274, 52275, 52276, - 52277, 52278, 52279, 52282, 52287, 52288, 52289, 52290, 52291, 52294, - 52295, 52297, 52298, 52299, 52301, 52302, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52303, 52304, 52305, 52306, 52307, 52310, 52314, 52315, - 52316, 52317, 52318, 52319, 52321, 52322, 52323, 52325, 52327, 52329, - 52330, 52331, 52332, 52333, 52334, 52335, 52337, 52338, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52339, 52340, 52342, 52343, 52344, 52345, - 52346, 52347, 52348, 52349, 52350, 52351, 52352, 52353, 52354, 52355, - 52356, 52357, 52358, 52359, 52360, 52361, 52362, 52363, 52364, 52365, - 52366, 52367, 52368, 52369, 52370, 52371, 12353, 12354, 12355, 12356, - 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, - 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, - 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, - 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, - 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, - 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, - 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, - 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52372, 52373, 52374, 52375, 52378, 52379, 52381, 52382, 52383, 52385, - 52386, 52387, 52388, 52389, 52390, 52391, 52394, 52398, 52399, 52400, - 52401, 52402, 52403, 52406, 52407, 52409, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52410, 52411, 52413, 52414, 52415, 52416, 52417, 52418, - 52419, 52422, 52424, 52426, 52427, 52428, 52429, 52430, 52431, 52433, - 52434, 52435, 52437, 52438, 52439, 52440, 52441, 52442, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52443, 52444, 52445, 52446, 52447, 52448, - 52449, 52450, 52451, 52453, 52454, 52455, 52456, 52457, 52458, 52459, - 52461, 52462, 52463, 52465, 52466, 52467, 52468, 52469, 52470, 52471, - 52472, 52473, 52474, 52475, 52476, 52477, 12449, 12450, 12451, 12452, - 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, - 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, - 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, - 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, - 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, - 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, - 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, - 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, - 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52478, 52479, 52480, 52482, 52483, 52484, 52485, 52486, 52487, 52490, - 52491, 52493, 52494, 52495, 52497, 52498, 52499, 52500, 52501, 52502, - 52503, 52506, 52508, 52510, 52511, 52512, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52513, 52514, 52515, 52517, 52518, 52519, 52521, 52522, - 52523, 52525, 52526, 52527, 52528, 52529, 52530, 52531, 52532, 52533, - 52534, 52535, 52536, 52538, 52539, 52540, 52541, 52542, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52543, 52544, 52545, 52546, 52547, 52548, - 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52558, - 52559, 52560, 52561, 52562, 52563, 52564, 52565, 52566, 52567, 52568, - 52569, 52570, 52571, 52573, 52574, 52575, 1040, 1041, 1042, 1043, - 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, - 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, - 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, - 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, - 1097, 1098, 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52577, 52578, 52579, 52581, 52582, 52583, 52584, 52585, 52586, 52587, - 52590, 52592, 52594, 52595, 52596, 52597, 52598, 52599, 52601, 52602, - 52603, 52604, 52605, 52606, 52607, 52608, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52609, 52610, 52611, 52612, 52613, 52614, 52615, 52617, - 52618, 52619, 52620, 52621, 52622, 52623, 52624, 52625, 52626, 52627, - 52630, 52631, 52633, 52634, 52635, 52637, 52638, 52639, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52640, 52641, 52642, 52643, 52646, 52648, - 52650, 52651, 52652, 52653, 52654, 52655, 52657, 52658, 52659, 52660, - 52661, 52662, 52663, 52664, 52665, 52666, 52667, 52668, 52669, 52670, - 52671, 52672, 52673, 52674, 52675, 52677, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52678, 52679, 52680, 52681, 52682, 52683, 52685, 52686, 52687, 52689, - 52690, 52691, 52692, 52693, 52694, 52695, 52696, 52697, 52698, 52699, - 52700, 52701, 52702, 52703, 52704, 52705, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52706, 52707, 52708, 52709, 52710, 52711, 52713, 52714, - 52715, 52717, 52718, 52719, 52721, 52722, 52723, 52724, 52725, 52726, - 52727, 52730, 52732, 52734, 52735, 52736, 52737, 52738, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52739, 52741, 52742, 52743, 52745, 52746, - 52747, 52749, 52750, 52751, 52752, 52753, 52754, 52755, 52757, 52758, - 52759, 52760, 52762, 52763, 52764, 52765, 52766, 52767, 52770, 52771, - 52773, 52774, 52775, 52777, 52778, 52779, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52780, 52781, 52782, 52783, 52786, 52788, 52790, 52791, 52792, 52793, - 52794, 52795, 52796, 52797, 52798, 52799, 52800, 52801, 52802, 52803, - 52804, 52805, 52806, 52807, 52808, 52809, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52810, 52811, 52812, 52813, 52814, 52815, 52816, 52817, - 52818, 52819, 52820, 52821, 52822, 52823, 52826, 52827, 52829, 52830, - 52834, 52835, 52836, 52837, 52838, 52839, 52842, 52844, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52846, 52847, 52848, 52849, 52850, 52851, - 52854, 52855, 52857, 52858, 52859, 52861, 52862, 52863, 52864, 52865, - 52866, 52867, 52870, 52872, 52874, 52875, 52876, 52877, 52878, 52879, - 52882, 52883, 52885, 52886, 52887, 52889, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 52890, 52891, 52892, 52893, 52894, 52895, 52898, 52902, 52903, 52904, - 52905, 52906, 52907, 52910, 52911, 52912, 52913, 52914, 52915, 52916, - 52917, 52918, 52919, 52920, 52921, 52922, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 52923, 52924, 52925, 52926, 52927, 52928, 52930, 52931, - 52932, 52933, 52934, 52935, 52936, 52937, 52938, 52939, 52940, 52941, - 52942, 52943, 52944, 52945, 52946, 52947, 52948, 52949, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 52950, 52951, 52952, 52953, 52954, 52955, - 52956, 52957, 52958, 52959, 52960, 52961, 52962, 52963, 52966, 52967, - 52969, 52970, 52973, 52974, 52975, 52976, 52977, 52978, 52979, 52982, - 52986, 52987, 52988, 52989, 52990, 52991, 44032, 44033, 44036, 44039, - 44040, 44041, 44042, 44048, 44049, 44050, 44051, 44052, 44053, 44054, - 44055, 44057, 44058, 44059, 44060, 44061, 44064, 44068, 44076, 44077, - 44079, 44080, 44081, 44088, 44089, 44092, 44096, 44107, 44109, 44116, - 44120, 44124, 44144, 44145, 44148, 44151, 44152, 44154, 44160, 44161, - 44163, 44164, 44165, 44166, 44169, 44170, 44171, 44172, 44176, 44180, - 44188, 44189, 44191, 44192, 44193, 44200, 44201, 44202, 44204, 44207, - 44208, 44216, 44217, 44219, 44220, 44221, 44225, 44228, 44232, 44236, - 44245, 44247, 44256, 44257, 44260, 44263, 44264, 44266, 44268, 44271, - 44272, 44273, 44275, 44277, 44278, 44284, 44285, 44288, 44292, 44294, - 52994, 52995, 52997, 52998, 52999, 53001, 53002, 53003, 53004, 53005, - 53006, 53007, 53010, 53012, 53014, 53015, 53016, 53017, 53018, 53019, - 53021, 53022, 53023, 53025, 53026, 53027, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53029, 53030, 53031, 53032, 53033, 53034, 53035, 53038, - 53042, 53043, 53044, 53045, 53046, 53047, 53049, 53050, 53051, 53052, - 53053, 53054, 53055, 53056, 53057, 53058, 53059, 53060, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53061, 53062, 53063, 53064, 53065, 53066, - 53067, 53068, 53069, 53070, 53071, 53072, 53073, 53074, 53075, 53078, - 53079, 53081, 53082, 53083, 53085, 53086, 53087, 53088, 53089, 53090, - 53091, 53094, 53096, 53098, 53099, 53100, 44300, 44301, 44303, 44305, - 44312, 44316, 44320, 44329, 44332, 44333, 44340, 44341, 44344, 44348, - 44356, 44357, 44359, 44361, 44368, 44372, 44376, 44385, 44387, 44396, - 44397, 44400, 44403, 44404, 44405, 44406, 44411, 44412, 44413, 44415, - 44417, 44418, 44424, 44425, 44428, 44432, 44444, 44445, 44452, 44471, - 44480, 44481, 44484, 44488, 44496, 44497, 44499, 44508, 44512, 44516, - 44536, 44537, 44540, 44543, 44544, 44545, 44552, 44553, 44555, 44557, - 44564, 44592, 44593, 44596, 44599, 44600, 44602, 44608, 44609, 44611, - 44613, 44614, 44618, 44620, 44621, 44622, 44624, 44628, 44630, 44636, - 44637, 44639, 44640, 44641, 44645, 44648, 44649, 44652, 44656, 44664, - 53101, 53102, 53103, 53106, 53107, 53109, 53110, 53111, 53113, 53114, - 53115, 53116, 53117, 53118, 53119, 53121, 53122, 53123, 53124, 53126, - 53127, 53128, 53129, 53130, 53131, 53133, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53134, 53135, 53136, 53137, 53138, 53139, 53140, 53141, - 53142, 53143, 53144, 53145, 53146, 53147, 53148, 53149, 53150, 53151, - 53152, 53154, 53155, 53156, 53157, 53158, 53159, 53161, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53162, 53163, 53164, 53165, 53166, 53167, - 53169, 53170, 53171, 53172, 53173, 53174, 53175, 53176, 53177, 53178, - 53179, 53180, 53181, 53182, 53183, 53184, 53185, 53186, 53187, 53189, - 53190, 53191, 53192, 53193, 53194, 53195, 44665, 44667, 44668, 44669, - 44676, 44677, 44684, 44732, 44733, 44734, 44736, 44740, 44748, 44749, - 44751, 44752, 44753, 44760, 44761, 44764, 44776, 44779, 44781, 44788, - 44792, 44796, 44807, 44808, 44813, 44816, 44844, 44845, 44848, 44850, - 44852, 44860, 44861, 44863, 44865, 44866, 44867, 44872, 44873, 44880, - 44892, 44893, 44900, 44901, 44921, 44928, 44932, 44936, 44944, 44945, - 44949, 44956, 44984, 44985, 44988, 44992, 44999, 45000, 45001, 45003, - 45005, 45006, 45012, 45020, 45032, 45033, 45040, 45041, 45044, 45048, - 45056, 45057, 45060, 45068, 45072, 45076, 45084, 45085, 45096, 45124, - 45125, 45128, 45130, 45132, 45134, 45139, 45140, 45141, 45143, 45145, - 53196, 53197, 53198, 53199, 53200, 53201, 53202, 53203, 53204, 53205, - 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53215, - 53218, 53219, 53221, 53222, 53223, 53225, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53226, 53227, 53228, 53229, 53230, 53231, 53234, 53236, - 53238, 53239, 53240, 53241, 53242, 53243, 53245, 53246, 53247, 53249, - 53250, 53251, 53253, 53254, 53255, 53256, 53257, 53258, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53259, 53260, 53261, 53262, 53263, 53264, - 53266, 53267, 53268, 53269, 53270, 53271, 53273, 53274, 53275, 53276, - 53277, 53278, 53279, 53280, 53281, 53282, 53283, 53284, 53285, 53286, - 53287, 53288, 53289, 53290, 53291, 53292, 45149, 45180, 45181, 45184, - 45188, 45196, 45197, 45199, 45201, 45208, 45209, 45210, 45212, 45215, - 45216, 45217, 45218, 45224, 45225, 45227, 45228, 45229, 45230, 45231, - 45233, 45235, 45236, 45237, 45240, 45244, 45252, 45253, 45255, 45256, - 45257, 45264, 45265, 45268, 45272, 45280, 45285, 45320, 45321, 45323, - 45324, 45328, 45330, 45331, 45336, 45337, 45339, 45340, 45341, 45347, - 45348, 45349, 45352, 45356, 45364, 45365, 45367, 45368, 45369, 45376, - 45377, 45380, 45384, 45392, 45393, 45396, 45397, 45400, 45404, 45408, - 45432, 45433, 45436, 45440, 45442, 45448, 45449, 45451, 45453, 45458, - 45459, 45460, 45464, 45468, 45480, 45516, 45520, 45524, 45532, 45533, - 53294, 53295, 53296, 53297, 53298, 53299, 53302, 53303, 53305, 53306, - 53307, 53309, 53310, 53311, 53312, 53313, 53314, 53315, 53318, 53320, - 53322, 53323, 53324, 53325, 53326, 53327, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53329, 53330, 53331, 53333, 53334, 53335, 53337, 53338, - 53339, 53340, 53341, 53342, 53343, 53345, 53346, 53347, 53348, 53349, - 53350, 53351, 53352, 53353, 53354, 53355, 53358, 53359, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53361, 53362, 53363, 53365, 53366, 53367, - 53368, 53369, 53370, 53371, 53374, 53375, 53376, 53378, 53379, 53380, - 53381, 53382, 53383, 53384, 53385, 53386, 53387, 53388, 53389, 53390, - 53391, 53392, 53393, 53394, 53395, 53396, 45535, 45544, 45545, 45548, - 45552, 45561, 45563, 45565, 45572, 45573, 45576, 45579, 45580, 45588, - 45589, 45591, 45593, 45600, 45620, 45628, 45656, 45660, 45664, 45672, - 45673, 45684, 45685, 45692, 45700, 45701, 45705, 45712, 45713, 45716, - 45720, 45721, 45722, 45728, 45729, 45731, 45733, 45734, 45738, 45740, - 45744, 45748, 45768, 45769, 45772, 45776, 45778, 45784, 45785, 45787, - 45789, 45794, 45796, 45797, 45798, 45800, 45803, 45804, 45805, 45806, - 45807, 45811, 45812, 45813, 45815, 45816, 45817, 45818, 45819, 45823, - 45824, 45825, 45828, 45832, 45840, 45841, 45843, 45844, 45845, 45852, - 45908, 45909, 45910, 45912, 45915, 45916, 45918, 45919, 45924, 45925, - 53397, 53398, 53399, 53400, 53401, 53402, 53403, 53404, 53405, 53406, - 53407, 53408, 53409, 53410, 53411, 53414, 53415, 53417, 53418, 53419, - 53421, 53422, 53423, 53424, 53425, 53426, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53427, 53430, 53432, 53434, 53435, 53436, 53437, 53438, - 53439, 53442, 53443, 53445, 53446, 53447, 53450, 53451, 53452, 53453, - 53454, 53455, 53458, 53462, 53463, 53464, 53465, 53466, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53467, 53470, 53471, 53473, 53474, 53475, - 53477, 53478, 53479, 53480, 53481, 53482, 53483, 53486, 53490, 53491, - 53492, 53493, 53494, 53495, 53497, 53498, 53499, 53500, 53501, 53502, - 53503, 53504, 53505, 53506, 53507, 53508, 45927, 45929, 45931, 45934, - 45936, 45937, 45940, 45944, 45952, 45953, 45955, 45956, 45957, 45964, - 45968, 45972, 45984, 45985, 45992, 45996, 46020, 46021, 46024, 46027, - 46028, 46030, 46032, 46036, 46037, 46039, 46041, 46043, 46045, 46048, - 46052, 46056, 46076, 46096, 46104, 46108, 46112, 46120, 46121, 46123, - 46132, 46160, 46161, 46164, 46168, 46176, 46177, 46179, 46181, 46188, - 46208, 46216, 46237, 46244, 46248, 46252, 46261, 46263, 46265, 46272, - 46276, 46280, 46288, 46293, 46300, 46301, 46304, 46307, 46308, 46310, - 46316, 46317, 46319, 46321, 46328, 46356, 46357, 46360, 46363, 46364, - 46372, 46373, 46375, 46376, 46377, 46378, 46384, 46385, 46388, 46392, - 53509, 53510, 53511, 53512, 53513, 53514, 53515, 53516, 53518, 53519, - 53520, 53521, 53522, 53523, 53524, 53525, 53526, 53527, 53528, 53529, - 53530, 53531, 53532, 53533, 53534, 53535, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53536, 53537, 53538, 53539, 53540, 53541, 53542, 53543, - 53544, 53545, 53546, 53547, 53548, 53549, 53550, 53551, 53554, 53555, - 53557, 53558, 53559, 53561, 53563, 53564, 53565, 53566, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53567, 53570, 53574, 53575, 53576, 53577, - 53578, 53579, 53582, 53583, 53585, 53586, 53587, 53589, 53590, 53591, - 53592, 53593, 53594, 53595, 53598, 53600, 53602, 53603, 53604, 53605, - 53606, 53607, 53609, 53610, 53611, 53613, 46400, 46401, 46403, 46404, - 46405, 46411, 46412, 46413, 46416, 46420, 46428, 46429, 46431, 46432, - 46433, 46496, 46497, 46500, 46504, 46506, 46507, 46512, 46513, 46515, - 46516, 46517, 46523, 46524, 46525, 46528, 46532, 46540, 46541, 46543, - 46544, 46545, 46552, 46572, 46608, 46609, 46612, 46616, 46629, 46636, - 46644, 46664, 46692, 46696, 46748, 46749, 46752, 46756, 46763, 46764, - 46769, 46804, 46832, 46836, 46840, 46848, 46849, 46853, 46888, 46889, - 46892, 46895, 46896, 46904, 46905, 46907, 46916, 46920, 46924, 46932, - 46933, 46944, 46948, 46952, 46960, 46961, 46963, 46965, 46972, 46973, - 46976, 46980, 46988, 46989, 46991, 46992, 46993, 46994, 46998, 46999, - 53614, 53615, 53616, 53617, 53618, 53619, 53620, 53621, 53622, 53623, - 53624, 53625, 53626, 53627, 53629, 53630, 53631, 53632, 53633, 53634, - 53635, 53637, 53638, 53639, 53641, 53642, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53643, 53644, 53645, 53646, 53647, 53648, 53649, 53650, - 53651, 53652, 53653, 53654, 53655, 53656, 53657, 53658, 53659, 53660, - 53661, 53662, 53663, 53666, 53667, 53669, 53670, 53671, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53673, 53674, 53675, 53676, 53677, 53678, - 53679, 53682, 53684, 53686, 53687, 53688, 53689, 53691, 53693, 53694, - 53695, 53697, 53698, 53699, 53700, 53701, 53702, 53703, 53704, 53705, - 53706, 53707, 53708, 53709, 53710, 53711, 47000, 47001, 47004, 47008, - 47016, 47017, 47019, 47020, 47021, 47028, 47029, 47032, 47047, 47049, - 47084, 47085, 47088, 47092, 47100, 47101, 47103, 47104, 47105, 47111, - 47112, 47113, 47116, 47120, 47128, 47129, 47131, 47133, 47140, 47141, - 47144, 47148, 47156, 47157, 47159, 47160, 47161, 47168, 47172, 47185, - 47187, 47196, 47197, 47200, 47204, 47212, 47213, 47215, 47217, 47224, - 47228, 47245, 47272, 47280, 47284, 47288, 47296, 47297, 47299, 47301, - 47308, 47312, 47316, 47325, 47327, 47329, 47336, 47337, 47340, 47344, - 47352, 47353, 47355, 47357, 47364, 47384, 47392, 47420, 47421, 47424, - 47428, 47436, 47439, 47441, 47448, 47449, 47452, 47456, 47464, 47465, - 53712, 53713, 53714, 53715, 53716, 53717, 53718, 53719, 53721, 53722, - 53723, 53724, 53725, 53726, 53727, 53728, 53729, 53730, 53731, 53732, - 53733, 53734, 53735, 53736, 53737, 53738, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53739, 53740, 53741, 53742, 53743, 53744, 53745, 53746, - 53747, 53749, 53750, 53751, 53753, 53754, 53755, 53756, 53757, 53758, - 53759, 53760, 53761, 53762, 53763, 53764, 53765, 53766, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53768, 53770, 53771, 53772, 53773, 53774, - 53775, 53777, 53778, 53779, 53780, 53781, 53782, 53783, 53784, 53785, - 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53795, - 53796, 53797, 53798, 53799, 53800, 53801, 47467, 47469, 47476, 47477, - 47480, 47484, 47492, 47493, 47495, 47497, 47498, 47501, 47502, 47532, - 47533, 47536, 47540, 47548, 47549, 47551, 47553, 47560, 47561, 47564, - 47566, 47567, 47568, 47569, 47570, 47576, 47577, 47579, 47581, 47582, - 47585, 47587, 47588, 47589, 47592, 47596, 47604, 47605, 47607, 47608, - 47609, 47610, 47616, 47617, 47624, 47637, 47672, 47673, 47676, 47680, - 47682, 47688, 47689, 47691, 47693, 47694, 47699, 47700, 47701, 47704, - 47708, 47716, 47717, 47719, 47720, 47721, 47728, 47729, 47732, 47736, - 47747, 47748, 47749, 47751, 47756, 47784, 47785, 47787, 47788, 47792, - 47794, 47800, 47801, 47803, 47805, 47812, 47816, 47832, 47833, 47868, - 53802, 53803, 53806, 53807, 53809, 53810, 53811, 53813, 53814, 53815, - 53816, 53817, 53818, 53819, 53822, 53824, 53826, 53827, 53828, 53829, - 53830, 53831, 53833, 53834, 53835, 53836, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53837, 53838, 53839, 53840, 53841, 53842, 53843, 53844, - 53845, 53846, 53847, 53848, 53849, 53850, 53851, 53853, 53854, 53855, - 53856, 53857, 53858, 53859, 53861, 53862, 53863, 53864, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53865, 53866, 53867, 53868, 53869, 53870, - 53871, 53872, 53873, 53874, 53875, 53876, 53877, 53878, 53879, 53880, - 53881, 53882, 53883, 53884, 53885, 53886, 53887, 53890, 53891, 53893, - 53894, 53895, 53897, 53898, 53899, 53900, 47872, 47876, 47885, 47887, - 47889, 47896, 47900, 47904, 47913, 47915, 47924, 47925, 47926, 47928, - 47931, 47932, 47933, 47934, 47940, 47941, 47943, 47945, 47949, 47951, - 47952, 47956, 47960, 47969, 47971, 47980, 48008, 48012, 48016, 48036, - 48040, 48044, 48052, 48055, 48064, 48068, 48072, 48080, 48083, 48120, - 48121, 48124, 48127, 48128, 48130, 48136, 48137, 48139, 48140, 48141, - 48143, 48145, 48148, 48149, 48150, 48151, 48152, 48155, 48156, 48157, - 48158, 48159, 48164, 48165, 48167, 48169, 48173, 48176, 48177, 48180, - 48184, 48192, 48193, 48195, 48196, 48197, 48201, 48204, 48205, 48208, - 48221, 48260, 48261, 48264, 48267, 48268, 48270, 48276, 48277, 48279, - 53901, 53902, 53903, 53906, 53907, 53908, 53910, 53911, 53912, 53913, - 53914, 53915, 53917, 53918, 53919, 53921, 53922, 53923, 53925, 53926, - 53927, 53928, 53929, 53930, 53931, 53933, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 53934, 53935, 53936, 53938, 53939, 53940, 53941, 53942, - 53943, 53946, 53947, 53949, 53950, 53953, 53955, 53956, 53957, 53958, - 53959, 53962, 53964, 53965, 53966, 53967, 53968, 53969, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 53970, 53971, 53973, 53974, 53975, 53977, - 53978, 53979, 53981, 53982, 53983, 53984, 53985, 53986, 53987, 53990, - 53991, 53992, 53993, 53994, 53995, 53996, 53997, 53998, 53999, 54002, - 54003, 54005, 54006, 54007, 54009, 54010, 48281, 48282, 48288, 48289, - 48292, 48295, 48296, 48304, 48305, 48307, 48308, 48309, 48316, 48317, - 48320, 48324, 48333, 48335, 48336, 48337, 48341, 48344, 48348, 48372, - 48373, 48374, 48376, 48380, 48388, 48389, 48391, 48393, 48400, 48404, - 48420, 48428, 48448, 48456, 48457, 48460, 48464, 48472, 48473, 48484, - 48488, 48512, 48513, 48516, 48519, 48520, 48521, 48522, 48528, 48529, - 48531, 48533, 48537, 48538, 48540, 48548, 48560, 48568, 48596, 48597, - 48600, 48604, 48617, 48624, 48628, 48632, 48640, 48643, 48645, 48652, - 48653, 48656, 48660, 48668, 48669, 48671, 48708, 48709, 48712, 48716, - 48718, 48724, 48725, 48727, 48729, 48730, 48731, 48736, 48737, 48740, - 54011, 54012, 54013, 54014, 54015, 54018, 54020, 54022, 54023, 54024, - 54025, 54026, 54027, 54031, 54033, 54034, 54035, 54037, 54039, 54040, - 54041, 54042, 54043, 54046, 54050, 54051, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54052, 54054, 54055, 54058, 54059, 54061, 54062, 54063, - 54065, 54066, 54067, 54068, 54069, 54070, 54071, 54074, 54078, 54079, - 54080, 54081, 54082, 54083, 54086, 54087, 54088, 54089, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54090, 54091, 54092, 54093, 54094, 54095, - 54096, 54097, 54098, 54099, 54100, 54101, 54102, 54103, 54104, 54105, - 54106, 54107, 54108, 54109, 54110, 54111, 54112, 54113, 54114, 54115, - 54116, 54117, 54118, 54119, 54120, 54121, 48744, 48746, 48752, 48753, - 48755, 48756, 48757, 48763, 48764, 48765, 48768, 48772, 48780, 48781, - 48783, 48784, 48785, 48792, 48793, 48808, 48848, 48849, 48852, 48855, - 48856, 48864, 48867, 48868, 48869, 48876, 48897, 48904, 48905, 48920, - 48921, 48923, 48924, 48925, 48960, 48961, 48964, 48968, 48976, 48977, - 48981, 49044, 49072, 49093, 49100, 49101, 49104, 49108, 49116, 49119, - 49121, 49212, 49233, 49240, 49244, 49248, 49256, 49257, 49296, 49297, - 49300, 49304, 49312, 49313, 49315, 49317, 49324, 49325, 49327, 49328, - 49331, 49332, 49333, 49334, 49340, 49341, 49343, 49344, 49345, 49349, - 49352, 49353, 49356, 49360, 49368, 49369, 49371, 49372, 49373, 49380, - 54122, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, - 54132, 54133, 54134, 54135, 54136, 54137, 54138, 54139, 54142, 54143, - 54145, 54146, 54147, 54149, 54150, 54151, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54152, 54153, 54154, 54155, 54158, 54162, 54163, 54164, - 54165, 54166, 54167, 54170, 54171, 54173, 54174, 54175, 54177, 54178, - 54179, 54180, 54181, 54182, 54183, 54186, 54188, 54190, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54191, 54192, 54193, 54194, 54195, 54197, - 54198, 54199, 54201, 54202, 54203, 54205, 54206, 54207, 54208, 54209, - 54210, 54211, 54214, 54215, 54218, 54219, 54220, 54221, 54222, 54223, - 54225, 54226, 54227, 54228, 54229, 54230, 49381, 49384, 49388, 49396, - 49397, 49399, 49401, 49408, 49412, 49416, 49424, 49429, 49436, 49437, - 49438, 49439, 49440, 49443, 49444, 49446, 49447, 49452, 49453, 49455, - 49456, 49457, 49462, 49464, 49465, 49468, 49472, 49480, 49481, 49483, - 49484, 49485, 49492, 49493, 49496, 49500, 49508, 49509, 49511, 49512, - 49513, 49520, 49524, 49528, 49541, 49548, 49549, 49550, 49552, 49556, - 49558, 49564, 49565, 49567, 49569, 49573, 49576, 49577, 49580, 49584, - 49597, 49604, 49608, 49612, 49620, 49623, 49624, 49632, 49636, 49640, - 49648, 49649, 49651, 49660, 49661, 49664, 49668, 49676, 49677, 49679, - 49681, 49688, 49689, 49692, 49695, 49696, 49704, 49705, 49707, 49709, - 54231, 54233, 54234, 54235, 54236, 54237, 54238, 54239, 54240, 54242, - 54244, 54245, 54246, 54247, 54248, 54249, 54250, 54251, 54254, 54255, - 54257, 54258, 54259, 54261, 54262, 54263, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54264, 54265, 54266, 54267, 54270, 54272, 54274, 54275, - 54276, 54277, 54278, 54279, 54281, 54282, 54283, 54284, 54285, 54286, - 54287, 54288, 54289, 54290, 54291, 54292, 54293, 54294, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54295, 54296, 54297, 54298, 54299, 54300, - 54302, 54303, 54304, 54305, 54306, 54307, 54308, 54309, 54310, 54311, - 54312, 54313, 54314, 54315, 54316, 54317, 54318, 54319, 54320, 54321, - 54322, 54323, 54324, 54325, 54326, 54327, 49711, 49713, 49714, 49716, - 49736, 49744, 49745, 49748, 49752, 49760, 49765, 49772, 49773, 49776, - 49780, 49788, 49789, 49791, 49793, 49800, 49801, 49808, 49816, 49819, - 49821, 49828, 49829, 49832, 49836, 49837, 49844, 49845, 49847, 49849, - 49884, 49885, 49888, 49891, 49892, 49899, 49900, 49901, 49903, 49905, - 49910, 49912, 49913, 49915, 49916, 49920, 49928, 49929, 49932, 49933, - 49939, 49940, 49941, 49944, 49948, 49956, 49957, 49960, 49961, 49989, - 50024, 50025, 50028, 50032, 50034, 50040, 50041, 50044, 50045, 50052, - 50056, 50060, 50112, 50136, 50137, 50140, 50143, 50144, 50146, 50152, - 50153, 50157, 50164, 50165, 50168, 50184, 50192, 50212, 50220, 50224, - 54328, 54329, 54330, 54331, 54332, 54333, 54334, 54335, 54337, 54338, - 54339, 54341, 54342, 54343, 54344, 54345, 54346, 54347, 54348, 54349, - 54350, 54351, 54352, 54353, 54354, 54355, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54356, 54357, 54358, 54359, 54360, 54361, 54362, 54363, - 54365, 54366, 54367, 54369, 54370, 54371, 54373, 54374, 54375, 54376, - 54377, 54378, 54379, 54380, 54382, 54384, 54385, 54386, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54387, 54388, 54389, 54390, 54391, 54394, - 54395, 54397, 54398, 54401, 54403, 54404, 54405, 54406, 54407, 54410, - 54412, 54414, 54415, 54416, 54417, 54418, 54419, 54421, 54422, 54423, - 54424, 54425, 54426, 54427, 54428, 54429, 50228, 50236, 50237, 50248, - 50276, 50277, 50280, 50284, 50292, 50293, 50297, 50304, 50324, 50332, - 50360, 50364, 50409, 50416, 50417, 50420, 50424, 50426, 50431, 50432, - 50433, 50444, 50448, 50452, 50460, 50472, 50473, 50476, 50480, 50488, - 50489, 50491, 50493, 50500, 50501, 50504, 50505, 50506, 50508, 50509, - 50510, 50515, 50516, 50517, 50519, 50520, 50521, 50525, 50526, 50528, - 50529, 50532, 50536, 50544, 50545, 50547, 50548, 50549, 50556, 50557, - 50560, 50564, 50567, 50572, 50573, 50575, 50577, 50581, 50583, 50584, - 50588, 50592, 50601, 50612, 50613, 50616, 50617, 50619, 50620, 50621, - 50622, 50628, 50629, 50630, 50631, 50632, 50633, 50634, 50636, 50638, - 54430, 54431, 54432, 54433, 54434, 54435, 54436, 54437, 54438, 54439, - 54440, 54442, 54443, 54444, 54445, 54446, 54447, 54448, 54449, 54450, - 54451, 54452, 54453, 54454, 54455, 54456, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54457, 54458, 54459, 54460, 54461, 54462, 54463, 54464, - 54465, 54466, 54467, 54468, 54469, 54470, 54471, 54472, 54473, 54474, - 54475, 54477, 54478, 54479, 54481, 54482, 54483, 54485, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54486, 54487, 54488, 54489, 54490, 54491, - 54493, 54494, 54496, 54497, 54498, 54499, 54500, 54501, 54502, 54503, - 54505, 54506, 54507, 54509, 54510, 54511, 54513, 54514, 54515, 54516, - 54517, 54518, 54519, 54521, 54522, 54524, 50640, 50641, 50644, 50648, - 50656, 50657, 50659, 50661, 50668, 50669, 50670, 50672, 50676, 50678, - 50679, 50684, 50685, 50686, 50687, 50688, 50689, 50693, 50694, 50695, - 50696, 50700, 50704, 50712, 50713, 50715, 50716, 50724, 50725, 50728, - 50732, 50733, 50734, 50736, 50739, 50740, 50741, 50743, 50745, 50747, - 50752, 50753, 50756, 50760, 50768, 50769, 50771, 50772, 50773, 50780, - 50781, 50784, 50796, 50799, 50801, 50808, 50809, 50812, 50816, 50824, - 50825, 50827, 50829, 50836, 50837, 50840, 50844, 50852, 50853, 50855, - 50857, 50864, 50865, 50868, 50872, 50873, 50874, 50880, 50881, 50883, - 50885, 50892, 50893, 50896, 50900, 50908, 50909, 50912, 50913, 50920, - 54526, 54527, 54528, 54529, 54530, 54531, 54533, 54534, 54535, 54537, - 54538, 54539, 54541, 54542, 54543, 54544, 54545, 54546, 54547, 54550, - 54552, 54553, 54554, 54555, 54556, 54557, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, - 54566, 54567, 54568, 54569, 54570, 54571, 54572, 54573, 54574, 54575, - 54576, 54577, 54578, 54579, 54580, 54581, 54582, 54583, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54584, 54585, 54586, 54587, 54590, 54591, - 54593, 54594, 54595, 54597, 54598, 54599, 54600, 54601, 54602, 54603, - 54606, 54608, 54610, 54611, 54612, 54613, 54614, 54615, 54618, 54619, - 54621, 54622, 54623, 54625, 54626, 54627, 50921, 50924, 50928, 50936, - 50937, 50941, 50948, 50949, 50952, 50956, 50964, 50965, 50967, 50969, - 50976, 50977, 50980, 50984, 50992, 50993, 50995, 50997, 50999, 51004, - 51005, 51008, 51012, 51018, 51020, 51021, 51023, 51025, 51026, 51027, - 51028, 51029, 51030, 51031, 51032, 51036, 51040, 51048, 51051, 51060, - 51061, 51064, 51068, 51069, 51070, 51075, 51076, 51077, 51079, 51080, - 51081, 51082, 51086, 51088, 51089, 51092, 51094, 51095, 51096, 51098, - 51104, 51105, 51107, 51108, 51109, 51110, 51116, 51117, 51120, 51124, - 51132, 51133, 51135, 51136, 51137, 51144, 51145, 51148, 51150, 51152, - 51160, 51165, 51172, 51176, 51180, 51200, 51201, 51204, 51208, 51210, - 54628, 54630, 54631, 54634, 54636, 54638, 54639, 54640, 54641, 54642, - 54643, 54646, 54647, 54649, 54650, 54651, 54653, 54654, 54655, 54656, - 54657, 54658, 54659, 54662, 54666, 54667, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54668, 54669, 54670, 54671, 54673, 54674, 54675, 54676, - 54677, 54678, 54679, 54680, 54681, 54682, 54683, 54684, 54685, 54686, - 54687, 54688, 54689, 54690, 54691, 54692, 54694, 54695, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54696, 54697, 54698, 54699, 54700, 54701, - 54702, 54703, 54704, 54705, 54706, 54707, 54708, 54709, 54710, 54711, - 54712, 54713, 54714, 54715, 54716, 54717, 54718, 54719, 54720, 54721, - 54722, 54723, 54724, 54725, 54726, 54727, 51216, 51217, 51219, 51221, - 51222, 51228, 51229, 51232, 51236, 51244, 51245, 51247, 51249, 51256, - 51260, 51264, 51272, 51273, 51276, 51277, 51284, 51312, 51313, 51316, - 51320, 51322, 51328, 51329, 51331, 51333, 51334, 51335, 51339, 51340, - 51341, 51348, 51357, 51359, 51361, 51368, 51388, 51389, 51396, 51400, - 51404, 51412, 51413, 51415, 51417, 51424, 51425, 51428, 51445, 51452, - 51453, 51456, 51460, 51461, 51462, 51468, 51469, 51471, 51473, 51480, - 51500, 51508, 51536, 51537, 51540, 51544, 51552, 51553, 51555, 51564, - 51568, 51572, 51580, 51592, 51593, 51596, 51600, 51608, 51609, 51611, - 51613, 51648, 51649, 51652, 51655, 51656, 51658, 51664, 51665, 51667, - 54730, 54731, 54733, 54734, 54735, 54737, 54739, 54740, 54741, 54742, - 54743, 54746, 54748, 54750, 54751, 54752, 54753, 54754, 54755, 54758, - 54759, 54761, 54762, 54763, 54765, 54766, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54767, 54768, 54769, 54770, 54771, 54774, 54776, 54778, - 54779, 54780, 54781, 54782, 54783, 54786, 54787, 54789, 54790, 54791, - 54793, 54794, 54795, 54796, 54797, 54798, 54799, 54802, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54806, 54807, 54808, 54809, 54810, 54811, - 54813, 54814, 54815, 54817, 54818, 54819, 54821, 54822, 54823, 54824, - 54825, 54826, 54827, 54828, 54830, 54831, 54832, 54833, 54834, 54835, - 54836, 54837, 54838, 54839, 54842, 54843, 51669, 51670, 51673, 51674, - 51676, 51677, 51680, 51682, 51684, 51687, 51692, 51693, 51695, 51696, - 51697, 51704, 51705, 51708, 51712, 51720, 51721, 51723, 51724, 51725, - 51732, 51736, 51753, 51788, 51789, 51792, 51796, 51804, 51805, 51807, - 51808, 51809, 51816, 51837, 51844, 51864, 51900, 51901, 51904, 51908, - 51916, 51917, 51919, 51921, 51923, 51928, 51929, 51936, 51948, 51956, - 51976, 51984, 51988, 51992, 52000, 52001, 52033, 52040, 52041, 52044, - 52048, 52056, 52057, 52061, 52068, 52088, 52089, 52124, 52152, 52180, - 52196, 52199, 52201, 52236, 52237, 52240, 52244, 52252, 52253, 52257, - 52258, 52263, 52264, 52265, 52268, 52270, 52272, 52280, 52281, 52283, - 54845, 54846, 54847, 54849, 54850, 54851, 54852, 54854, 54855, 54858, - 54860, 54862, 54863, 54864, 54866, 54867, 54870, 54871, 54873, 54874, - 54875, 54877, 54878, 54879, 54880, 54881, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54882, 54883, 54884, 54885, 54886, 54888, 54890, 54891, - 54892, 54893, 54894, 54895, 54898, 54899, 54901, 54902, 54903, 54904, - 54905, 54906, 54907, 54908, 54909, 54910, 54911, 54912, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 54913, 54914, 54916, 54918, 54919, 54920, - 54921, 54922, 54923, 54926, 54927, 54929, 54930, 54931, 54933, 54934, - 54935, 54936, 54937, 54938, 54939, 54940, 54942, 54944, 54946, 54947, - 54948, 54949, 54950, 54951, 54953, 54954, 52284, 52285, 52286, 52292, - 52293, 52296, 52300, 52308, 52309, 52311, 52312, 52313, 52320, 52324, - 52326, 52328, 52336, 52341, 52376, 52377, 52380, 52384, 52392, 52393, - 52395, 52396, 52397, 52404, 52405, 52408, 52412, 52420, 52421, 52423, - 52425, 52432, 52436, 52452, 52460, 52464, 52481, 52488, 52489, 52492, - 52496, 52504, 52505, 52507, 52509, 52516, 52520, 52524, 52537, 52572, - 52576, 52580, 52588, 52589, 52591, 52593, 52600, 52616, 52628, 52629, - 52632, 52636, 52644, 52645, 52647, 52649, 52656, 52676, 52684, 52688, - 52712, 52716, 52720, 52728, 52729, 52731, 52733, 52740, 52744, 52748, - 52756, 52761, 52768, 52769, 52772, 52776, 52784, 52785, 52787, 52789, - 54955, 54957, 54958, 54959, 54961, 54962, 54963, 54964, 54965, 54966, - 54967, 54968, 54970, 54972, 54973, 54974, 54975, 54976, 54977, 54978, - 54979, 54982, 54983, 54985, 54986, 54987, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 54989, 54990, 54991, 54992, 54994, 54995, 54997, 54998, - 55000, 55002, 55003, 55004, 55005, 55006, 55007, 55009, 55010, 55011, - 55013, 55014, 55015, 55017, 55018, 55019, 55020, 55021, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 55022, 55023, 55025, 55026, 55027, 55028, - 55030, 55031, 55032, 55033, 55034, 55035, 55038, 55039, 55041, 55042, - 55043, 55045, 55046, 55047, 55048, 55049, 55050, 55051, 55052, 55053, - 55054, 55055, 55056, 55058, 55059, 55060, 52824, 52825, 52828, 52831, - 52832, 52833, 52840, 52841, 52843, 52845, 52852, 52853, 52856, 52860, - 52868, 52869, 52871, 52873, 52880, 52881, 52884, 52888, 52896, 52897, - 52899, 52900, 52901, 52908, 52909, 52929, 52964, 52965, 52968, 52971, - 52972, 52980, 52981, 52983, 52984, 52985, 52992, 52993, 52996, 53000, - 53008, 53009, 53011, 53013, 53020, 53024, 53028, 53036, 53037, 53039, - 53040, 53041, 53048, 53076, 53077, 53080, 53084, 53092, 53093, 53095, - 53097, 53104, 53105, 53108, 53112, 53120, 53125, 53132, 53153, 53160, - 53168, 53188, 53216, 53217, 53220, 53224, 53232, 53233, 53235, 53237, - 53244, 53248, 53252, 53265, 53272, 53293, 53300, 53301, 53304, 53308, - 55061, 55062, 55063, 55066, 55067, 55069, 55070, 55071, 55073, 55074, - 55075, 55076, 55077, 55078, 55079, 55082, 55084, 55086, 55087, 55088, - 55089, 55090, 55091, 55094, 55095, 55097, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 55098, 55099, 55101, 55102, 55103, 55104, 55105, 55106, - 55107, 55109, 55110, 55112, 55114, 55115, 55116, 55117, 55118, 55119, - 55122, 55123, 55125, 55130, 55131, 55132, 55133, 55134, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 55135, 55138, 55140, 55142, 55143, 55144, - 55146, 55147, 55149, 55150, 55151, 55153, 55154, 55155, 55157, 55158, - 55159, 55160, 55161, 55162, 55163, 55166, 55167, 55168, 55170, 55171, - 55172, 55173, 55174, 55175, 55178, 55179, 53316, 53317, 53319, 53321, - 53328, 53332, 53336, 53344, 53356, 53357, 53360, 53364, 53372, 53373, - 53377, 53412, 53413, 53416, 53420, 53428, 53429, 53431, 53433, 53440, - 53441, 53444, 53448, 53449, 53456, 53457, 53459, 53460, 53461, 53468, - 53469, 53472, 53476, 53484, 53485, 53487, 53488, 53489, 53496, 53517, - 53552, 53553, 53556, 53560, 53562, 53568, 53569, 53571, 53572, 53573, - 53580, 53581, 53584, 53588, 53596, 53597, 53599, 53601, 53608, 53612, - 53628, 53636, 53640, 53664, 53665, 53668, 53672, 53680, 53681, 53683, - 53685, 53690, 53692, 53696, 53720, 53748, 53752, 53767, 53769, 53776, - 53804, 53805, 53808, 53812, 53820, 53821, 53823, 53825, 53832, 53852, - 55181, 55182, 55183, 55185, 55186, 55187, 55188, 55189, 55190, 55191, - 55194, 55196, 55198, 55199, 55200, 55201, 55202, 55203, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 53860, 53888, 53889, 53892, - 53896, 53904, 53905, 53909, 53916, 53920, 53924, 53932, 53937, 53944, - 53945, 53948, 53951, 53952, 53954, 53960, 53961, 53963, 53972, 53976, - 53980, 53988, 53989, 54000, 54001, 54004, 54008, 54016, 54017, 54019, - 54021, 54028, 54029, 54030, 54032, 54036, 54038, 54044, 54045, 54047, - 54048, 54049, 54053, 54056, 54057, 54060, 54064, 54072, 54073, 54075, - 54076, 54077, 54084, 54085, 54140, 54141, 54144, 54148, 54156, 54157, - 54159, 54160, 54161, 54168, 54169, 54172, 54176, 54184, 54185, 54187, - 54189, 54196, 54200, 54204, 54212, 54213, 54216, 54217, 54224, 54232, - 54241, 54243, 54252, 54253, 54256, 54260, 54268, 54269, 54271, 54273, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54280, 54301, 54336, 54340, - 54364, 54368, 54372, 54381, 54383, 54392, 54393, 54396, 54399, 54400, - 54402, 54408, 54409, 54411, 54413, 54420, 54441, 54476, 54480, 54484, - 54492, 54495, 54504, 54508, 54512, 54520, 54523, 54525, 54532, 54536, - 54540, 54548, 54549, 54551, 54588, 54589, 54592, 54596, 54604, 54605, - 54607, 54609, 54616, 54617, 54620, 54624, 54629, 54632, 54633, 54635, - 54637, 54644, 54645, 54648, 54652, 54660, 54661, 54663, 54664, 54665, - 54672, 54693, 54728, 54729, 54732, 54736, 54738, 54744, 54745, 54747, - 54749, 54756, 54757, 54760, 54764, 54772, 54773, 54775, 54777, 54784, - 54785, 54788, 54792, 54800, 54801, 54803, 54804, 54805, 54812, 54816, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54820, 54829, 54840, 54841, - 54844, 54848, 54853, 54856, 54857, 54859, 54861, 54865, 54868, 54869, - 54872, 54876, 54887, 54889, 54896, 54897, 54900, 54915, 54917, 54924, - 54925, 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, - 54971, 54980, 54981, 54984, 54988, 54993, 54996, 54999, 55001, 55008, - 55012, 55016, 55024, 55029, 55036, 55037, 55040, 55044, 55057, 55064, - 55065, 55068, 55072, 55080, 55081, 55083, 55085, 55092, 55093, 55096, - 55100, 55108, 55111, 55113, 55120, 55121, 55124, 55126, 55127, 55128, - 55129, 55136, 55137, 55139, 55141, 55145, 55148, 55152, 55156, 55164, - 55165, 55169, 55176, 55177, 55180, 55184, 55192, 55193, 55195, 55197, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20285, 20339, 20551, 20729, - 21152, 21487, 21621, 21733, 22025, 23233, 23478, 26247, 26550, 26551, - 26607, 27468, 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, - 36040, 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, - 27580, 29647, 33050, 35258, 35282, 38307, 20355, 21002, 22718, 22904, - 23014, 24178, 24185, 25031, 25536, 26438, 26604, 26751, 28567, 30286, - 30475, 30965, 31240, 31487, 31777, 32925, 33390, 33393, 35563, 38291, - 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, 34638, 38824, - 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, 26577, 27204, - 28187, 29976, 30131, 30435, 30640, 32058, 37039, 37969, 37970, 40853, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21283, 23724, 30002, 32987, - 37440, 38296, 21083, 22536, 23004, 23713, 23831, 24247, 24378, 24394, - 24951, 27743, 30074, 30086, 31968, 32115, 32177, 32652, 33108, 33313, - 34193, 35137, 35611, 37628, 38477, 40007, 20171, 20215, 20491, 20977, - 22607, 24887, 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, - 31623, 33445, 33995, 63744, 37799, 38283, 21888, 23458, 22353, 63745, - 31923, 32697, 37301, 20520, 21435, 23621, 24040, 25298, 25454, 25818, - 25831, 28192, 28844, 31067, 36317, 36382, 63746, 36989, 37445, 37624, - 20094, 20214, 20581, 24062, 24314, 24838, 26967, 33137, 34388, 36423, - 37749, 39467, 20062, 20625, 26480, 26688, 20745, 21133, 21138, 27298, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30652, 37392, 40660, 21163, - 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, - 35233, 38548, 22533, 29309, 29356, 29956, 32121, 32365, 32937, 35211, - 35700, 36963, 40273, 25225, 27770, 28500, 32080, 32570, 35363, 20860, - 24906, 31645, 35609, 37463, 37772, 20140, 20435, 20510, 20670, 20742, - 21185, 21197, 21375, 22384, 22659, 24218, 24465, 24950, 25004, 25806, - 25964, 26223, 26299, 26356, 26775, 28039, 28805, 28913, 29855, 29861, - 29898, 30169, 30828, 30956, 31455, 31478, 32069, 32147, 32789, 32831, - 33051, 33686, 35686, 36629, 36885, 37857, 38915, 38968, 39514, 39912, - 20418, 21843, 22586, 22865, 23395, 23622, 24760, 25106, 26690, 26800, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26856, 28330, 30028, 30328, - 30926, 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, - 21476, 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, - 25911, 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, - 31295, 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, - 34996, 35493, 63747, 36764, 37678, 38599, 39015, 39640, 40723, 21741, - 26011, 26354, 26767, 31296, 35895, 40288, 22256, 22372, 23825, 26118, - 26801, 26829, 28414, 29736, 34974, 39908, 27752, 63748, 39592, 20379, - 20844, 20849, 21151, 23380, 24037, 24656, 24685, 25329, 25511, 25915, - 29657, 31354, 34467, 36002, 38799, 20018, 23521, 25096, 26524, 29916, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31185, 33747, 35463, 35506, - 36328, 36942, 37707, 38982, 24275, 27112, 34303, 37101, 63749, 20896, - 23448, 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, - 33733, 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, - 20809, 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, - 33009, 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, - 24871, 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, - 21676, 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, - 30350, 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, - 39171, 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21312, 21475, 21477, 21646, - 22036, 22389, 22434, 23495, 23943, 24272, 25084, 25304, 25937, 26552, - 26601, 27083, 27472, 27590, 27628, 27714, 28317, 28792, 29399, 29590, - 29699, 30655, 30697, 31350, 32127, 32777, 33276, 33285, 33290, 33503, - 34914, 35635, 36092, 36544, 36881, 37041, 37476, 37558, 39378, 39493, - 40169, 40407, 40860, 22283, 23616, 33738, 38816, 38827, 40628, 21531, - 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, 23470, - 24339, 31353, 31406, 33422, 36524, 20518, 21048, 21240, 21367, 22280, - 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, 36470, 38357, - 26426, 27331, 28528, 35437, 36556, 39243, 63750, 26231, 27512, 36020, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 39740, 63751, 21483, 22317, - 22862, 25542, 27131, 29674, 30789, 31418, 31429, 31998, 33909, 35215, - 36211, 36917, 38312, 21243, 22343, 30023, 31584, 33740, 37406, 63752, - 27224, 20811, 21067, 21127, 25119, 26840, 26997, 38553, 20677, 21156, - 21220, 25027, 26020, 26681, 27135, 29822, 31563, 33465, 33771, 35250, - 35641, 36817, 39241, 63753, 20170, 22935, 25810, 26129, 27278, 29748, - 31105, 31165, 33449, 34942, 34943, 35167, 63754, 37670, 20235, 21450, - 24613, 25201, 27762, 32026, 32102, 20120, 20834, 30684, 32943, 20225, - 20238, 20854, 20864, 21980, 22120, 22331, 22522, 22524, 22804, 22855, - 22931, 23492, 23696, 23822, 24049, 24190, 24524, 25216, 26071, 26083, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26398, 26399, 26462, 26827, - 26820, 27231, 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, - 29826, 29859, 30072, 30079, 30849, 30959, 31041, 31047, 31048, 31098, - 31637, 32000, 32186, 32648, 32774, 32813, 32908, 35352, 35663, 35912, - 36215, 37665, 37668, 39138, 39249, 39438, 39439, 39525, 40594, 32202, - 20342, 21513, 25326, 26708, 37329, 21931, 20794, 63755, 63756, 23068, - 25062, 63757, 25295, 25343, 63758, 63759, 63760, 63761, 63762, 63763, - 37027, 63764, 63765, 63766, 63767, 63768, 35582, 63769, 63770, 63771, - 63772, 26262, 63773, 29014, 63774, 63775, 38627, 63776, 25423, 25466, - 21335, 63777, 26511, 26976, 28275, 63778, 30007, 63779, 63780, 63781, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32013, 63782, 63783, 34930, - 22218, 23064, 63784, 63785, 63786, 63787, 63788, 20035, 63789, 20839, - 22856, 26608, 32784, 63790, 22899, 24180, 25754, 31178, 24565, 24684, - 25288, 25467, 23527, 23511, 21162, 63791, 22900, 24361, 24594, 63792, - 63793, 63794, 29785, 63795, 63796, 63797, 63798, 63799, 63800, 39377, - 63801, 63802, 63803, 63804, 63805, 63806, 63807, 63808, 63809, 63810, - 63811, 28611, 63812, 63813, 33215, 36786, 24817, 63814, 63815, 33126, - 63816, 63817, 23615, 63818, 63819, 63820, 63821, 63822, 63823, 63824, - 63825, 23273, 35365, 26491, 32016, 63826, 63827, 63828, 63829, 63830, - 63831, 33021, 63832, 63833, 23612, 27877, 21311, 28346, 22810, 33590, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20025, 20150, 20294, 21934, - 22296, 22727, 24406, 26039, 26086, 27264, 27573, 28237, 30701, 31471, - 31774, 32222, 34507, 34962, 37170, 37723, 25787, 28606, 29562, 30136, - 36948, 21846, 22349, 25018, 25812, 26311, 28129, 28251, 28525, 28601, - 30192, 32835, 33213, 34113, 35203, 35527, 35674, 37663, 27795, 30035, - 31572, 36367, 36957, 21776, 22530, 22616, 24162, 25095, 25758, 26848, - 30070, 31958, 34739, 40680, 20195, 22408, 22382, 22823, 23565, 23729, - 24118, 24453, 25140, 25825, 29619, 33274, 34955, 36024, 38538, 40667, - 23429, 24503, 24755, 20498, 20992, 21040, 22294, 22581, 22615, 23566, - 23648, 23798, 23947, 24230, 24466, 24764, 25361, 25481, 25623, 26691, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26873, 27330, 28120, 28193, - 28372, 28644, 29182, 30428, 30585, 31153, 31291, 33796, 35241, 36077, - 36339, 36424, 36867, 36884, 36947, 37117, 37709, 38518, 38876, 27602, - 28678, 29272, 29346, 29544, 30563, 31167, 31716, 32411, 35712, 22697, - 24775, 25958, 26109, 26302, 27788, 28958, 29129, 35930, 38931, 20077, - 31361, 20189, 20908, 20941, 21205, 21516, 24999, 26481, 26704, 26847, - 27934, 28540, 30140, 30643, 31461, 33012, 33891, 37509, 20828, 26007, - 26460, 26515, 30168, 31431, 33651, 63834, 35910, 36887, 38957, 23663, - 33216, 33434, 36929, 36975, 37389, 24471, 23965, 27225, 29128, 30331, - 31561, 34276, 35588, 37159, 39472, 21895, 25078, 63835, 30313, 32645, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34367, 34746, 35064, 37007, - 63836, 27931, 28889, 29662, 32097, 33853, 63837, 37226, 39409, 63838, - 20098, 21365, 27396, 27410, 28734, 29211, 34349, 40478, 21068, 36771, - 23888, 25829, 25900, 27414, 28651, 31811, 32412, 34253, 35172, 35261, - 25289, 33240, 34847, 24266, 26391, 28010, 29436, 29701, 29807, 34690, - 37086, 20358, 23821, 24480, 33802, 20919, 25504, 30053, 20142, 20486, - 20841, 20937, 26753, 27153, 31918, 31921, 31975, 33391, 35538, 36635, - 37327, 20406, 20791, 21237, 21570, 24300, 24942, 25150, 26053, 27354, - 28670, 31018, 34268, 34851, 38317, 39522, 39530, 40599, 40654, 21147, - 26310, 27511, 28701, 31019, 36706, 38722, 24976, 25088, 25891, 28451, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29001, 29833, 32244, 32879, - 34030, 36646, 36899, 37706, 20925, 21015, 21155, 27916, 28872, 35010, - 24265, 25986, 27566, 28610, 31806, 29557, 20196, 20278, 22265, 63839, - 23738, 23994, 24604, 29618, 31533, 32666, 32718, 32838, 36894, 37428, - 38646, 38728, 38936, 40801, 20363, 28583, 31150, 37300, 38583, 21214, - 63840, 25736, 25796, 27347, 28510, 28696, 29200, 30439, 32769, 34310, - 34396, 36335, 36613, 38706, 39791, 40442, 40565, 30860, 31103, 32160, - 33737, 37636, 40575, 40595, 35542, 22751, 24324, 26407, 28711, 29903, - 31840, 32894, 20769, 28712, 29282, 30922, 36034, 36058, 36084, 38647, - 20102, 20698, 23534, 24278, 26009, 29134, 30274, 30637, 32842, 34044, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36988, 39719, 40845, 22744, - 23105, 23650, 27155, 28122, 28431, 30267, 32047, 32311, 34078, 35128, - 37860, 38475, 21129, 26066, 26611, 27060, 27969, 28316, 28687, 29705, - 29792, 30041, 30244, 30827, 35628, 39006, 20845, 25134, 38520, 20374, - 20523, 23833, 28138, 32184, 36650, 24459, 24900, 26647, 63841, 38534, - 21202, 32907, 20956, 20940, 26974, 31260, 32190, 33777, 38517, 20442, - 21033, 21400, 21519, 21774, 23653, 24743, 26446, 26792, 28012, 29313, - 29432, 29702, 29827, 63842, 30178, 31852, 32633, 32696, 33673, 35023, - 35041, 37324, 37328, 38626, 39881, 21533, 28542, 29136, 29848, 34298, - 36522, 38563, 40023, 40607, 26519, 28107, 29747, 33256, 38678, 30764, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31435, 31520, 31890, 25705, - 29802, 30194, 30908, 30952, 39340, 39764, 40635, 23518, 24149, 28448, - 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, 24930, 25405, - 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, 34875, 36627, - 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, 38778, 20129, - 22916, 24536, 24537, 26395, 32178, 32596, 33426, 33579, 33725, 36638, - 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, 27599, 29028, - 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, 39488, 40613, - 23391, 27667, 29467, 30450, 30431, 33804, 20906, 35219, 20813, 20885, - 21193, 26825, 27796, 30468, 30496, 32191, 32236, 38754, 40629, 28357, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34065, 20901, 21517, 21629, - 26126, 26269, 26919, 28319, 30399, 30609, 33559, 33986, 34719, 37225, - 37528, 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, 25720, - 25721, 26286, 26576, 27169, 27597, 27611, 29279, 29281, 29761, 30520, - 30683, 32791, 33468, 33541, 35584, 35624, 35980, 26408, 27792, 29287, - 30446, 30566, 31302, 40361, 27519, 27794, 22818, 26406, 33945, 21359, - 22675, 22937, 24287, 25551, 26164, 26483, 28218, 29483, 31447, 33495, - 37672, 21209, 24043, 25006, 25035, 25098, 25287, 25771, 26080, 26969, - 27494, 27595, 28961, 29687, 30045, 32326, 33310, 33538, 34154, 35491, - 36031, 38695, 40289, 22696, 40664, 20497, 21006, 21563, 21839, 25991, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27766, 32010, 32011, 32862, - 34442, 38272, 38639, 21247, 27797, 29289, 21619, 23194, 23614, 23883, - 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, 31859, 32654, - 34183, 35598, 36855, 38753, 40692, 23735, 24758, 24845, 25003, 25935, - 26107, 26108, 27665, 27887, 29599, 29641, 32225, 38292, 23494, 34588, - 35600, 21085, 21338, 25293, 25615, 25778, 26420, 27192, 27850, 29632, - 29854, 31636, 31893, 32283, 33162, 33334, 34180, 36843, 38649, 39361, - 20276, 21322, 21453, 21467, 25292, 25644, 25856, 26001, 27075, 27886, - 28504, 29677, 30036, 30242, 30436, 30460, 30928, 30971, 31020, 32070, - 33324, 34784, 36820, 38930, 39151, 21187, 25300, 25765, 28196, 28497, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30332, 36299, 37297, 37474, - 39662, 39747, 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, - 25918, 26041, 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, - 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, - 20493, 20467, 63843, 22521, 24472, 25308, 25490, 26479, 28227, 28953, - 30403, 32972, 32986, 35060, 35061, 35097, 36064, 36649, 37197, 38506, - 20271, 20336, 24091, 26575, 26658, 30333, 30334, 39748, 24161, 27146, - 29033, 29140, 30058, 63844, 32321, 34115, 34281, 39132, 20240, 31567, - 32624, 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, - 33539, 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30887, 34327, 38370, 38713, - 63845, 21342, 24321, 35722, 36776, 36783, 37002, 21029, 30629, 40009, - 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, 26564, 26821, - 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, 20445, 22561, - 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, 29995, 33769, - 35036, 35091, 35676, 36628, 20239, 20693, 21264, 21340, 23443, 24489, - 26381, 31119, 33145, 33583, 34068, 35079, 35206, 36665, 36667, 39333, - 39954, 26412, 20086, 20472, 22857, 23553, 23791, 23792, 25447, 26834, - 28925, 29090, 29739, 32299, 34028, 34562, 36898, 37586, 40179, 19981, - 20184, 20463, 20613, 21078, 21103, 21542, 21648, 22496, 22827, 23142, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23386, 23413, 23500, 24220, - 63846, 25206, 25975, 26023, 28014, 28325, 29238, 31526, 31807, 32566, - 33104, 33105, 33178, 33344, 33433, 33705, 35331, 36000, 36070, 36091, - 36212, 36282, 37096, 37340, 38428, 38468, 39385, 40167, 21271, 20998, - 21545, 22132, 22707, 22868, 22894, 24575, 24996, 25198, 26128, 27774, - 28954, 30406, 31881, 31966, 32027, 33452, 36033, 38640, 63847, 20315, - 24343, 24447, 25282, 23849, 26379, 26842, 30844, 32323, 40300, 19989, - 20633, 21269, 21290, 21329, 22915, 23138, 24199, 24754, 24970, 25161, - 25209, 26000, 26503, 27047, 27604, 27606, 27607, 27608, 27832, 63848, - 29749, 30202, 30738, 30865, 31189, 31192, 31875, 32203, 32737, 32933, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 33086, 33218, 33778, 34586, - 35048, 35513, 35692, 36027, 37145, 38750, 39131, 40763, 22188, 23338, - 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, - 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, - 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, - 22763, 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, 24605, - 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, 28195, - 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, 32114, - 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, 36060, - 36198, 36781, 37034, 39164, 39391, 40605, 21066, 63849, 26388, 63850, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20632, 21034, 23665, 25955, - 27733, 29642, 29987, 30109, 31639, 33948, 37240, 38704, 20087, 25746, - 27578, 29022, 34217, 19977, 63851, 26441, 26862, 28183, 33439, 34072, - 34923, 25591, 28545, 37394, 39087, 19978, 20663, 20687, 20767, 21830, - 21930, 22039, 23360, 23577, 23776, 24120, 24202, 24224, 24258, 24819, - 26705, 27233, 28248, 29245, 29248, 29376, 30456, 31077, 31665, 32724, - 35059, 35316, 35443, 35937, 36062, 38684, 22622, 29885, 36093, 21959, - 63852, 31329, 32034, 33394, 29298, 29983, 29989, 63853, 31513, 22661, - 22779, 23996, 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, - 26329, 26360, 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32997, 33298, 34223, 35199, - 35475, 36893, 37604, 40653, 40736, 22805, 22893, 24109, 24796, 26132, - 26227, 26512, 27728, 28101, 28511, 30707, 30889, 33990, 37323, 37675, - 20185, 20682, 20808, 21892, 23307, 23459, 25159, 25982, 26059, 28210, - 29053, 29697, 29764, 29831, 29887, 30316, 31146, 32218, 32341, 32680, - 33146, 33203, 33337, 34330, 34796, 35445, 36323, 36984, 37521, 37925, - 39245, 39854, 21352, 23633, 26964, 27844, 27945, 28203, 33292, 34203, - 35131, 35373, 35498, 38634, 40807, 21089, 26297, 27570, 32406, 34814, - 36109, 38275, 38493, 25885, 28041, 29166, 63854, 22478, 22995, 23468, - 24615, 24826, 25104, 26143, 26207, 29481, 29689, 30427, 30465, 31596, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32854, 32882, 33125, 35488, - 37266, 19990, 21218, 27506, 27927, 31237, 31545, 32048, 63855, 36016, - 21484, 22063, 22609, 23477, 23567, 23569, 24034, 25152, 25475, 25620, - 26157, 26803, 27836, 28040, 28335, 28703, 28836, 29138, 29990, 30095, - 30094, 30233, 31505, 31712, 31787, 32032, 32057, 34092, 34157, 34311, - 35380, 36877, 36961, 37045, 37559, 38902, 39479, 20439, 23660, 26463, - 28049, 31903, 32396, 35606, 36118, 36895, 23403, 24061, 25613, 33984, - 36956, 39137, 29575, 23435, 24730, 26494, 28126, 35359, 35494, 36865, - 38924, 21047, 63856, 28753, 30862, 37782, 34928, 37335, 20462, 21463, - 22013, 22234, 22402, 22781, 23234, 23432, 23723, 23744, 24101, 24833, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 25101, 25163, 25480, 25628, - 25910, 25976, 27193, 27530, 27700, 27929, 28465, 29159, 29417, 29560, - 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, 32143, 32172, - 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, 35504, 35728, - 36664, 36930, 36995, 37228, 37526, 37561, 38539, 38567, 38568, 38614, - 38656, 38920, 39318, 39635, 39706, 21460, 22654, 22809, 23408, 23487, - 28113, 28506, 29087, 29729, 29881, 32901, 33789, 24033, 24455, 24490, - 24642, 26092, 26642, 26991, 27219, 27529, 27957, 28147, 29667, 30462, - 30636, 31565, 32020, 33059, 33308, 33600, 34036, 34147, 35426, 35524, - 37255, 37662, 38918, 39348, 25100, 34899, 36848, 37477, 23815, 23847, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23913, 29791, 33181, 34664, - 28629, 25342, 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, - 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, - 23608, 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, 26558, - 26612, 29468, 30690, 31034, 32709, 33940, 33997, 35222, 35430, 35433, - 35553, 35925, 35962, 22516, 23508, 24335, 24687, 25325, 26893, 27542, - 28252, 29060, 31698, 34645, 35672, 36606, 39135, 39166, 20280, 20353, - 20449, 21627, 23072, 23480, 24892, 26032, 26216, 29180, 30003, 31070, - 32051, 33102, 33251, 33688, 34218, 34254, 34563, 35338, 36523, 36763, - 63857, 36805, 22833, 23460, 23526, 24713, 23529, 23563, 24515, 27777, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63858, 28145, 28683, 29978, - 33455, 35574, 20160, 21313, 63859, 38617, 27663, 20126, 20420, 20818, - 21854, 23077, 23784, 25105, 29273, 33469, 33706, 34558, 34905, 35357, - 38463, 38597, 39187, 40201, 40285, 22538, 23731, 23997, 24132, 24801, - 24853, 25569, 27138, 28197, 37122, 37716, 38990, 39952, 40823, 23433, - 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, 26017, - 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, 33780, - 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, 27523, - 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, 30861, - 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, 38989, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27387, 32588, 40367, 40474, - 20063, 20539, 20918, 22812, 24825, 25590, 26928, 29242, 32822, 63860, - 37326, 24369, 63861, 63862, 32004, 33509, 33903, 33979, 34277, 36493, - 63863, 20335, 63864, 63865, 22756, 23363, 24665, 25562, 25880, 25965, - 26264, 63866, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, - 31344, 63867, 32650, 63868, 35140, 63869, 35731, 37312, 38525, 63870, - 39178, 22276, 24481, 26044, 28417, 30208, 31142, 35486, 39341, 39770, - 40812, 20740, 25014, 25233, 27277, 33222, 20547, 22576, 24422, 28937, - 35328, 35578, 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, - 23978, 26989, 20870, 20104, 20313, 63871, 63872, 63873, 22914, 63874, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63875, 27487, 27741, 63876, - 29877, 30998, 63877, 33287, 33349, 33593, 36671, 36701, 63878, 39192, - 63879, 63880, 63881, 20134, 63882, 22495, 24441, 26131, 63883, 63884, - 30123, 32377, 35695, 63885, 36870, 39515, 22181, 22567, 23032, 23071, - 23476, 63886, 24310, 63887, 63888, 25424, 25403, 63889, 26941, 27783, - 27839, 28046, 28051, 28149, 28436, 63890, 28895, 28982, 29017, 63891, - 29123, 29141, 63892, 30799, 30831, 63893, 31605, 32227, 63894, 32303, - 63895, 34893, 36575, 63896, 63897, 63898, 37467, 63899, 40182, 63900, - 63901, 63902, 24709, 28037, 63903, 29105, 63904, 63905, 38321, 21421, - 63906, 63907, 63908, 26579, 63909, 28814, 28976, 29744, 33398, 33490, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63910, 38331, 39653, 40573, - 26308, 63911, 29121, 33865, 63912, 63913, 22603, 63914, 63915, 23992, - 24433, 63916, 26144, 26254, 27001, 27054, 27704, 27891, 28214, 28481, - 28634, 28699, 28719, 29008, 29151, 29552, 63917, 29787, 63918, 29908, - 30408, 31310, 32403, 63919, 63920, 33521, 35424, 36814, 63921, 37704, - 63922, 38681, 63923, 63924, 20034, 20522, 63925, 21000, 21473, 26355, - 27757, 28618, 29450, 30591, 31330, 33454, 34269, 34306, 63926, 35028, - 35427, 35709, 35947, 63927, 37555, 63928, 38675, 38928, 20116, 20237, - 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, 23067, - 23524, 24735, 63929, 25034, 25942, 26111, 26212, 26791, 27738, 28595, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28879, 29100, 29522, 31613, - 34568, 35492, 39986, 40711, 23627, 27779, 29508, 29577, 37434, 28331, - 29797, 30239, 31337, 32277, 34314, 20800, 22725, 25793, 29934, 29973, - 30320, 32705, 37013, 38605, 39252, 28198, 29926, 31401, 31402, 33253, - 34521, 34680, 35355, 23113, 23436, 23451, 26785, 26880, 28003, 29609, - 29715, 29740, 30871, 32233, 32747, 33048, 33109, 33694, 35916, 38446, - 38929, 26352, 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, - 30702, 22806, 23916, 24013, 29477, 30031, 63930, 63931, 20709, 20985, - 22575, 22829, 22934, 23002, 23525, 63932, 63933, 23970, 25303, 25622, - 25747, 25854, 63934, 26332, 63935, 27208, 63936, 29183, 29796, 63937, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31368, 31407, 32327, 32350, - 32768, 33136, 63938, 34799, 35201, 35616, 36953, 63939, 36992, 39250, - 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, 20887, 21191, - 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, 28342, 29076, - 29794, 29992, 29996, 32883, 33592, 33993, 36362, 37780, 37854, 63940, - 20110, 20305, 20598, 20778, 21448, 21451, 21491, 23431, 23507, 23588, - 24858, 24962, 26100, 29275, 29591, 29760, 30402, 31056, 31121, 31161, - 32006, 32701, 33419, 34261, 34398, 36802, 36935, 37109, 37354, 38533, - 38632, 38633, 21206, 24423, 26093, 26161, 26671, 29020, 31286, 37057, - 38922, 20113, 63941, 27218, 27550, 28560, 29065, 32792, 33464, 34131, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36939, 38549, 38642, 38907, - 34074, 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, - 22435, 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, - 28304, 29232, 29503, 29783, 33489, 34945, 36677, 36960, 63942, 38498, - 39000, 40219, 26376, 36234, 37470, 20301, 20553, 20702, 21361, 22285, - 22996, 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, - 33806, 33894, 34111, 34655, 34907, 35096, 35586, 36949, 38859, 39759, - 20083, 20369, 20754, 20842, 63943, 21807, 21929, 23418, 23461, 24188, - 24189, 24254, 24736, 24799, 24840, 24841, 25540, 25912, 26377, 63944, - 26580, 26586, 63945, 26977, 26978, 27833, 27943, 63946, 28216, 63947, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28641, 29494, 29495, 63948, - 29788, 30001, 63949, 30290, 63950, 63951, 32173, 33278, 33848, 35029, - 35480, 35547, 35565, 36400, 36418, 36938, 36926, 36986, 37193, 37321, - 37742, 63952, 63953, 22537, 63954, 27603, 32905, 32946, 63955, 63956, - 20801, 22891, 23609, 63957, 63958, 28516, 29607, 32996, 36103, 63959, - 37399, 38287, 63960, 63961, 63962, 63963, 32895, 25102, 28700, 32104, - 34701, 63964, 22432, 24681, 24903, 27575, 35518, 37504, 38577, 20057, - 21535, 28139, 34093, 38512, 38899, 39150, 25558, 27875, 37009, 20957, - 25033, 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, - 26885, 27589, 30097, 30691, 32681, 33380, 34191, 34811, 34915, 35516, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 35696, 37291, 20108, 20197, - 20234, 63965, 63966, 22839, 23016, 63967, 24050, 24347, 24411, 24609, - 63968, 63969, 63970, 63971, 29246, 29669, 63972, 30064, 30157, 63973, - 31227, 63974, 32780, 32819, 32900, 33505, 33617, 63975, 63976, 36029, - 36019, 36999, 63977, 63978, 39156, 39180, 63979, 63980, 28727, 30410, - 32714, 32716, 32764, 35610, 20154, 20161, 20995, 21360, 63981, 21693, - 22240, 23035, 23493, 24341, 24525, 28270, 63982, 63983, 32106, 33589, - 63984, 34451, 35469, 63985, 38765, 38775, 63986, 63987, 19968, 20314, - 20350, 22777, 26085, 28322, 36920, 37808, 39353, 20219, 22764, 22922, - 23001, 24641, 63988, 63989, 31252, 63990, 33615, 36035, 20837, 21316, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63991, 63992, 63993, 20173, - 21097, 23381, 33471, 20180, 21050, 21672, 22985, 23039, 23376, 23383, - 23388, 24675, 24904, 28363, 28825, 29038, 29574, 29943, 30133, 30913, - 32043, 32773, 33258, 33576, 34071, 34249, 35566, 36039, 38604, 20316, - 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, 33421, 37196, - 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, 26283, 28507, - 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, 22715, 22767, - 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, 27167, 27299, - 27404, 28479, 29254, 63994, 29520, 29835, 31456, 31911, 33144, 33247, - 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, 38263, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38556, 20877, 21705, 22312, - 23472, 25165, 26448, 26685, 26771, 28221, 28371, 28797, 32289, 35009, - 36001, 36617, 40779, 40782, 29229, 31631, 35533, 37658, 20295, 20302, - 20786, 21632, 22992, 24213, 25269, 26485, 26990, 27159, 27822, 28186, - 29401, 29482, 30141, 31672, 32053, 33511, 33785, 33879, 34295, 35419, - 36015, 36487, 36889, 37048, 38606, 40799, 21219, 21514, 23265, 23490, - 25688, 25973, 28404, 29380, 63995, 30340, 31309, 31515, 31821, 32318, - 32735, 33659, 35627, 36042, 36196, 36321, 36447, 36842, 36857, 36969, - 37841, 20291, 20346, 20659, 20840, 20856, 21069, 21098, 22625, 22652, - 22880, 23560, 23637, 24283, 24731, 25136, 26643, 27583, 27656, 28593, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29006, 29728, 30000, 30008, - 30033, 30322, 31564, 31627, 31661, 31686, 32399, 35438, 36670, 36681, - 37439, 37523, 37666, 37931, 38651, 39002, 39019, 39198, 20999, 25130, - 25240, 27993, 30308, 31434, 31680, 32118, 21344, 23742, 24215, 28472, - 28857, 31896, 38673, 39822, 40670, 25509, 25722, 34678, 19969, 20117, - 20141, 20572, 20597, 21576, 22979, 23450, 24128, 24237, 24311, 24449, - 24773, 25402, 25919, 25972, 26060, 26230, 26232, 26622, 26984, 27273, - 27491, 27712, 28096, 28136, 28191, 28254, 28702, 28833, 29582, 29693, - 30010, 30555, 30855, 31118, 31243, 31357, 31934, 32142, 33351, 35330, - 35562, 35998, 37165, 37194, 37336, 37478, 37580, 37664, 38662, 38742, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38748, 38914, 40718, 21046, - 21137, 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, - 31532, 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, - 38988, 40778, 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, - 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, - 28526, 29031, 29157, 29226, 29866, 30522, 31062, 31066, 31199, 31264, - 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, 35519, - 36249, 36481, 36896, 36973, 37347, 38459, 38613, 40165, 26063, 31751, - 36275, 37827, 23384, 23562, 21330, 25305, 29469, 20519, 23447, 24478, - 24752, 24939, 26837, 28121, 29742, 31278, 32066, 32156, 32305, 33131, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36394, 36405, 37758, 37912, - 20304, 22352, 24038, 24231, 25387, 32618, 20027, 20303, 20367, 20570, - 23005, 32964, 21610, 21608, 22014, 22863, 23449, 24030, 24282, 26205, - 26417, 26609, 26666, 27880, 27954, 28234, 28557, 28855, 29664, 30087, - 31820, 32002, 32044, 32162, 33311, 34523, 35387, 35461, 36208, 36490, - 36659, 36913, 37198, 37202, 37956, 39376, 31481, 31909, 20426, 20737, - 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, - 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, - 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, - 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21675, 22320, 22336, 24535, - 25345, 25351, 25711, 25903, 26088, 26234, 26525, 26547, 27490, 27744, - 27802, 28460, 30693, 30757, 31049, 31063, 32025, 32930, 33026, 33267, - 33437, 33463, 34584, 35468, 63996, 36100, 36286, 36978, 30452, 31257, - 31287, 32340, 32887, 21767, 21972, 22645, 25391, 25634, 26185, 26187, - 26733, 27035, 27524, 27941, 28337, 29645, 29800, 29857, 30043, 30137, - 30433, 30494, 30603, 31206, 32265, 32285, 33275, 34095, 34967, 35386, - 36049, 36587, 36784, 36914, 37805, 38499, 38515, 38663, 20356, 21489, - 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, - 36074, 36300, 36845, 26015, 26389, 63997, 22519, 28503, 32221, 36655, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37878, 38598, 24501, 25074, - 28548, 19988, 20376, 20511, 21449, 21983, 23919, 24046, 27425, 27492, - 30923, 31642, 63998, 36425, 36554, 36974, 25417, 25662, 30528, 31364, - 37679, 38015, 40810, 25776, 28591, 29158, 29864, 29914, 31428, 31762, - 32386, 31922, 32408, 35738, 36106, 38013, 39184, 39244, 21049, 23519, - 25830, 26413, 32046, 20717, 21443, 22649, 24920, 24921, 25082, 26028, - 31449, 35730, 35734, 20489, 20513, 21109, 21809, 23100, 24288, 24432, - 24884, 25950, 26124, 26166, 26274, 27085, 28356, 28466, 29462, 30241, - 31379, 33081, 33369, 33750, 33980, 20661, 22512, 23488, 23528, 24425, - 25505, 30758, 32181, 33756, 34081, 37319, 37365, 20874, 26613, 31574, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36012, 20932, 22971, 24765, - 34389, 20508, 63999, 21076, 23610, 24957, 25114, 25299, 25842, 26021, - 28364, 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, - 24029, 25797, 27849, 28154, 29588, 31359, 33307, 34214, 36068, 36368, - 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, - 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, - 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, - 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, - 35531, 38737, 39894, 64000, 21059, 26367, 28053, 28399, 32224, 35558, - 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26898, 26970, 27189, 28818, - 28966, 30813, 30977, 30990, 31186, 31245, 32918, 33400, 33493, 33609, - 34121, 35970, 36229, 37218, 37259, 37294, 20419, 22225, 29165, 30679, - 34560, 35320, 23544, 24534, 26449, 37032, 21474, 22618, 23541, 24740, - 24961, 25696, 32317, 32880, 34085, 37507, 25774, 20652, 23828, 26368, - 22684, 25277, 25512, 26894, 27000, 27166, 28267, 30394, 31179, 33467, - 33833, 35535, 36264, 36861, 37138, 37195, 37276, 37648, 37656, 37786, - 38619, 39478, 39949, 19985, 30044, 31069, 31482, 31569, 31689, 32302, - 33988, 36441, 36468, 36600, 36880, 26149, 26943, 29763, 20986, 26414, - 40668, 20805, 24544, 27798, 34802, 34909, 34935, 24756, 33205, 33795, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36101, 21462, 21561, 22068, - 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, - 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, - 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, - 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, - 40786, 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, 23522, - 26517, 27784, 28024, 29723, 30759, 37341, 37756, 34756, 31204, 31281, - 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, 25302, 26422, - 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, 22396, 64001, - 25176, 64002, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37944, 21585, 22022, 22374, - 24392, 24986, 27470, 28760, 28845, 32187, 35477, 22890, 33067, 25506, - 30472, 32829, 36010, 22612, 25645, 27067, 23445, 24081, 28271, 64003, - 34153, 20812, 21488, 22826, 24608, 24907, 27526, 27760, 27888, 31518, - 32974, 33492, 36294, 37040, 39089, 64004, 25799, 28580, 25745, 25860, - 20814, 21520, 22303, 35342, 24927, 26742, 64005, 30171, 31570, 32113, - 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, 22871, 22956, - 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, 24052, 25226, - 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, 32631, 33453, - 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, 36774, 37393, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38442, 20843, 21485, 25420, - 20329, 21764, 24726, 25943, 27803, 28031, 29260, 29437, 31255, 35207, - 35997, 24429, 28558, 28921, 33192, 24846, 20415, 20559, 25153, 29255, - 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, - 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, - 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, - 24598, 25243, 25265, 25429, 64006, 27873, 28006, 30129, 30770, 32990, - 33071, 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, - 24133, 26292, 26333, 28689, 29190, 64007, 20469, 21117, 24426, 24915, - 26451, 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21697, 31263, 26963, 35575, - 35914, 39080, 39342, 24444, 25259, 30130, 30382, 34987, 36991, 38466, - 21305, 24380, 24517, 27852, 29644, 30050, 30091, 31558, 33534, 39325, - 20047, 36924, 19979, 20309, 21414, 22799, 24264, 26160, 27827, 29781, - 33655, 34662, 36032, 36944, 38686, 39957, 22737, 23416, 34384, 35604, - 40372, 23506, 24680, 24717, 26097, 27735, 28450, 28579, 28698, 32597, - 32752, 38289, 38290, 38480, 38867, 21106, 36676, 20989, 21547, 21688, - 21859, 21898, 27323, 28085, 32216, 33382, 37532, 38519, 40569, 21512, - 21704, 30418, 34532, 38308, 38356, 38492, 20130, 20233, 23022, 23270, - 24055, 24658, 25239, 26477, 26689, 27782, 28207, 32568, 32923, 33322, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 64008, 64009, 38917, 20133, - 20565, 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, - 34809, 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, - 24184, 26447, 33607, 34892, 20139, 21521, 22190, 29670, 37141, 38911, - 39177, 39255, 39321, 22099, 22687, 34395, 35377, 25010, 27382, 29563, - 36562, 27463, 38570, 39511, 22869, 29184, 36203, 38761, 20436, 23796, - 24358, 25080, 26203, 27883, 28843, 29572, 29625, 29694, 30505, 30541, - 32067, 32098, 32291, 33335, 34898, 64010, 36066, 37449, 39023, 23377, - 31348, 34880, 38913, 23244, 20448, 21332, 22846, 23805, 25406, 28025, - 29433, 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24418, 27842, 28366, 28677, - 28752, 28847, 29074, 29673, 29801, 33610, 34722, 34913, 36872, 37026, - 37795, 39336, 20846, 24407, 24800, 24935, 26291, 34137, 36426, 37295, - 38795, 20046, 20114, 21628, 22741, 22778, 22909, 23733, 24359, 25142, - 25160, 26122, 26215, 27627, 28009, 28111, 28246, 28408, 28564, 28640, - 28649, 28765, 29392, 29733, 29786, 29920, 30355, 31068, 31946, 32286, - 32993, 33446, 33899, 33983, 34382, 34399, 34676, 35703, 35946, 37804, - 38912, 39013, 24785, 25110, 37239, 23130, 26127, 28151, 28222, 29759, - 39746, 24573, 24794, 31503, 21700, 24344, 27742, 27859, 27946, 28888, - 32005, 34425, 35340, 40251, 21270, 21644, 23301, 27194, 28779, 30069, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31117, 31166, 33457, 33775, - 35441, 35649, 36008, 38772, 64011, 25844, 25899, 30906, 30907, 31339, - 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, - 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, 28369, 29502, - 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, 26179, - 26180, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, 31681, - 31783, 33618, 34647, 36945, 38541, 40643, 21295, 22238, 24315, 24458, - 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, 28784, 29546, - 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, 23446, 27243, - 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, 28045, 28102, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29243, 32948, 37237, 39501, - 20399, 20505, 21402, 21518, 21564, 21897, 21957, 24127, 24460, 26429, - 29030, 29661, 36869, 21211, 21235, 22628, 22734, 28932, 29071, 29179, - 34224, 35347, 26248, 34216, 21927, 26244, 29002, 33841, 21321, 21913, - 27585, 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, - 25658, 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, - 27958, 33016, 40657, 26133, 27427, 28824, 30165, 21507, 23673, 32007, - 35350, 27424, 27453, 27462, 21560, 24688, 27965, 32725, 33288, 20694, - 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, 25137, - 26206, 26342, 29081, 29113, 29114, 29351, 31143, 31232, 32690, 35440, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - -}; - -static const unsigned long myhtml_encoding_map_gb18030[] = { - 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, - 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, - 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, - 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, - 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, - 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, - 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, - 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, - 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, - 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, - 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, - 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, - 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, - 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, - 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, - 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, - 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, - 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, - 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, - 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, - 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, - 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, - 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, - 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, - 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, - 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, - 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, - 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, - 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, - 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, - 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, - 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, - 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, - 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, - 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, - 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, - 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, - 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, - 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, - 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, - 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, - 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, - 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, - 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, - 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, - 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, - 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, - 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, - 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, - 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, - 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, - 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, - 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, - 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, - 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, - 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, - 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, - 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, - 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, - 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, - 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, - 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, - 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, - 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, - 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, - 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, - 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, - 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, - 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, - 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, - 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, - 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, - 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, - 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, - 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, - 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, - 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, - 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, - 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, - 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, - 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, - 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, - 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, - 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, - 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, - 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, - 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, - 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, - 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, - 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, - 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, - 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, - 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, - 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, - 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, - 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, - 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, - 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, - 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, - 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, - 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, - 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, - 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, - 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, - 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, - 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, - 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, - 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, - 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, - 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, - 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, - 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, - 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, - 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, - 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, - 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, - 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, - 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, - 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, - 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, - 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, - 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, - 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, - 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, - 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, - 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, - 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, - 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, - 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, - 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, - 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, - 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, - 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, - 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, - 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, - 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, - 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, - 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, - 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, - 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, - 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, - 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, - 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, - 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, - 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, - 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, - 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, - 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, - 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, - 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, - 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, - 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, - 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, - 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, - 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, - 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, - 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, - 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, - 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, - 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, - 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, - 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, - 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, - 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, - 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, - 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, - 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, - 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, - 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, - 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, - 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, - 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, - 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, - 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, - 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, - 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, - 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, - 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, - 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, - 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, - 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, - 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, - 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, - 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, - 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, - 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, - 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, - 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, - 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, - 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, - 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, - 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, - 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, - 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, - 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, - 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, - 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, - 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, - 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, - 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, - 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, - 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, - 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, - 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, - 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, - 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, - 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, - 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, - 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, - 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, - 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, - 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, - 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, - 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, - 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, - 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, - 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, - 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, - 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, - 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, - 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, - 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, - 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, - 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, - 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, - 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, - 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, - 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, - 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, - 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, - 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, - 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, - 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, - 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, - 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, - 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, - 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, - 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, - 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, - 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, - 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, - 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, - 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, - 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, - 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, - 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, - 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, - 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, - 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, - 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, - 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, - 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, - 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, - 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, - 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, - 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, - 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, - 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, - 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, - 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, - 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, - 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, - 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, - 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, - 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, - 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, - 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, - 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, - 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, - 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, - 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, - 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, - 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, - 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, - 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, - 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, - 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, - 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, - 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, - 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, - 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, - 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, - 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, - 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, - 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, - 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, - 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, - 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, - 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, - 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, - 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, - 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, - 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, - 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, - 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, - 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, - 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, - 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, - 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, - 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, - 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, - 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, - 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, - 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, - 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, - 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, - 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, - 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, - 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, - 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, - 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, - 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, - 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, - 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, - 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, - 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, - 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, - 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, - 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, - 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, - 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, - 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, - 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, - 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, - 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, - 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, - 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, - 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, - 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, - 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, - 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, - 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, - 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, - 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, - 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, - 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, - 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, - 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, - 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, - 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, - 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, - 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, - 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, - 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, - 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, - 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, - 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, - 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, - 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, - 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, - 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, - 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, - 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, - 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, - 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, - 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, - 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, - 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, - 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, - 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, - 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, - 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, - 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, - 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, - 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, - 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, - 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, - 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, - 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, - 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, - 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, - 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, - 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, - 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, - 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, - 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, - 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, - 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, - 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, - 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, - 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, - 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, - 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, - 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, - 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, - 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, - 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, - 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, - 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, - 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, - 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, - 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, - 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, - 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, - 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, - 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, - 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, - 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, - 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, - 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, - 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, - 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, - 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, - 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, - 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, - 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, - 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, - 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, - 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, - 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, - 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, - 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, - 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, - 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, - 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, - 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, - 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, - 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, - 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, - 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, - 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, - 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, - 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, - 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, - 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, - 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, - 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, - 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, - 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, - 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, - 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, - 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, - 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, - 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, - 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, - 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, - 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, - 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, - 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, - 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, - 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, - 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, - 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, - 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, - 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, - 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, - 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, - 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, - 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, - 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, - 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, - 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, - 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, - 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, - 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, - 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, - 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, - 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, - 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, - 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, - 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, - 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, - 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, - 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, - 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, - 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, - 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, - 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, - 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, - 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, - 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, - 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, - 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, - 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, - 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, - 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, - 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, - 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, - 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, - 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, - 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, - 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, - 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, - 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, - 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, - 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, - 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, - 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, - 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, - 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, - 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, - 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, - 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, - 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, - 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, - 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, - 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, - 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, - 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, - 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, - 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, - 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, - 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, - 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, - 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, - 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, - 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, - 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, - 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, - 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, - 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, - 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, - 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, - 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, - 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, - 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, - 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, - 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, - 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, - 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, - 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, - 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, - 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, - 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, - 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, - 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, - 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, - 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, - 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, - 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, - 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, - 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, - 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, - 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, - 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, - 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, - 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, - 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, - 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, - 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, - 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, - 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, - 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, - 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, - 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, - 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, - 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, - 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, - 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, - 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, - 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, - 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, - 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, - 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, - 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, - 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, - 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, - 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, - 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, - 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, - 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, - 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, - 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, - 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, - 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, - 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, - 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, - 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, - 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, - 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, - 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, - 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, - 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, - 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, - 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, - 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, - 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, - 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, - 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, - 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, - 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, - 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, - 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, - 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, - 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, - 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, - 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, - 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, - 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, - 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, - 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, - 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, - 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, - 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, - 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, - 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, - 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, - 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, - 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, - 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, - 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, - 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, - 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, - 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, - 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, - 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, - 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, - 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, - 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, - 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, - 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, - 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, - 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, - 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, - 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58633, 58634, 58635, - 58636, 58637, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, - 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, - 58656, 58657, 58658, 58659, 58660, 58661, 12288, 12289, 12290, 183, - 713, 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, - 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, - 12301, 12302, 12303, 12310, 12311, 12304, 12305, 177, 215, 247, - 8758, 8743, 8744, 8721, 8719, 8746, 8745, 8712, 8759, 8730, - 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, 8780, 8776, - 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, 8756, - 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, - 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, - 9633, 9632, 9651, 9650, 8251, 8594, 8592, 8593, 8595, 12307, - 58662, 58663, 58664, 58665, 58666, 58667, 58668, 58669, 58670, 58671, - 58672, 58673, 58674, 58675, 58676, 58677, 58678, 58679, 58680, 58681, - 58682, 58683, 58684, 58685, 58686, 58687, 58688, 58689, 58690, 58691, - 58692, 58693, 58694, 58695, 58696, 58697, 58698, 58699, 58700, 58701, - 58702, 58703, 58704, 58705, 58706, 58707, 58708, 58709, 58710, 58711, - 58712, 58713, 58714, 58715, 58716, 58717, 58718, 58719, 58720, 58721, - 58722, 58723, 58724, 58725, 58726, 58727, 58728, 58729, 58730, 58731, - 58732, 58733, 58734, 58735, 58736, 58737, 58738, 58739, 58740, 58741, - 58742, 58743, 58744, 58745, 58746, 58747, 58748, 58749, 58750, 58751, - 58752, 58753, 58754, 58755, 58756, 58757, 8560, 8561, 8562, 8563, - 8564, 8565, 8566, 8567, 8568, 8569, 59238, 59239, 59240, 59241, - 59242, 59243, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, - 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, - 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, - 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, - 9350, 9351, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, - 9320, 9321, 8364, 59245, 12832, 12833, 12834, 12835, 12836, 12837, - 12838, 12839, 12840, 12841, 59246, 59247, 8544, 8545, 8546, 8547, - 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 59248, 59249, - 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, 58766, 58767, - 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, 58776, 58777, - 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, 58786, 58787, - 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, 58796, 58797, - 58798, 58799, 58800, 58801, 58802, 58803, 58804, 58805, 58806, 58807, - 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, 58816, 58817, - 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, 58826, 58827, - 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, 58836, 58837, - 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, 58846, 58847, - 58848, 58849, 58850, 58851, 58852, 12288, 65281, 65282, 65283, 65509, - 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, - 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, - 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, - 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, - 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, - 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, - 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, - 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, - 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, - 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, 58862, 58863, - 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58871, 58872, 58873, - 58874, 58875, 58876, 58877, 58878, 58879, 58880, 58881, 58882, 58883, - 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, 58892, 58893, - 58894, 58895, 58896, 58897, 58898, 58899, 58900, 58901, 58902, 58903, - 58904, 58905, 58906, 58907, 58908, 58909, 58910, 58911, 58912, 58913, - 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, 58922, 58923, - 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, 58932, 58933, - 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, 58942, 58943, - 58944, 58945, 58946, 58947, 58948, 58949, 12353, 12354, 12355, 12356, - 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, - 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, - 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, - 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, - 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, - 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, - 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, - 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 59250, - 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, - 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, 58958, 58959, - 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, 58968, 58969, - 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, 58978, 58979, - 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, 58988, 58989, - 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, 58998, 58999, - 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, 59008, 59009, - 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, 59018, 59019, - 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, 59028, 59029, - 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, - 59040, 59041, 59042, 59043, 59044, 59045, 12449, 12450, 12451, 12452, - 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, - 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, - 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, - 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, - 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, - 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, - 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, - 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, - 12533, 12534, 59261, 59262, 59263, 59264, 59265, 59266, 59267, 59268, - 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, 59054, 59055, - 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, 59064, 59065, - 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, - 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, 59084, 59085, - 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, 59094, 59095, - 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, 59104, 59105, - 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, 59114, 59115, - 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, 59124, 59125, - 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, 59134, 59135, - 59136, 59137, 59138, 59139, 59140, 59141, 913, 914, 915, 916, - 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, - 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, - 59269, 59270, 59271, 59272, 59273, 59274, 59275, 59276, 945, 946, - 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, - 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, - 968, 969, 59277, 59278, 59279, 59280, 59281, 59282, 59283, 65077, - 65078, 65081, 65082, 65087, 65088, 65085, 65086, 65089, 65090, 65091, - 65092, 59284, 59285, 65083, 65084, 65079, 65080, 65073, 59286, 65075, - 65076, 59287, 59288, 59289, 59290, 59291, 59292, 59293, 59294, 59295, - 59142, 59143, 59144, 59145, 59146, 59147, 59148, 59149, 59150, 59151, - 59152, 59153, 59154, 59155, 59156, 59157, 59158, 59159, 59160, 59161, - 59162, 59163, 59164, 59165, 59166, 59167, 59168, 59169, 59170, 59171, - 59172, 59173, 59174, 59175, 59176, 59177, 59178, 59179, 59180, 59181, - 59182, 59183, 59184, 59185, 59186, 59187, 59188, 59189, 59190, 59191, - 59192, 59193, 59194, 59195, 59196, 59197, 59198, 59199, 59200, 59201, - 59202, 59203, 59204, 59205, 59206, 59207, 59208, 59209, 59210, 59211, - 59212, 59213, 59214, 59215, 59216, 59217, 59218, 59219, 59220, 59221, - 59222, 59223, 59224, 59225, 59226, 59227, 59228, 59229, 59230, 59231, - 59232, 59233, 59234, 59235, 59236, 59237, 1040, 1041, 1042, 1043, - 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, - 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 59296, - 59297, 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, - 59307, 59308, 59309, 59310, 1072, 1073, 1074, 1075, 1076, 1077, - 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, - 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, - 1097, 1098, 1099, 1100, 1101, 1102, 1103, 59311, 59312, 59313, - 59314, 59315, 59316, 59317, 59318, 59319, 59320, 59321, 59322, 59323, - 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, 8598, - 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, - 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, - 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, - 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, - 9582, 9583, 9584, 9585, 9586, 9587, 9601, 9602, 9603, 9604, - 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, - 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, - 9737, 8853, 12306, 12317, 12318, 59324, 59325, 59326, 59327, 59328, - 59329, 59330, 59331, 59332, 59333, 59334, 257, 225, 462, 224, - 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, - 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, - 252, 234, 593, 7743, 324, 328, 505, 609, 59337, 59338, - 59339, 59340, 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, - 12557, 12558, 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, - 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, - 12577, 12578, 12579, 12580, 12581, 12582, 12583, 12584, 12585, 59341, - 59342, 59343, 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, - 59352, 59353, 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, - 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, - 13198, 13199, 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, - 13269, 65072, 65506, 65508, 59362, 8481, 12849, 59363, 8208, 59364, - 59365, 59366, 12540, 12443, 12444, 12541, 12542, 12294, 12445, 12446, - 65097, 65098, 65099, 65100, 65101, 65102, 65103, 65104, 65105, 65106, - 65108, 65109, 65110, 65111, 65113, 65114, 65115, 65116, 65117, 65118, - 65119, 65120, 65121, 65122, 65123, 65124, 65125, 65126, 65128, 65129, - 65130, 65131, 12350, 12272, 12273, 12274, 12275, 12276, 12277, 12278, - 12279, 12280, 12281, 12282, 12283, 12295, 59380, 59381, 59382, 59383, - 59384, 59385, 59386, 59387, 59388, 59389, 59390, 59391, 59392, 9472, - 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, - 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, - 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, - 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, - 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, - 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, - 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, - 9543, 9544, 9545, 9546, 9547, 59393, 59394, 59395, 59396, 59397, - 59398, 59399, 59400, 59401, 59402, 59403, 59404, 59405, 59406, 59407, - 29404, 29405, 29407, 29410, 29411, 29412, 29413, 29414, 29415, 29418, - 29419, 29429, 29430, 29433, 29437, 29438, 29439, 29440, 29442, 29444, - 29445, 29446, 29447, 29448, 29449, 29451, 29452, 29453, 29455, 29456, - 29457, 29458, 29460, 29464, 29465, 29466, 29471, 29472, 29475, 29476, - 29478, 29479, 29480, 29485, 29487, 29488, 29490, 29491, 29493, 29494, - 29498, 29499, 29500, 29501, 29504, 29505, 29506, 29507, 29508, 29509, - 29510, 29511, 29512, 29513, 29514, 29515, 29516, 29518, 29519, 29521, - 29523, 29524, 29525, 29526, 29528, 29529, 29530, 29531, 29532, 29533, - 29534, 29535, 29537, 29538, 29539, 29540, 29541, 29542, 29543, 29544, - 29545, 29546, 29547, 29550, 29552, 29553, 57344, 57345, 57346, 57347, - 57348, 57349, 57350, 57351, 57352, 57353, 57354, 57355, 57356, 57357, - 57358, 57359, 57360, 57361, 57362, 57363, 57364, 57365, 57366, 57367, - 57368, 57369, 57370, 57371, 57372, 57373, 57374, 57375, 57376, 57377, - 57378, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57387, - 57388, 57389, 57390, 57391, 57392, 57393, 57394, 57395, 57396, 57397, - 57398, 57399, 57400, 57401, 57402, 57403, 57404, 57405, 57406, 57407, - 57408, 57409, 57410, 57411, 57412, 57413, 57414, 57415, 57416, 57417, - 57418, 57419, 57420, 57421, 57422, 57423, 57424, 57425, 57426, 57427, - 57428, 57429, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 57437, - 29554, 29555, 29556, 29557, 29558, 29559, 29560, 29561, 29562, 29563, - 29564, 29565, 29567, 29568, 29569, 29570, 29571, 29573, 29574, 29576, - 29578, 29580, 29581, 29583, 29584, 29586, 29587, 29588, 29589, 29591, - 29592, 29593, 29594, 29596, 29597, 29598, 29600, 29601, 29603, 29604, - 29605, 29606, 29607, 29608, 29610, 29612, 29613, 29617, 29620, 29621, - 29622, 29624, 29625, 29628, 29629, 29630, 29631, 29633, 29635, 29636, - 29637, 29638, 29639, 29643, 29644, 29646, 29650, 29651, 29652, 29653, - 29654, 29655, 29656, 29658, 29659, 29660, 29661, 29663, 29665, 29666, - 29667, 29668, 29670, 29672, 29674, 29675, 29676, 29678, 29679, 29680, - 29681, 29683, 29684, 29685, 29686, 29687, 57438, 57439, 57440, 57441, - 57442, 57443, 57444, 57445, 57446, 57447, 57448, 57449, 57450, 57451, - 57452, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 57460, 57461, - 57462, 57463, 57464, 57465, 57466, 57467, 57468, 57469, 57470, 57471, - 57472, 57473, 57474, 57475, 57476, 57477, 57478, 57479, 57480, 57481, - 57482, 57483, 57484, 57485, 57486, 57487, 57488, 57489, 57490, 57491, - 57492, 57493, 57494, 57495, 57496, 57497, 57498, 57499, 57500, 57501, - 57502, 57503, 57504, 57505, 57506, 57507, 57508, 57509, 57510, 57511, - 57512, 57513, 57514, 57515, 57516, 57517, 57518, 57519, 57520, 57521, - 57522, 57523, 57524, 57525, 57526, 57527, 57528, 57529, 57530, 57531, - 29688, 29689, 29690, 29691, 29692, 29693, 29694, 29695, 29696, 29697, - 29698, 29700, 29703, 29704, 29707, 29708, 29709, 29710, 29713, 29714, - 29715, 29716, 29717, 29718, 29719, 29720, 29721, 29724, 29725, 29726, - 29727, 29728, 29729, 29731, 29732, 29735, 29737, 29739, 29741, 29743, - 29745, 29746, 29751, 29752, 29753, 29754, 29755, 29757, 29758, 29759, - 29760, 29762, 29763, 29764, 29765, 29766, 29767, 29768, 29769, 29770, - 29771, 29772, 29773, 29774, 29775, 29776, 29777, 29778, 29779, 29780, - 29782, 29784, 29789, 29792, 29793, 29794, 29795, 29796, 29797, 29798, - 29799, 29800, 29801, 29802, 29803, 29804, 29806, 29807, 29809, 29810, - 29811, 29812, 29813, 29816, 29817, 29818, 57532, 57533, 57534, 57535, - 57536, 57537, 57538, 57539, 57540, 57541, 57542, 57543, 57544, 57545, - 57546, 57547, 57548, 57549, 57550, 57551, 57552, 57553, 57554, 57555, - 57556, 57557, 57558, 57559, 57560, 57561, 57562, 57563, 57564, 57565, - 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57573, 57574, 57575, - 57576, 57577, 57578, 57579, 57580, 57581, 57582, 57583, 57584, 57585, - 57586, 57587, 57588, 57589, 57590, 57591, 57592, 57593, 57594, 57595, - 57596, 57597, 57598, 57599, 57600, 57601, 57602, 57603, 57604, 57605, - 57606, 57607, 57608, 57609, 57610, 57611, 57612, 57613, 57614, 57615, - 57616, 57617, 57618, 57619, 57620, 57621, 57622, 57623, 57624, 57625, - 29819, 29820, 29821, 29823, 29826, 29828, 29829, 29830, 29832, 29833, - 29834, 29836, 29837, 29839, 29841, 29842, 29843, 29844, 29845, 29846, - 29847, 29848, 29849, 29850, 29851, 29853, 29855, 29856, 29857, 29858, - 29859, 29860, 29861, 29862, 29866, 29867, 29868, 29869, 29870, 29871, - 29872, 29873, 29874, 29875, 29876, 29877, 29878, 29879, 29880, 29881, - 29883, 29884, 29885, 29886, 29887, 29888, 29889, 29890, 29891, 29892, - 29893, 29894, 29895, 29896, 29897, 29898, 29899, 29900, 29901, 29902, - 29903, 29904, 29905, 29907, 29908, 29909, 29910, 29911, 29912, 29913, - 29914, 29915, 29917, 29919, 29921, 29925, 29927, 29928, 29929, 29930, - 29931, 29932, 29933, 29936, 29937, 29938, 57626, 57627, 57628, 57629, - 57630, 57631, 57632, 57633, 57634, 57635, 57636, 57637, 57638, 57639, - 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, - 57650, 57651, 57652, 57653, 57654, 57655, 57656, 57657, 57658, 57659, - 57660, 57661, 57662, 57663, 57664, 57665, 57666, 57667, 57668, 57669, - 57670, 57671, 57672, 57673, 57674, 57675, 57676, 57677, 57678, 57679, - 57680, 57681, 57682, 57683, 57684, 57685, 57686, 57687, 57688, 57689, - 57690, 57691, 57692, 57693, 57694, 57695, 57696, 57697, 57698, 57699, - 57700, 57701, 57702, 57703, 57704, 57705, 57706, 57707, 57708, 57709, - 57710, 57711, 57712, 57713, 57714, 57715, 57716, 57717, 57718, 57719, - 29939, 29941, 29944, 29945, 29946, 29947, 29948, 29949, 29950, 29952, - 29953, 29954, 29955, 29957, 29958, 29959, 29960, 29961, 29962, 29963, - 29964, 29966, 29968, 29970, 29972, 29973, 29974, 29975, 29979, 29981, - 29982, 29984, 29985, 29986, 29987, 29988, 29990, 29991, 29994, 29998, - 30004, 30006, 30009, 30012, 30013, 30015, 30017, 30018, 30019, 30020, - 30022, 30023, 30025, 30026, 30029, 30032, 30033, 30034, 30035, 30037, - 30038, 30039, 30040, 30045, 30046, 30047, 30048, 30049, 30050, 30051, - 30052, 30055, 30056, 30057, 30059, 30060, 30061, 30062, 30063, 30064, - 30065, 30067, 30069, 30070, 30071, 30074, 30075, 30076, 30077, 30078, - 30080, 30081, 30082, 30084, 30085, 30087, 57720, 57721, 57722, 57723, - 57724, 57725, 57726, 57727, 57728, 57729, 57730, 57731, 57732, 57733, - 57734, 57735, 57736, 57737, 57738, 57739, 57740, 57741, 57742, 57743, - 57744, 57745, 57746, 57747, 57748, 57749, 57750, 57751, 57752, 57753, - 57754, 57755, 57756, 57757, 57758, 57759, 57760, 57761, 57762, 57763, - 57764, 57765, 57766, 57767, 57768, 57769, 57770, 57771, 57772, 57773, - 57774, 57775, 57776, 57777, 57778, 57779, 57780, 57781, 57782, 57783, - 57784, 57785, 57786, 57787, 57788, 57789, 57790, 57791, 57792, 57793, - 57794, 57795, 57796, 57797, 57798, 57799, 57800, 57801, 57802, 57803, - 57804, 57805, 57806, 57807, 57808, 57809, 57810, 57811, 57812, 57813, - 30088, 30089, 30090, 30092, 30093, 30094, 30096, 30099, 30101, 30104, - 30107, 30108, 30110, 30114, 30118, 30119, 30120, 30121, 30122, 30125, - 30134, 30135, 30138, 30139, 30143, 30144, 30145, 30150, 30155, 30156, - 30158, 30159, 30160, 30161, 30163, 30167, 30169, 30170, 30172, 30173, - 30175, 30176, 30177, 30181, 30185, 30188, 30189, 30190, 30191, 30194, - 30195, 30197, 30198, 30199, 30200, 30202, 30203, 30205, 30206, 30210, - 30212, 30214, 30215, 30216, 30217, 30219, 30221, 30222, 30223, 30225, - 30226, 30227, 30228, 30230, 30234, 30236, 30237, 30238, 30241, 30243, - 30247, 30248, 30252, 30254, 30255, 30257, 30258, 30262, 30263, 30265, - 30266, 30267, 30269, 30273, 30274, 30276, 57814, 57815, 57816, 57817, - 57818, 57819, 57820, 57821, 57822, 57823, 57824, 57825, 57826, 57827, - 57828, 57829, 57830, 57831, 57832, 57833, 57834, 57835, 57836, 57837, - 57838, 57839, 57840, 57841, 57842, 57843, 57844, 57845, 57846, 57847, - 57848, 57849, 57850, 57851, 57852, 57853, 57854, 57855, 57856, 57857, - 57858, 57859, 57860, 57861, 57862, 57863, 57864, 57865, 57866, 57867, - 57868, 57869, 57870, 57871, 57872, 57873, 57874, 57875, 57876, 57877, - 57878, 57879, 57880, 57881, 57882, 57883, 57884, 57885, 57886, 57887, - 57888, 57889, 57890, 57891, 57892, 57893, 57894, 57895, 57896, 57897, - 57898, 57899, 57900, 57901, 57902, 57903, 57904, 57905, 57906, 57907, - 30277, 30278, 30279, 30280, 30281, 30282, 30283, 30286, 30287, 30288, - 30289, 30290, 30291, 30293, 30295, 30296, 30297, 30298, 30299, 30301, - 30303, 30304, 30305, 30306, 30308, 30309, 30310, 30311, 30312, 30313, - 30314, 30316, 30317, 30318, 30320, 30321, 30322, 30323, 30324, 30325, - 30326, 30327, 30329, 30330, 30332, 30335, 30336, 30337, 30339, 30341, - 30345, 30346, 30348, 30349, 30351, 30352, 30354, 30356, 30357, 30359, - 30360, 30362, 30363, 30364, 30365, 30366, 30367, 30368, 30369, 30370, - 30371, 30373, 30374, 30375, 30376, 30377, 30378, 30379, 30380, 30381, - 30383, 30384, 30387, 30389, 30390, 30391, 30392, 30393, 30394, 30395, - 30396, 30397, 30398, 30400, 30401, 30403, 21834, 38463, 22467, 25384, - 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, 29233, - 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, 26696, - 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, 22885, - 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, 20843, 30116, - 24052, 25300, 36299, 38774, 25226, 32793, 22365, 38712, 32610, 29240, - 30333, 26575, 30334, 25670, 20336, 36133, 25308, 31255, 26001, 29677, - 25644, 25203, 33324, 39041, 26495, 29256, 25198, 25292, 20276, 29923, - 21322, 21150, 32458, 37030, 24110, 26758, 27036, 33152, 32465, 26834, - 30917, 34444, 38225, 20621, 35876, 33502, 32990, 21253, 35090, 21093, - 30404, 30407, 30409, 30411, 30412, 30419, 30421, 30425, 30426, 30428, - 30429, 30430, 30432, 30433, 30434, 30435, 30436, 30438, 30439, 30440, - 30441, 30442, 30443, 30444, 30445, 30448, 30451, 30453, 30454, 30455, - 30458, 30459, 30461, 30463, 30464, 30466, 30467, 30469, 30470, 30474, - 30476, 30478, 30479, 30480, 30481, 30482, 30483, 30484, 30485, 30486, - 30487, 30488, 30491, 30492, 30493, 30494, 30497, 30499, 30500, 30501, - 30503, 30506, 30507, 30508, 30510, 30512, 30513, 30514, 30515, 30516, - 30521, 30523, 30525, 30526, 30527, 30530, 30532, 30533, 30534, 30536, - 30537, 30538, 30539, 30540, 30541, 30542, 30543, 30546, 30547, 30548, - 30549, 30550, 30551, 30552, 30553, 30556, 34180, 38649, 20445, 22561, - 39281, 23453, 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, - 24754, 21329, 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, - 24811, 28953, 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, - 27893, 36454, 36856, 36924, 40763, 27604, 37145, 31508, 24444, 30887, - 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, - 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, - 36140, 25153, 20415, 21464, 21342, 36776, 36777, 36779, 36941, 26631, - 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, - 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, - 30557, 30558, 30559, 30560, 30564, 30567, 30569, 30570, 30573, 30574, - 30575, 30576, 30577, 30578, 30579, 30580, 30581, 30582, 30583, 30584, - 30586, 30587, 30588, 30593, 30594, 30595, 30598, 30599, 30600, 30601, - 30602, 30603, 30607, 30608, 30611, 30612, 30613, 30614, 30615, 30616, - 30617, 30618, 30619, 30620, 30621, 30622, 30625, 30627, 30628, 30630, - 30632, 30635, 30637, 30638, 30639, 30641, 30642, 30644, 30646, 30647, - 30648, 30649, 30650, 30652, 30654, 30656, 30657, 30658, 30659, 30660, - 30661, 30662, 30663, 30664, 30665, 30666, 30667, 30668, 30670, 30671, - 30672, 30673, 30674, 30675, 30676, 30677, 30678, 30680, 30681, 30682, - 30685, 30686, 30687, 30688, 30689, 30692, 30149, 24182, 29627, 33760, - 25773, 25320, 38069, 27874, 21338, 21187, 25615, 38082, 31636, 20271, - 24091, 33334, 33046, 33162, 28196, 27850, 39539, 25429, 21340, 21754, - 34917, 22496, 19981, 24067, 27493, 31807, 37096, 24598, 25830, 29468, - 35009, 26448, 25165, 36130, 30572, 36393, 37319, 24425, 33756, 34081, - 39184, 21442, 34453, 27531, 24813, 24808, 28799, 33485, 33329, 20179, - 27815, 34255, 25805, 31961, 27133, 26361, 33609, 21397, 31574, 20391, - 20876, 27979, 23618, 36461, 25554, 21449, 33580, 33590, 26597, 30900, - 25661, 23519, 23700, 24046, 35815, 25286, 26612, 35962, 25600, 25530, - 34633, 39307, 35863, 32544, 38130, 20135, 38416, 39076, 26124, 29462, - 30694, 30696, 30698, 30703, 30704, 30705, 30706, 30708, 30709, 30711, - 30713, 30714, 30715, 30716, 30723, 30724, 30725, 30726, 30727, 30728, - 30730, 30731, 30734, 30735, 30736, 30739, 30741, 30745, 30747, 30750, - 30752, 30753, 30754, 30756, 30760, 30762, 30763, 30766, 30767, 30769, - 30770, 30771, 30773, 30774, 30781, 30783, 30785, 30786, 30787, 30788, - 30790, 30792, 30793, 30794, 30795, 30797, 30799, 30801, 30803, 30804, - 30808, 30809, 30810, 30811, 30812, 30814, 30815, 30816, 30817, 30818, - 30819, 30820, 30821, 30822, 30823, 30824, 30825, 30831, 30832, 30833, - 30834, 30835, 30836, 30837, 30838, 30840, 30841, 30842, 30843, 30845, - 30846, 30847, 30848, 30849, 30850, 30851, 22330, 23581, 24120, 38271, - 20607, 32928, 21378, 25950, 30021, 21809, 20513, 36229, 25220, 38046, - 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, - 24443, 28552, 37108, 33251, 36784, 23576, 26216, 24561, 27785, 38472, - 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, 20056, 31243, - 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, 30196, 25345, - 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, 23610, 36196, - 32709, 26021, 28861, 20805, 20914, 34411, 23815, 23456, 25277, 37228, - 30068, 36364, 31264, 24833, 31609, 20167, 32504, 30597, 19985, 33261, - 21021, 20986, 27249, 21416, 36487, 38148, 38607, 28353, 38500, 26970, - 30852, 30853, 30854, 30856, 30858, 30859, 30863, 30864, 30866, 30868, - 30869, 30870, 30873, 30877, 30878, 30880, 30882, 30884, 30886, 30888, - 30889, 30890, 30891, 30892, 30893, 30894, 30895, 30901, 30902, 30903, - 30904, 30906, 30907, 30908, 30909, 30911, 30912, 30914, 30915, 30916, - 30918, 30919, 30920, 30924, 30925, 30926, 30927, 30929, 30930, 30931, - 30934, 30935, 30936, 30938, 30939, 30940, 30941, 30942, 30943, 30944, - 30945, 30946, 30947, 30948, 30949, 30950, 30951, 30953, 30954, 30955, - 30957, 30958, 30959, 30960, 30961, 30963, 30965, 30966, 30968, 30969, - 30971, 30972, 30973, 30974, 30975, 30976, 30978, 30979, 30980, 30982, - 30983, 30984, 30985, 30986, 30987, 30988, 30784, 20648, 30679, 25616, - 35302, 22788, 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, - 30126, 31383, 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, - 22402, 26149, 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, - 30133, 33576, 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, - 36176, 27425, 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, - 37259, 31751, 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, - 30209, 31929, 28140, 32736, 26449, 23384, 23544, 30923, 25774, 25619, - 25514, 25387, 38169, 25645, 36798, 31572, 30249, 25171, 22823, 21574, - 27513, 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, 36910, - 30989, 30990, 30991, 30992, 30993, 30994, 30996, 30997, 30998, 30999, - 31000, 31001, 31002, 31003, 31004, 31005, 31007, 31008, 31009, 31010, - 31011, 31013, 31014, 31015, 31016, 31017, 31018, 31019, 31020, 31021, - 31022, 31023, 31024, 31025, 31026, 31027, 31029, 31030, 31031, 31032, - 31033, 31037, 31039, 31042, 31043, 31044, 31045, 31047, 31050, 31051, - 31052, 31053, 31054, 31055, 31056, 31057, 31058, 31060, 31061, 31064, - 31065, 31073, 31075, 31076, 31078, 31081, 31082, 31083, 31084, 31086, - 31088, 31089, 31090, 31091, 31092, 31093, 31094, 31097, 31099, 31100, - 31101, 31102, 31103, 31106, 31107, 31110, 31111, 31112, 31113, 31115, - 31116, 31117, 31118, 31120, 31121, 31122, 24608, 32829, 25285, 20025, - 21333, 37112, 25528, 32966, 26086, 27694, 20294, 24814, 28129, 35806, - 24377, 34507, 24403, 25377, 20826, 33633, 26723, 20992, 25443, 36424, - 20498, 23707, 31095, 23548, 21040, 31291, 24764, 36947, 30423, 24503, - 24471, 30340, 36460, 28783, 30331, 31561, 30634, 20979, 37011, 22564, - 20302, 28404, 36842, 25932, 31515, 29380, 28068, 32735, 23265, 25269, - 24213, 22320, 33922, 31532, 24093, 24351, 36882, 32532, 39072, 25474, - 28359, 30872, 28857, 20856, 38747, 22443, 30005, 20291, 30008, 24215, - 24806, 22880, 28096, 27583, 30857, 21500, 38613, 20939, 20993, 25481, - 21514, 38035, 35843, 36300, 29241, 30879, 34678, 36845, 35853, 21472, - 31123, 31124, 31125, 31126, 31127, 31128, 31129, 31131, 31132, 31133, - 31134, 31135, 31136, 31137, 31138, 31139, 31140, 31141, 31142, 31144, - 31145, 31146, 31147, 31148, 31149, 31150, 31151, 31152, 31153, 31154, - 31156, 31157, 31158, 31159, 31160, 31164, 31167, 31170, 31172, 31173, - 31175, 31176, 31178, 31180, 31182, 31183, 31184, 31187, 31188, 31190, - 31191, 31193, 31194, 31195, 31196, 31197, 31198, 31200, 31201, 31202, - 31205, 31208, 31210, 31212, 31214, 31217, 31218, 31219, 31220, 31221, - 31222, 31223, 31225, 31226, 31228, 31230, 31231, 31233, 31236, 31237, - 31239, 31240, 31241, 31242, 31244, 31247, 31248, 31249, 31250, 31251, - 31253, 31254, 31256, 31257, 31259, 31260, 19969, 30447, 21486, 38025, - 39030, 40718, 38189, 23450, 35746, 20002, 19996, 20908, 33891, 25026, - 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, 26007, 38497, - 35910, 36887, 30168, 37117, 30563, 27602, 29322, 29420, 35835, 22581, - 30585, 36172, 26460, 38208, 32922, 24230, 28193, 22930, 31471, 30701, - 38203, 27573, 26029, 32526, 22534, 20817, 38431, 23545, 22697, 21544, - 36466, 25958, 39039, 22244, 38045, 30462, 36929, 25479, 21702, 22810, - 22842, 22427, 36530, 26421, 36346, 33333, 21057, 24816, 22549, 34558, - 23784, 40517, 20420, 39069, 35769, 23077, 24694, 21380, 25212, 36943, - 37122, 39295, 24681, 32780, 20799, 32819, 23572, 39285, 27953, 20108, - 31261, 31263, 31265, 31266, 31268, 31269, 31270, 31271, 31272, 31273, - 31274, 31275, 31276, 31277, 31278, 31279, 31280, 31281, 31282, 31284, - 31285, 31286, 31288, 31290, 31294, 31296, 31297, 31298, 31299, 31300, - 31301, 31303, 31304, 31305, 31306, 31307, 31308, 31309, 31310, 31311, - 31312, 31314, 31315, 31316, 31317, 31318, 31320, 31321, 31322, 31323, - 31324, 31325, 31326, 31327, 31328, 31329, 31330, 31331, 31332, 31333, - 31334, 31335, 31336, 31337, 31338, 31339, 31340, 31341, 31342, 31343, - 31345, 31346, 31347, 31349, 31355, 31356, 31357, 31358, 31362, 31365, - 31367, 31369, 31370, 31371, 31372, 31374, 31375, 31376, 31379, 31380, - 31385, 31386, 31387, 31390, 31393, 31394, 36144, 21457, 32602, 31567, - 20240, 20047, 38400, 27861, 29648, 34281, 24070, 30058, 32763, 27146, - 30718, 38034, 32321, 20961, 28902, 21453, 36820, 33539, 36137, 29359, - 39277, 27867, 22346, 33459, 26041, 32938, 25151, 38450, 22952, 20223, - 35775, 32442, 25918, 33778, 38750, 21857, 39134, 32933, 21290, 35837, - 21536, 32954, 24223, 27832, 36153, 33452, 37210, 21545, 27675, 20998, - 32439, 22367, 28954, 27774, 31881, 22859, 20221, 24575, 24868, 31914, - 20016, 23553, 26539, 34562, 23792, 38155, 39118, 30127, 28925, 36898, - 20911, 32541, 35773, 22857, 20964, 20315, 21542, 22827, 25975, 32932, - 23413, 25206, 25282, 36752, 24133, 27679, 31526, 20239, 20440, 26381, - 31395, 31396, 31399, 31401, 31402, 31403, 31406, 31407, 31408, 31409, - 31410, 31412, 31413, 31414, 31415, 31416, 31417, 31418, 31419, 31420, - 31421, 31422, 31424, 31425, 31426, 31427, 31428, 31429, 31430, 31431, - 31432, 31433, 31434, 31436, 31437, 31438, 31439, 31440, 31441, 31442, - 31443, 31444, 31445, 31447, 31448, 31450, 31451, 31452, 31453, 31457, - 31458, 31460, 31463, 31464, 31465, 31466, 31467, 31468, 31470, 31472, - 31473, 31474, 31475, 31476, 31477, 31478, 31479, 31480, 31483, 31484, - 31486, 31488, 31489, 31490, 31493, 31495, 31497, 31500, 31501, 31502, - 31504, 31506, 31507, 31510, 31511, 31512, 31514, 31516, 31517, 31519, - 31521, 31522, 31523, 31527, 31529, 31533, 28014, 28074, 31119, 34993, - 24343, 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, - 33104, 36212, 21103, 35206, 36171, 22797, 20613, 20184, 38428, 29238, - 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, 22134, 22030, - 35813, 25913, 27010, 38041, 30422, 28297, 24178, 29976, 26438, 26577, - 31487, 32925, 36214, 24863, 31174, 25954, 36195, 20872, 21018, 38050, - 32568, 32923, 32434, 23703, 28207, 26464, 31705, 30347, 39640, 33167, - 32660, 31957, 25630, 38224, 31295, 21578, 21733, 27468, 25601, 25096, - 40509, 33011, 30105, 21106, 38761, 33883, 26684, 34532, 38401, 38548, - 38124, 20010, 21508, 32473, 26681, 36319, 32789, 26356, 24218, 32697, - 31535, 31536, 31538, 31540, 31541, 31542, 31543, 31545, 31547, 31549, - 31551, 31552, 31553, 31554, 31555, 31556, 31558, 31560, 31562, 31565, - 31566, 31571, 31573, 31575, 31577, 31580, 31582, 31583, 31585, 31587, - 31588, 31589, 31590, 31591, 31592, 31593, 31594, 31595, 31596, 31597, - 31599, 31600, 31603, 31604, 31606, 31608, 31610, 31612, 31613, 31615, - 31617, 31618, 31619, 31620, 31622, 31623, 31624, 31625, 31626, 31627, - 31628, 31630, 31631, 31633, 31634, 31635, 31638, 31640, 31641, 31642, - 31643, 31646, 31647, 31648, 31651, 31652, 31653, 31662, 31663, 31664, - 31666, 31667, 31669, 31670, 31671, 31673, 31674, 31675, 31676, 31677, - 31678, 31679, 31680, 31682, 31683, 31684, 22466, 32831, 26775, 24037, - 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, 24339, 24041, - 27742, 25329, 36129, 20849, 38057, 21246, 27807, 33503, 29399, 22434, - 26500, 36141, 22815, 36764, 33735, 21653, 31629, 20272, 27837, 23396, - 22993, 40723, 21476, 34506, 39592, 35895, 32929, 25925, 39038, 22266, - 38599, 21038, 29916, 21072, 23521, 25346, 35074, 20054, 25296, 24618, - 26874, 20851, 23448, 20896, 35266, 31649, 39302, 32592, 24815, 28748, - 36143, 20809, 24191, 36891, 29808, 35268, 22317, 30789, 24402, 40863, - 38394, 36712, 39740, 35809, 30328, 26690, 26588, 36330, 36149, 21053, - 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, - 31685, 31688, 31689, 31690, 31691, 31693, 31694, 31695, 31696, 31698, - 31700, 31701, 31702, 31703, 31704, 31707, 31708, 31710, 31711, 31712, - 31714, 31715, 31716, 31719, 31720, 31721, 31723, 31724, 31725, 31727, - 31728, 31730, 31731, 31732, 31733, 31734, 31736, 31737, 31738, 31739, - 31741, 31743, 31744, 31745, 31746, 31747, 31748, 31749, 31750, 31752, - 31753, 31754, 31757, 31758, 31760, 31761, 31762, 31763, 31764, 31765, - 31767, 31768, 31769, 31770, 31771, 31772, 31773, 31774, 31776, 31777, - 31778, 31779, 31780, 31781, 31784, 31785, 31787, 31788, 31789, 31790, - 31791, 31792, 31793, 31794, 31795, 31796, 31797, 31798, 31799, 31801, - 31802, 31803, 31804, 31805, 31806, 31810, 39608, 23401, 28023, 27686, - 20133, 23475, 39559, 37219, 25000, 37039, 38889, 21547, 28085, 23506, - 20989, 21898, 32597, 32752, 25788, 25421, 26097, 25022, 24717, 28938, - 27735, 27721, 22831, 26477, 33322, 22741, 22158, 35946, 27627, 37085, - 22909, 32791, 21495, 28009, 21621, 21917, 33655, 33743, 26680, 31166, - 21644, 20309, 21512, 30418, 35977, 38402, 27827, 28088, 36203, 35088, - 40548, 36154, 22079, 40657, 30165, 24456, 29408, 24680, 21756, 20136, - 27178, 34913, 24658, 36720, 21700, 28888, 34425, 40511, 27946, 23439, - 24344, 32418, 21897, 20399, 29492, 21564, 21402, 20505, 21518, 21628, - 20046, 24573, 29786, 22774, 33899, 32993, 34676, 29392, 31946, 28246, - 31811, 31812, 31813, 31814, 31815, 31816, 31817, 31818, 31819, 31820, - 31822, 31823, 31824, 31825, 31826, 31827, 31828, 31829, 31830, 31831, - 31832, 31833, 31834, 31835, 31836, 31837, 31838, 31839, 31840, 31841, - 31842, 31843, 31844, 31845, 31846, 31847, 31848, 31849, 31850, 31851, - 31852, 31853, 31854, 31855, 31856, 31857, 31858, 31861, 31862, 31863, - 31864, 31865, 31866, 31870, 31871, 31872, 31873, 31874, 31875, 31876, - 31877, 31878, 31879, 31880, 31882, 31883, 31884, 31885, 31886, 31887, - 31888, 31891, 31892, 31894, 31897, 31898, 31899, 31904, 31905, 31907, - 31910, 31911, 31912, 31913, 31915, 31916, 31917, 31919, 31920, 31924, - 31925, 31926, 31927, 31928, 31930, 31931, 24359, 34382, 21804, 25252, - 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, - 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, - 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, - 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, - 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, - 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, - 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, - 27985, 28151, 35905, 27963, 20249, 28779, 33719, 25110, 24785, 38669, - 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, 31637, - 31935, 31936, 31938, 31939, 31940, 31942, 31945, 31947, 31950, 31951, - 31952, 31953, 31954, 31955, 31956, 31960, 31962, 31963, 31965, 31966, - 31969, 31970, 31971, 31972, 31973, 31974, 31975, 31977, 31978, 31979, - 31980, 31981, 31982, 31984, 31985, 31986, 31987, 31988, 31989, 31990, - 31991, 31993, 31994, 31996, 31997, 31998, 31999, 32000, 32001, 32002, - 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32011, 32012, 32013, - 32014, 32015, 32016, 32017, 32018, 32019, 32020, 32021, 32022, 32023, - 32024, 32025, 32026, 32027, 32028, 32029, 32030, 32031, 32033, 32035, - 32036, 32037, 32038, 32040, 32041, 32042, 32044, 32045, 32046, 32048, - 32049, 32050, 32051, 32052, 32053, 32054, 32908, 39269, 36857, 28608, - 35749, 40481, 23020, 32489, 32521, 21513, 26497, 26840, 36753, 31821, - 38598, 21450, 24613, 30142, 27762, 21363, 23241, 32423, 25380, 20960, - 33034, 24049, 34015, 25216, 20864, 23395, 20238, 31085, 21058, 24760, - 27982, 23492, 23490, 35745, 35760, 26082, 24524, 38469, 22931, 32487, - 32426, 22025, 26551, 22841, 20339, 23478, 21152, 33626, 39050, 36158, - 30002, 38078, 20551, 31292, 20215, 26550, 39550, 23233, 27516, 30417, - 22362, 23574, 31546, 38388, 29006, 20860, 32937, 33392, 22904, 32516, - 33575, 26816, 26604, 30897, 30839, 25315, 25441, 31616, 20461, 21098, - 20943, 33616, 27099, 37492, 36341, 36145, 35265, 38190, 31661, 20214, - 32055, 32056, 32057, 32058, 32059, 32060, 32061, 32062, 32063, 32064, - 32065, 32066, 32067, 32068, 32069, 32070, 32071, 32072, 32073, 32074, - 32075, 32076, 32077, 32078, 32079, 32080, 32081, 32082, 32083, 32084, - 32085, 32086, 32087, 32088, 32089, 32090, 32091, 32092, 32093, 32094, - 32095, 32096, 32097, 32098, 32099, 32100, 32101, 32102, 32103, 32104, - 32105, 32106, 32107, 32108, 32109, 32111, 32112, 32113, 32114, 32115, - 32116, 32117, 32118, 32120, 32121, 32122, 32123, 32124, 32125, 32126, - 32127, 32128, 32129, 32130, 32131, 32132, 32133, 32134, 32135, 32136, - 32137, 32138, 32139, 32140, 32141, 32142, 32143, 32144, 32145, 32146, - 32147, 32148, 32149, 32150, 32151, 32152, 20581, 33328, 21073, 39279, - 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, 30086, - 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, 30977, - 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, 38128, - 30699, 20389, 33050, 29409, 35282, 39290, 32564, 32478, 21119, 25945, - 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, 31224, 34903, - 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, 31469, 27905, - 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, 20171, 30117, - 35819, 23626, 24062, 31563, 26020, 37329, 20170, 27941, 35167, 32039, - 38182, 20165, 35880, 36827, 38771, 26187, 31105, 36817, 28908, 28024, - 32153, 32154, 32155, 32156, 32157, 32158, 32159, 32160, 32161, 32162, - 32163, 32164, 32165, 32167, 32168, 32169, 32170, 32171, 32172, 32173, - 32175, 32176, 32177, 32178, 32179, 32180, 32181, 32182, 32183, 32184, - 32185, 32186, 32187, 32188, 32189, 32190, 32191, 32192, 32193, 32194, - 32195, 32196, 32197, 32198, 32199, 32200, 32201, 32202, 32203, 32204, - 32205, 32206, 32207, 32208, 32209, 32210, 32211, 32212, 32213, 32214, - 32215, 32216, 32217, 32218, 32219, 32220, 32221, 32222, 32223, 32224, - 32225, 32226, 32227, 32228, 32229, 32230, 32231, 32232, 32233, 32234, - 32235, 32236, 32237, 32238, 32239, 32240, 32241, 32242, 32243, 32244, - 32245, 32246, 32247, 32248, 32249, 32250, 23613, 21170, 33606, 20834, - 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, - 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, - 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, 38893, - 20037, 28792, 20061, 37202, 21417, 25937, 26087, 33276, 33285, 21646, - 23601, 30106, 38816, 25304, 29401, 30141, 23621, 39545, 33738, 23616, - 21632, 30697, 20030, 27822, 32858, 25298, 25454, 24040, 20855, 36317, - 36382, 38191, 20465, 21477, 24807, 28844, 21095, 25424, 40515, 23071, - 20518, 30519, 21367, 32482, 25733, 25899, 25225, 25496, 20500, 29237, - 35273, 20915, 35776, 32477, 22343, 33740, 38055, 20891, 21531, 23803, - 32251, 32252, 32253, 32254, 32255, 32256, 32257, 32258, 32259, 32260, - 32261, 32262, 32263, 32264, 32265, 32266, 32267, 32268, 32269, 32270, - 32271, 32272, 32273, 32274, 32275, 32276, 32277, 32278, 32279, 32280, - 32281, 32282, 32283, 32284, 32285, 32286, 32287, 32288, 32289, 32290, - 32291, 32292, 32293, 32294, 32295, 32296, 32297, 32298, 32299, 32300, - 32301, 32302, 32303, 32304, 32305, 32306, 32307, 32308, 32309, 32310, - 32311, 32312, 32313, 32314, 32316, 32317, 32318, 32319, 32320, 32322, - 32323, 32324, 32325, 32326, 32328, 32329, 32330, 32331, 32332, 32333, - 32334, 32335, 32336, 32337, 32338, 32339, 32340, 32341, 32342, 32343, - 32344, 32345, 32346, 32347, 32348, 32349, 20426, 31459, 27994, 37089, - 39567, 21888, 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, - 21002, 22570, 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, - 25239, 20130, 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, - 26869, 30933, 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, - 23458, 35838, 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, - 23380, 25511, 25248, 21475, 25187, 23495, 26543, 21741, 31391, 33510, - 37239, 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, - 20393, 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, - 26103, 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, - 32350, 32351, 32352, 32353, 32354, 32355, 32356, 32357, 32358, 32359, - 32360, 32361, 32362, 32363, 32364, 32365, 32366, 32367, 32368, 32369, - 32370, 32371, 32372, 32373, 32374, 32375, 32376, 32377, 32378, 32379, - 32380, 32381, 32382, 32383, 32384, 32385, 32387, 32388, 32389, 32390, - 32391, 32392, 32393, 32394, 32395, 32396, 32397, 32398, 32399, 32400, - 32401, 32402, 32403, 32404, 32405, 32406, 32407, 32408, 32409, 32410, - 32412, 32413, 32414, 32430, 32436, 32443, 32444, 32470, 32484, 32492, - 32505, 32522, 32528, 32542, 32567, 32569, 32571, 32572, 32573, 32574, - 32575, 32576, 32577, 32579, 32582, 32583, 32584, 32585, 32586, 32587, - 32588, 32589, 32590, 32591, 32594, 32595, 39304, 24871, 28291, 22372, - 26118, 25414, 22256, 25324, 25193, 24275, 38420, 22403, 25289, 21895, - 34593, 33098, 36771, 21862, 33713, 26469, 36182, 34013, 23146, 26639, - 25318, 31726, 38417, 20848, 28572, 35888, 25597, 35272, 25042, 32518, - 28866, 28389, 29701, 27028, 29436, 24266, 37070, 26391, 28010, 25438, - 21171, 29282, 32769, 20332, 23013, 37226, 28889, 28061, 21202, 20048, - 38647, 38253, 34174, 30922, 32047, 20769, 22418, 25794, 32907, 31867, - 27882, 26865, 26974, 20919, 21400, 26792, 29313, 40654, 31729, 29432, - 31163, 28435, 29702, 26446, 37324, 40100, 31036, 33673, 33620, 21519, - 26647, 20029, 21385, 21169, 30782, 21382, 21033, 20616, 20363, 20432, - 32598, 32601, 32603, 32604, 32605, 32606, 32608, 32611, 32612, 32613, - 32614, 32615, 32619, 32620, 32621, 32623, 32624, 32627, 32629, 32630, - 32631, 32632, 32634, 32635, 32636, 32637, 32639, 32640, 32642, 32643, - 32644, 32645, 32646, 32647, 32648, 32649, 32651, 32653, 32655, 32656, - 32657, 32658, 32659, 32661, 32662, 32663, 32664, 32665, 32667, 32668, - 32672, 32674, 32675, 32677, 32678, 32680, 32681, 32682, 32683, 32684, - 32685, 32686, 32689, 32691, 32692, 32693, 32694, 32695, 32698, 32699, - 32702, 32704, 32706, 32707, 32708, 32710, 32711, 32712, 32713, 32715, - 32717, 32719, 32720, 32721, 32722, 32723, 32726, 32727, 32729, 32730, - 32731, 32732, 32733, 32734, 32738, 32739, 30178, 31435, 31890, 27813, - 38582, 21147, 29827, 21737, 20457, 32852, 33714, 36830, 38256, 24265, - 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, 32451, 31918, - 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, 20142, 35845, - 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, 20102, 25730, - 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, 29747, 26519, - 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, 21533, 25294, - 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, 28789, 38517, - 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, 39311, 30041, - 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, 31548, 31423, - 32740, 32743, 32744, 32746, 32747, 32748, 32749, 32751, 32754, 32756, - 32757, 32758, 32759, 32760, 32761, 32762, 32765, 32766, 32767, 32770, - 32775, 32776, 32777, 32778, 32782, 32783, 32785, 32787, 32794, 32795, - 32797, 32798, 32799, 32801, 32803, 32804, 32811, 32812, 32813, 32814, - 32815, 32816, 32818, 32820, 32825, 32826, 32828, 32830, 32832, 32833, - 32836, 32837, 32839, 32840, 32841, 32846, 32847, 32848, 32849, 32851, - 32853, 32854, 32855, 32857, 32859, 32860, 32861, 32862, 32863, 32864, - 32865, 32866, 32867, 32868, 32869, 32870, 32871, 32872, 32875, 32876, - 32877, 32878, 32879, 32880, 32882, 32883, 32884, 32885, 32886, 32887, - 32888, 32889, 32890, 32891, 32892, 32893, 38534, 22404, 25314, 38471, - 27004, 23044, 25602, 31699, 28431, 38475, 33446, 21346, 39045, 24208, - 28809, 25523, 21348, 34383, 40065, 40595, 30860, 38706, 36335, 36162, - 40575, 28510, 31108, 24405, 38470, 25134, 39540, 21525, 38109, 20387, - 26053, 23653, 23649, 32533, 34385, 27695, 24459, 29575, 28388, 32511, - 23782, 25371, 23402, 28390, 21365, 20081, 25504, 30053, 25249, 36718, - 20262, 20177, 27814, 32438, 35770, 33821, 34746, 32599, 36923, 38179, - 31657, 39585, 35064, 33853, 27931, 39558, 32476, 22920, 40635, 29595, - 30721, 34434, 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, - 36808, 33033, 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, - 32894, 32897, 32898, 32901, 32904, 32906, 32909, 32910, 32911, 32912, - 32913, 32914, 32916, 32917, 32919, 32921, 32926, 32931, 32934, 32935, - 32936, 32940, 32944, 32947, 32949, 32950, 32952, 32953, 32955, 32965, - 32967, 32968, 32969, 32970, 32971, 32975, 32976, 32977, 32978, 32979, - 32980, 32981, 32984, 32991, 32992, 32994, 32995, 32998, 33006, 33013, - 33015, 33017, 33019, 33022, 33023, 33024, 33025, 33027, 33028, 33029, - 33031, 33032, 33035, 33036, 33045, 33047, 33049, 33051, 33052, 33053, - 33055, 33056, 33057, 33058, 33059, 33060, 33061, 33062, 33063, 33064, - 33065, 33066, 33067, 33069, 33070, 33072, 33075, 33076, 33077, 33079, - 33081, 33082, 33083, 33084, 33085, 33087, 35881, 33426, 33579, 30450, - 27667, 24537, 33725, 29483, 33541, 38170, 27611, 30683, 38086, 21359, - 33538, 20882, 24125, 35980, 36152, 20040, 29611, 26522, 26757, 37238, - 38665, 29028, 27809, 30473, 23186, 38209, 27599, 32654, 26151, 23504, - 22969, 23194, 38376, 38391, 20204, 33804, 33945, 27308, 30431, 38192, - 29467, 26790, 23391, 30511, 37274, 38753, 31964, 36855, 35868, 24357, - 31859, 31192, 35269, 27852, 34588, 23494, 24130, 26825, 30496, 32501, - 20885, 20813, 21193, 23081, 32517, 38754, 33495, 25551, 30596, 34256, - 31186, 28218, 24217, 22937, 34065, 28781, 27665, 25279, 30399, 25935, - 24751, 38397, 26126, 34719, 40483, 38125, 21517, 21629, 35884, 25720, - 33088, 33089, 33090, 33091, 33092, 33093, 33095, 33097, 33101, 33102, - 33103, 33106, 33110, 33111, 33112, 33115, 33116, 33117, 33118, 33119, - 33121, 33122, 33123, 33124, 33126, 33128, 33130, 33131, 33132, 33135, - 33138, 33139, 33141, 33142, 33143, 33144, 33153, 33155, 33156, 33157, - 33158, 33159, 33161, 33163, 33164, 33165, 33166, 33168, 33170, 33171, - 33172, 33173, 33174, 33175, 33177, 33178, 33182, 33183, 33184, 33185, - 33186, 33188, 33189, 33191, 33193, 33195, 33196, 33197, 33198, 33199, - 33200, 33201, 33202, 33204, 33205, 33206, 33207, 33208, 33209, 33212, - 33213, 33214, 33215, 33220, 33221, 33223, 33224, 33225, 33227, 33229, - 33230, 33231, 33232, 33233, 33234, 33235, 25721, 34321, 27169, 33180, - 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, 28448, - 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, 27597, - 22675, 26286, 24149, 21215, 24917, 26408, 30446, 30566, 29287, 31302, - 25343, 21738, 21584, 38048, 37027, 23068, 32435, 27670, 20035, 22902, - 32784, 22856, 21335, 30007, 38590, 22218, 25376, 33041, 24700, 38393, - 28118, 21602, 39297, 20869, 23273, 33021, 22958, 38675, 20522, 27877, - 23612, 25311, 20320, 21311, 33147, 36870, 28346, 34091, 25288, 24180, - 30910, 25781, 25467, 24565, 23064, 37247, 40479, 23615, 25423, 32834, - 23421, 21870, 38218, 38221, 28037, 24744, 26592, 29406, 20957, 23425, - 33236, 33237, 33238, 33239, 33240, 33241, 33242, 33243, 33244, 33245, - 33246, 33247, 33248, 33249, 33250, 33252, 33253, 33254, 33256, 33257, - 33259, 33262, 33263, 33264, 33265, 33266, 33269, 33270, 33271, 33272, - 33273, 33274, 33277, 33279, 33283, 33287, 33288, 33289, 33290, 33291, - 33294, 33295, 33297, 33299, 33301, 33302, 33303, 33304, 33305, 33306, - 33309, 33312, 33316, 33317, 33318, 33319, 33321, 33326, 33330, 33338, - 33340, 33341, 33343, 33344, 33345, 33346, 33347, 33349, 33350, 33352, - 33354, 33356, 33357, 33358, 33360, 33361, 33362, 33363, 33364, 33365, - 33366, 33367, 33369, 33371, 33372, 33373, 33374, 33376, 33377, 33378, - 33379, 33380, 33381, 33382, 33383, 33385, 25319, 27870, 29275, 25197, - 38062, 32445, 33043, 27987, 20892, 24324, 22900, 21162, 24594, 22899, - 26262, 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, - 27572, 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, - 29750, 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, - 30928, 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, - 25243, 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, - 35060, 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, - 28921, 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, - 25447, 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, - 33386, 33387, 33388, 33389, 33393, 33397, 33398, 33399, 33400, 33403, - 33404, 33408, 33409, 33411, 33413, 33414, 33415, 33417, 33420, 33424, - 33427, 33428, 33429, 33430, 33434, 33435, 33438, 33440, 33442, 33443, - 33447, 33458, 33461, 33462, 33466, 33467, 33468, 33471, 33472, 33474, - 33475, 33477, 33478, 33481, 33488, 33494, 33497, 33498, 33501, 33506, - 33511, 33512, 33513, 33514, 33516, 33517, 33518, 33520, 33522, 33523, - 33525, 33526, 33528, 33530, 33532, 33533, 33534, 33535, 33536, 33546, - 33547, 33549, 33552, 33554, 33555, 33558, 33560, 33561, 33565, 33566, - 33567, 33568, 33569, 33570, 33571, 33572, 33573, 33574, 33577, 33578, - 33582, 33584, 33586, 33591, 33595, 33597, 21860, 33086, 30130, 30382, - 21305, 30174, 20731, 23617, 35692, 31687, 20559, 29255, 39575, 39128, - 28418, 29922, 31080, 25735, 30629, 25340, 39057, 36139, 21697, 32856, - 20050, 22378, 33529, 33805, 24179, 20973, 29942, 35780, 23631, 22369, - 27900, 39047, 23110, 30772, 39748, 36843, 31893, 21078, 25169, 38138, - 20166, 33670, 33889, 33769, 33970, 22484, 26420, 22275, 26222, 28006, - 35889, 26333, 28689, 26399, 27450, 26646, 25114, 22971, 19971, 20932, - 28422, 26578, 27791, 20854, 26827, 22855, 27495, 30054, 23822, 33040, - 40784, 26071, 31048, 31041, 39569, 36215, 23682, 20062, 20225, 21551, - 22865, 30732, 22120, 27668, 36804, 24323, 27773, 27875, 35755, 25488, - 33598, 33599, 33601, 33602, 33604, 33605, 33608, 33610, 33611, 33612, - 33613, 33614, 33619, 33621, 33622, 33623, 33624, 33625, 33629, 33634, - 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33657, 33658, 33662, - 33663, 33664, 33665, 33666, 33667, 33668, 33671, 33672, 33674, 33675, - 33676, 33677, 33679, 33680, 33681, 33684, 33685, 33686, 33687, 33689, - 33690, 33693, 33695, 33697, 33698, 33699, 33700, 33701, 33702, 33703, - 33708, 33709, 33710, 33711, 33717, 33723, 33726, 33727, 33730, 33731, - 33732, 33734, 33736, 33737, 33739, 33741, 33742, 33744, 33745, 33746, - 33747, 33749, 33751, 33753, 33754, 33755, 33758, 33762, 33763, 33764, - 33766, 33767, 33768, 33771, 33772, 33773, 24688, 27965, 29301, 25190, - 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, - 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, 27424, 27465, - 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, 38201, - 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, 32728, - 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, 20405, - 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, 38738, - 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, 39031, - 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, 22234, - 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, 28192, - 33774, 33775, 33779, 33780, 33781, 33782, 33783, 33786, 33787, 33788, - 33790, 33791, 33792, 33794, 33797, 33799, 33800, 33801, 33802, 33808, - 33810, 33811, 33812, 33813, 33814, 33815, 33817, 33818, 33819, 33822, - 33823, 33824, 33825, 33826, 33827, 33833, 33834, 33835, 33836, 33837, - 33838, 33839, 33840, 33842, 33843, 33844, 33845, 33846, 33847, 33849, - 33850, 33851, 33854, 33855, 33856, 33857, 33858, 33859, 33860, 33861, - 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872, - 33874, 33875, 33876, 33877, 33878, 33880, 33885, 33886, 33887, 33888, - 33890, 33892, 33893, 33894, 33895, 33896, 33898, 33902, 33903, 33904, - 33906, 33908, 33911, 33913, 33915, 33916, 21462, 23094, 40843, 36259, - 21435, 22280, 39079, 26435, 37275, 27849, 20840, 30154, 25331, 29356, - 21048, 21149, 32570, 28820, 30264, 21364, 40522, 27063, 30830, 38592, - 35033, 32676, 28982, 29123, 20873, 26579, 29924, 22756, 25880, 22199, - 35753, 39286, 25200, 32469, 24825, 28909, 22764, 20161, 20154, 24525, - 38887, 20219, 35748, 20995, 22922, 32427, 25172, 20173, 26085, 25102, - 33592, 33993, 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, - 26580, 32905, 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, - 20837, 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, 33509, - 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, 21441, - 33917, 33918, 33919, 33920, 33921, 33923, 33924, 33925, 33926, 33930, - 33933, 33935, 33936, 33937, 33938, 33939, 33940, 33941, 33942, 33944, - 33946, 33947, 33949, 33950, 33951, 33952, 33954, 33955, 33956, 33957, - 33958, 33959, 33960, 33961, 33962, 33963, 33964, 33965, 33966, 33968, - 33969, 33971, 33973, 33974, 33975, 33979, 33980, 33982, 33984, 33986, - 33987, 33989, 33990, 33991, 33992, 33995, 33996, 33998, 33999, 34002, - 34004, 34005, 34007, 34008, 34009, 34010, 34011, 34012, 34014, 34017, - 34018, 34020, 34023, 34024, 34025, 34026, 34027, 34029, 34030, 34031, - 34033, 34034, 34035, 34036, 34037, 34038, 34039, 34040, 34041, 34042, - 34043, 34045, 34046, 34048, 34049, 34050, 20254, 25955, 26705, 21971, - 20007, 25620, 39578, 25195, 23234, 29791, 33394, 28073, 26862, 20711, - 33678, 30722, 26432, 21049, 27801, 32433, 20667, 21861, 29022, 31579, - 26194, 29642, 33515, 26441, 23665, 21024, 29053, 34923, 38378, 38485, - 25797, 36193, 33203, 21892, 27733, 25159, 32558, 22674, 20260, 21830, - 36175, 26188, 19978, 23578, 35059, 26786, 25422, 31245, 28903, 33421, - 21242, 38902, 23569, 21736, 37045, 32461, 22882, 36170, 34503, 33292, - 33293, 36198, 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, - 21627, 20280, 36523, 28145, 23072, 32453, 31070, 27784, 23457, 23158, - 29978, 32958, 24910, 28183, 22768, 29983, 29989, 29298, 21319, 32499, - 34051, 34052, 34053, 34054, 34055, 34056, 34057, 34058, 34059, 34061, - 34062, 34063, 34064, 34066, 34068, 34069, 34070, 34072, 34073, 34075, - 34076, 34077, 34078, 34080, 34082, 34083, 34084, 34085, 34086, 34087, - 34088, 34089, 34090, 34093, 34094, 34095, 34096, 34097, 34098, 34099, - 34100, 34101, 34102, 34110, 34111, 34112, 34113, 34114, 34116, 34117, - 34118, 34119, 34123, 34124, 34125, 34126, 34127, 34128, 34129, 34130, - 34131, 34132, 34133, 34135, 34136, 34138, 34139, 34140, 34141, 34143, - 34144, 34145, 34146, 34147, 34149, 34150, 34151, 34153, 34154, 34155, - 34156, 34157, 34158, 34159, 34160, 34161, 34163, 34165, 34166, 34167, - 34168, 34172, 34173, 34175, 34176, 34177, 30465, 30427, 21097, 32988, - 22307, 24072, 22833, 29422, 26045, 28287, 35799, 23608, 34417, 21313, - 30707, 25342, 26102, 20160, 39135, 34432, 23454, 35782, 21490, 30690, - 20351, 23630, 39542, 22987, 24335, 31034, 22763, 19990, 26623, 20107, - 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, 20365, - 37322, 39280, 27663, 24066, 24643, 23460, 35270, 35797, 25910, 25163, - 39318, 23432, 23551, 25480, 21806, 21463, 30246, 20861, 34092, 26530, - 26803, 27530, 25234, 36755, 21460, 33298, 28113, 30095, 20070, 36174, - 23408, 29087, 34223, 26257, 26329, 32626, 34560, 40653, 40736, 23646, - 26415, 36848, 26641, 26463, 25101, 31446, 22661, 24246, 25968, 28465, - 34178, 34179, 34182, 34184, 34185, 34186, 34187, 34188, 34189, 34190, - 34192, 34193, 34194, 34195, 34196, 34197, 34198, 34199, 34200, 34201, - 34202, 34205, 34206, 34207, 34208, 34209, 34210, 34211, 34213, 34214, - 34215, 34217, 34219, 34220, 34221, 34225, 34226, 34227, 34228, 34229, - 34230, 34232, 34234, 34235, 34236, 34237, 34238, 34239, 34240, 34242, - 34243, 34244, 34245, 34246, 34247, 34248, 34250, 34251, 34252, 34253, - 34254, 34257, 34258, 34260, 34262, 34263, 34264, 34265, 34266, 34267, - 34269, 34270, 34271, 34272, 34273, 34274, 34275, 34277, 34278, 34279, - 34280, 34282, 34283, 34284, 34285, 34286, 34287, 34288, 34289, 34290, - 34291, 34292, 34293, 34294, 34295, 34296, 24661, 21047, 32781, 25684, - 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, 27700, - 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, 26388, 28865, - 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, 32902, 23546, - 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, 24578, 39042, - 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, 33487, 37221, - 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, 35785, 32899, - 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, 30862, 23681, - 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, 26797, 21766, - 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, 22905, 22612, - 34297, 34298, 34300, 34301, 34302, 34304, 34305, 34306, 34307, 34308, - 34310, 34311, 34312, 34313, 34314, 34315, 34316, 34317, 34318, 34319, - 34320, 34322, 34323, 34324, 34325, 34327, 34328, 34329, 34330, 34331, - 34332, 34333, 34334, 34335, 34336, 34337, 34338, 34339, 34340, 34341, - 34342, 34344, 34346, 34347, 34348, 34349, 34350, 34351, 34352, 34353, - 34354, 34355, 34356, 34357, 34358, 34359, 34361, 34362, 34363, 34365, - 34366, 34367, 34368, 34369, 34370, 34371, 34372, 34373, 34374, 34375, - 34376, 34377, 34378, 34379, 34380, 34386, 34387, 34389, 34390, 34391, - 34392, 34393, 34395, 34396, 34397, 34399, 34400, 34401, 34403, 34404, - 34405, 34406, 34407, 34408, 34409, 34410, 29549, 25374, 36427, 36367, - 32974, 33492, 25260, 21488, 27888, 37214, 22826, 24577, 27760, 22349, - 25674, 36138, 30251, 28393, 22363, 27264, 30192, 28525, 35885, 35848, - 22374, 27631, 34962, 30899, 25506, 21497, 28845, 27748, 22616, 25642, - 22530, 26848, 33179, 21776, 31958, 20504, 36538, 28108, 36255, 28907, - 25487, 28059, 28372, 32486, 33796, 26691, 36867, 28120, 38518, 35752, - 22871, 29305, 34276, 33150, 30140, 35466, 26799, 21076, 36386, 38161, - 25552, 39064, 36420, 21884, 20307, 26367, 22159, 24789, 28053, 21059, - 23625, 22825, 28155, 22635, 30000, 29980, 24684, 33300, 33094, 25361, - 26465, 36834, 30522, 36339, 36148, 38081, 24086, 21381, 21548, 28867, - 34413, 34415, 34416, 34418, 34419, 34420, 34421, 34422, 34423, 34424, - 34435, 34436, 34437, 34438, 34439, 34440, 34441, 34446, 34447, 34448, - 34449, 34450, 34452, 34454, 34455, 34456, 34457, 34458, 34459, 34462, - 34463, 34464, 34465, 34466, 34469, 34470, 34475, 34477, 34478, 34482, - 34483, 34487, 34488, 34489, 34491, 34492, 34493, 34494, 34495, 34497, - 34498, 34499, 34501, 34504, 34508, 34509, 34514, 34515, 34517, 34518, - 34519, 34522, 34524, 34525, 34528, 34529, 34530, 34531, 34533, 34534, - 34535, 34536, 34538, 34539, 34540, 34543, 34549, 34550, 34551, 34554, - 34555, 34556, 34557, 34559, 34561, 34564, 34565, 34566, 34571, 34572, - 34574, 34575, 34576, 34577, 34580, 34582, 27712, 24311, 20572, 20141, - 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, 24420, - 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, 36879, - 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, 22303, 21520, - 20820, 28237, 22242, 25512, 39059, 33151, 34581, 35114, 36864, 21534, - 23663, 33216, 25302, 25176, 33073, 40501, 38464, 39534, 39548, 26925, - 22949, 25299, 21822, 25366, 21703, 34521, 27964, 23043, 29926, 34972, - 27498, 22806, 35916, 24367, 28286, 29609, 39037, 20024, 28919, 23436, - 30871, 25405, 26202, 30358, 24779, 23451, 23113, 19975, 33109, 27754, - 29579, 20129, 26505, 32593, 24448, 26106, 26395, 24536, 22916, 23041, - 34585, 34587, 34589, 34591, 34592, 34596, 34598, 34599, 34600, 34602, - 34603, 34604, 34605, 34607, 34608, 34610, 34611, 34613, 34614, 34616, - 34617, 34618, 34620, 34621, 34624, 34625, 34626, 34627, 34628, 34629, - 34630, 34634, 34635, 34637, 34639, 34640, 34641, 34642, 34644, 34645, - 34646, 34648, 34650, 34651, 34652, 34653, 34654, 34655, 34657, 34658, - 34662, 34663, 34664, 34665, 34666, 34667, 34668, 34669, 34671, 34673, - 34674, 34675, 34677, 34679, 34680, 34681, 34682, 34687, 34688, 34689, - 34692, 34694, 34695, 34697, 34698, 34700, 34702, 34703, 34704, 34705, - 34706, 34708, 34709, 34710, 34712, 34713, 34714, 34715, 34716, 34717, - 34718, 34720, 34721, 34722, 34723, 34724, 24013, 24494, 21361, 38886, - 36829, 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, - 22996, 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, - 21890, 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, - 34442, 25991, 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, - 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, - 24043, 21596, 38056, 20044, 27745, 35820, 23627, 26080, 33436, 26791, - 21566, 21556, 27595, 27494, 20116, 25410, 21320, 33310, 20237, 20398, - 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, 35823, 26132, - 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, 38177, 29306, - 34725, 34726, 34727, 34729, 34730, 34734, 34736, 34737, 34738, 34740, - 34742, 34743, 34744, 34745, 34747, 34748, 34750, 34751, 34753, 34754, - 34755, 34756, 34757, 34759, 34760, 34761, 34764, 34765, 34766, 34767, - 34768, 34772, 34773, 34774, 34775, 34776, 34777, 34778, 34780, 34781, - 34782, 34783, 34785, 34786, 34787, 34788, 34790, 34791, 34792, 34793, - 34795, 34796, 34797, 34799, 34800, 34801, 34802, 34803, 34804, 34805, - 34806, 34807, 34808, 34810, 34811, 34812, 34813, 34815, 34816, 34817, - 34818, 34820, 34821, 34822, 34823, 34824, 34825, 34827, 34828, 34829, - 34830, 34831, 34832, 34833, 34834, 34836, 34839, 34840, 34841, 34842, - 34844, 34845, 34846, 34847, 34848, 34851, 31232, 24687, 24076, 24713, - 33181, 22805, 24796, 29060, 28911, 28330, 27728, 29312, 27268, 34989, - 24109, 20064, 23219, 21916, 38115, 27927, 31995, 38553, 25103, 32454, - 30606, 34430, 21283, 38686, 36758, 26247, 23777, 20384, 29421, 19979, - 21414, 22799, 21523, 25472, 38184, 20808, 20185, 40092, 32420, 21688, - 36132, 34900, 33335, 38386, 28046, 24358, 23244, 26174, 38505, 29616, - 29486, 21439, 33146, 39301, 32673, 23466, 38519, 38480, 32447, 30456, - 21410, 38262, 39321, 31665, 35140, 28248, 20065, 32724, 31077, 35814, - 24819, 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, - 30813, 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, - 34852, 34853, 34854, 34855, 34856, 34857, 34858, 34859, 34860, 34861, - 34862, 34863, 34864, 34865, 34867, 34868, 34869, 34870, 34871, 34872, - 34874, 34875, 34877, 34878, 34879, 34881, 34882, 34883, 34886, 34887, - 34888, 34889, 34890, 34891, 34894, 34895, 34896, 34897, 34898, 34899, - 34901, 34902, 34904, 34906, 34907, 34908, 34909, 34910, 34911, 34912, - 34918, 34919, 34922, 34925, 34927, 34929, 34931, 34932, 34933, 34934, - 34936, 34937, 34938, 34939, 34940, 34944, 34947, 34950, 34951, 34953, - 34954, 34956, 34958, 34959, 34960, 34961, 34963, 34964, 34965, 34967, - 34968, 34969, 34970, 34971, 34973, 34974, 34975, 34976, 34977, 34979, - 34981, 34982, 34983, 34984, 34985, 34986, 23567, 23389, 26657, 32918, - 21880, 31505, 25928, 26964, 20123, 27463, 34638, 38795, 21327, 25375, - 25658, 37034, 26012, 32961, 35856, 20889, 26800, 21368, 34809, 25032, - 27844, 27899, 35874, 23633, 34218, 33455, 38156, 27427, 36763, 26032, - 24571, 24515, 20449, 34885, 26143, 33125, 29481, 24826, 20852, 21009, - 22411, 24418, 37026, 34892, 37266, 24184, 26447, 24615, 22995, 20804, - 20982, 33016, 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, - 21957, 38152, 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, - 39035, 24464, 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, - 32110, 23167, 32490, 32493, 36713, 21927, 23459, 24748, 26059, 29572, - 34988, 34990, 34991, 34992, 34994, 34995, 34996, 34997, 34998, 35000, - 35001, 35002, 35003, 35005, 35006, 35007, 35008, 35011, 35012, 35015, - 35016, 35018, 35019, 35020, 35021, 35023, 35024, 35025, 35027, 35030, - 35031, 35034, 35035, 35036, 35037, 35038, 35040, 35041, 35046, 35047, - 35049, 35050, 35051, 35052, 35053, 35054, 35055, 35058, 35061, 35062, - 35063, 35066, 35067, 35069, 35071, 35072, 35073, 35075, 35076, 35077, - 35078, 35079, 35080, 35081, 35083, 35084, 35085, 35086, 35087, 35089, - 35092, 35093, 35094, 35095, 35096, 35100, 35101, 35102, 35103, 35104, - 35106, 35107, 35108, 35110, 35111, 35112, 35113, 35116, 35117, 35118, - 35119, 35121, 35122, 35123, 35125, 35127, 36873, 30307, 30505, 32474, - 38772, 34203, 23398, 31348, 38634, 34880, 21195, 29071, 24490, 26092, - 35810, 23547, 39535, 24033, 27529, 27739, 35757, 35759, 36874, 36805, - 21387, 25276, 40486, 40493, 21568, 20011, 33469, 29273, 34460, 23830, - 34905, 28079, 38597, 21713, 20122, 35766, 28937, 21693, 38409, 28895, - 28153, 30416, 20005, 30740, 34578, 23721, 24310, 35328, 39068, 38414, - 28814, 27839, 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, - 21388, 30746, 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, - 22830, 40495, 31207, 26472, 25196, 20335, 30113, 32650, 27915, 38451, - 27687, 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, - 35128, 35129, 35130, 35131, 35132, 35133, 35134, 35135, 35136, 35138, - 35139, 35141, 35142, 35143, 35144, 35145, 35146, 35147, 35148, 35149, - 35150, 35151, 35152, 35153, 35154, 35155, 35156, 35157, 35158, 35159, - 35160, 35161, 35162, 35163, 35164, 35165, 35168, 35169, 35170, 35171, - 35172, 35173, 35175, 35176, 35177, 35178, 35179, 35180, 35181, 35182, - 35183, 35184, 35185, 35186, 35187, 35188, 35189, 35190, 35191, 35192, - 35193, 35194, 35196, 35197, 35198, 35200, 35202, 35204, 35205, 35207, - 35208, 35209, 35210, 35211, 35212, 35213, 35214, 35215, 35216, 35217, - 35218, 35219, 35220, 35221, 35222, 35223, 35224, 35225, 35226, 35227, - 35228, 35229, 35230, 35231, 35232, 35233, 25671, 23591, 36965, 31377, - 35875, 23002, 21676, 33280, 33647, 35201, 32768, 26928, 22094, 32822, - 29239, 37326, 20918, 20063, 39029, 25494, 19994, 21494, 26355, 33099, - 22812, 28082, 19968, 22777, 21307, 25558, 38129, 20381, 20234, 34915, - 39056, 22839, 36951, 31227, 20202, 33008, 30097, 27778, 23452, 23016, - 24413, 26885, 34433, 20506, 24050, 20057, 30691, 20197, 33402, 25233, - 26131, 37009, 23673, 20159, 24441, 33222, 36920, 32900, 30123, 20134, - 35028, 24847, 27589, 24518, 20041, 30410, 28322, 35811, 35758, 35850, - 35793, 24322, 32764, 32716, 32462, 33589, 33643, 22240, 27575, 38899, - 38452, 23035, 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, - 35234, 35235, 35236, 35237, 35238, 35239, 35240, 35241, 35242, 35243, - 35244, 35245, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, - 35254, 35255, 35256, 35257, 35258, 35259, 35260, 35261, 35262, 35263, - 35264, 35267, 35277, 35283, 35284, 35285, 35287, 35288, 35289, 35291, - 35293, 35295, 35296, 35297, 35298, 35300, 35303, 35304, 35305, 35306, - 35308, 35309, 35310, 35312, 35313, 35314, 35316, 35317, 35318, 35319, - 35320, 35321, 35322, 35323, 35324, 35325, 35326, 35327, 35329, 35330, - 35331, 35332, 35333, 35334, 35336, 35337, 35338, 35339, 35340, 35341, - 35342, 35343, 35344, 35345, 35346, 35347, 35348, 35349, 35350, 35351, - 35352, 35353, 35354, 35355, 35356, 35357, 21360, 33521, 27185, 23156, - 40560, 24212, 32552, 33721, 33828, 33829, 33639, 34631, 36814, 36194, - 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, 33219, 30152, - 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, 24703, 21191, - 29992, 24189, 20248, 24736, 24551, 23588, 30001, 37038, 38080, 29369, - 27833, 28216, 37193, 26377, 21451, 21491, 20305, 37321, 35825, 21448, - 24188, 36802, 28132, 20110, 30402, 27014, 34398, 24858, 33286, 20313, - 20446, 36926, 40060, 24841, 28189, 28180, 38533, 20104, 23089, 38632, - 19982, 23679, 31161, 23431, 35821, 32701, 29577, 22495, 33419, 37057, - 21505, 36935, 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, - 35358, 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366, 35367, - 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377, - 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385, 35386, 35387, - 35388, 35389, 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, - 35399, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, - 35410, 35411, 35412, 35413, 35414, 35415, 35416, 35417, 35418, 35419, - 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427, 35428, 35429, - 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, - 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35450, - 35451, 35452, 35453, 35454, 35455, 35456, 28020, 23507, 35029, 39044, - 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, 21407, 25588, - 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, 33489, 24895, - 24616, 38498, 26352, 32422, 36234, 36291, 38053, 23731, 31908, 26376, - 24742, 38405, 32792, 20113, 37095, 21248, 38504, 20801, 36816, 34164, - 37213, 26197, 38901, 23381, 21277, 30776, 26434, 26685, 21705, 28798, - 23472, 36733, 20877, 22312, 21681, 25874, 26242, 36190, 36163, 33039, - 33900, 36973, 31967, 20991, 34299, 26531, 26089, 28577, 34468, 36481, - 22122, 36896, 30338, 28790, 29157, 36131, 25321, 21017, 27901, 36156, - 24590, 22686, 24974, 26366, 36192, 25166, 21939, 28195, 26413, 36711, - 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35467, 35468, - 35469, 35470, 35471, 35472, 35473, 35474, 35476, 35477, 35478, 35479, - 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487, 35488, 35489, - 35490, 35491, 35492, 35493, 35494, 35495, 35496, 35497, 35498, 35499, - 35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, - 35510, 35511, 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519, - 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527, 35528, 35529, - 35530, 35531, 35532, 35533, 35534, 35535, 35536, 35537, 35538, 35539, - 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548, 35549, - 35550, 35551, 35552, 35553, 35554, 35555, 38113, 38392, 30504, 26629, - 27048, 21643, 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, - 23528, 30651, 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, - 23637, 34360, 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, - 24432, 28467, 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, - 32960, 30260, 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, - 20806, 32903, 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, - 34071, 36825, 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, - 38024, 20390, 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, - 25379, 30529, 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, - 35556, 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564, 35565, - 35566, 35567, 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575, - 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583, 35584, 35585, - 35586, 35587, 35588, 35589, 35590, 35592, 35593, 35594, 35595, 35596, - 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604, 35605, 35606, - 35607, 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, - 35617, 35618, 35619, 35620, 35621, 35623, 35624, 35625, 35626, 35627, - 35628, 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, 35637, - 35638, 35639, 35640, 35641, 35642, 35643, 35644, 35645, 35646, 35647, - 35648, 35649, 35650, 35651, 35652, 35653, 24103, 30151, 37073, 35777, - 33437, 26525, 25903, 21553, 34584, 30693, 32930, 33026, 27713, 20043, - 32455, 32844, 30452, 26893, 27542, 25191, 20540, 20356, 22336, 25351, - 27490, 36286, 21482, 26088, 32440, 24535, 25370, 25527, 33267, 33268, - 32622, 24092, 23769, 21046, 26234, 31209, 31258, 36136, 28825, 30164, - 28382, 27835, 31378, 20013, 30405, 24544, 38047, 34935, 32456, 31181, - 32959, 37325, 20210, 20247, 33311, 21608, 24030, 27954, 35788, 31909, - 36724, 32920, 24090, 21650, 30385, 23449, 26172, 39588, 29664, 26666, - 34523, 26417, 29482, 35832, 35803, 36880, 31481, 28891, 29038, 25284, - 30633, 22065, 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, - 35654, 35655, 35656, 35657, 35658, 35659, 35660, 35661, 35662, 35663, - 35664, 35665, 35666, 35667, 35668, 35669, 35670, 35671, 35672, 35673, - 35674, 35675, 35676, 35677, 35678, 35679, 35680, 35681, 35682, 35683, - 35684, 35685, 35687, 35688, 35689, 35690, 35691, 35693, 35694, 35695, - 35696, 35697, 35698, 35699, 35700, 35701, 35702, 35703, 35704, 35705, - 35706, 35707, 35708, 35709, 35710, 35711, 35712, 35713, 35714, 35715, - 35716, 35717, 35718, 35719, 35720, 35721, 35722, 35723, 35724, 35725, - 35726, 35727, 35728, 35729, 35730, 35731, 35732, 35733, 35734, 35735, - 35736, 35737, 35738, 35739, 35740, 35741, 35742, 35743, 35756, 35761, - 35771, 35783, 35792, 35818, 35849, 35870, 20303, 27880, 31069, 39547, - 25235, 29226, 25341, 19987, 30742, 36716, 25776, 36186, 31686, 26729, - 24196, 35013, 22918, 25758, 22766, 29366, 26894, 38181, 36861, 36184, - 22368, 32512, 35846, 20934, 25417, 25305, 21331, 26700, 29730, 33537, - 37196, 21828, 30528, 28796, 27978, 20857, 21672, 36164, 23039, 28363, - 28100, 23388, 32043, 20180, 31869, 28371, 23376, 33258, 28173, 23383, - 39683, 26837, 36394, 23447, 32508, 24635, 32437, 37049, 36208, 22863, - 25549, 31199, 36275, 21330, 26063, 31062, 35781, 38459, 32452, 38075, - 32386, 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, - 26590, 20570, 20316, 22352, 24231, 59408, 59409, 59410, 59411, 59412, - 35896, 35897, 35898, 35899, 35900, 35901, 35902, 35903, 35904, 35906, - 35907, 35908, 35909, 35912, 35914, 35915, 35917, 35918, 35919, 35920, - 35921, 35922, 35923, 35924, 35926, 35927, 35928, 35929, 35931, 35932, - 35933, 35934, 35935, 35936, 35939, 35940, 35941, 35942, 35943, 35944, - 35945, 35948, 35949, 35950, 35951, 35952, 35953, 35954, 35956, 35957, - 35958, 35959, 35963, 35964, 35965, 35966, 35967, 35968, 35969, 35971, - 35972, 35974, 35975, 35976, 35979, 35981, 35982, 35983, 35984, 35985, - 35986, 35987, 35989, 35990, 35991, 35993, 35994, 35995, 35996, 35997, - 35998, 35999, 36000, 36001, 36002, 36003, 36004, 36005, 36006, 36007, - 36008, 36009, 36010, 36011, 36012, 36013, 20109, 19980, 20800, 19984, - 24319, 21317, 19989, 20120, 19998, 39730, 23404, 22121, 20008, 31162, - 20031, 21269, 20039, 22829, 29243, 21358, 27664, 22239, 32996, 39319, - 27603, 30590, 40727, 20022, 20127, 40720, 20060, 20073, 20115, 33416, - 23387, 21868, 22031, 20164, 21389, 21405, 21411, 21413, 21422, 38757, - 36189, 21274, 21493, 21286, 21294, 21310, 36188, 21350, 21347, 20994, - 21000, 21006, 21037, 21043, 21055, 21056, 21068, 21086, 21089, 21084, - 33967, 21117, 21122, 21121, 21136, 21139, 20866, 32596, 20155, 20163, - 20169, 20162, 20200, 20193, 20203, 20190, 20251, 20211, 20258, 20324, - 20213, 20261, 20263, 20233, 20267, 20318, 20327, 25912, 20314, 20317, - 36014, 36015, 36016, 36017, 36018, 36019, 36020, 36021, 36022, 36023, - 36024, 36025, 36026, 36027, 36028, 36029, 36030, 36031, 36032, 36033, - 36034, 36035, 36036, 36037, 36038, 36039, 36040, 36041, 36042, 36043, - 36044, 36045, 36046, 36047, 36048, 36049, 36050, 36051, 36052, 36053, - 36054, 36055, 36056, 36057, 36058, 36059, 36060, 36061, 36062, 36063, - 36064, 36065, 36066, 36067, 36068, 36069, 36070, 36071, 36072, 36073, - 36074, 36075, 36076, 36077, 36078, 36079, 36080, 36081, 36082, 36083, - 36084, 36085, 36086, 36087, 36088, 36089, 36090, 36091, 36092, 36093, - 36094, 36095, 36096, 36097, 36098, 36099, 36100, 36101, 36102, 36103, - 36104, 36105, 36106, 36107, 36108, 36109, 20319, 20311, 20274, 20285, - 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, 20348, - 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, 20433, - 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, 20478, - 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, 20588, - 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, 20710, - 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, 40864, 27718, - 31860, 20846, 24061, 40649, 39320, 20865, 22804, 21241, 21261, 35335, - 21264, 20971, 22809, 20821, 20128, 20822, 20147, 34926, 34980, 20149, - 33044, 35026, 31104, 23348, 34819, 32696, 20907, 20913, 20925, 20924, - 36110, 36111, 36112, 36113, 36114, 36115, 36116, 36117, 36118, 36119, - 36120, 36121, 36122, 36123, 36124, 36128, 36177, 36178, 36183, 36191, - 36197, 36200, 36201, 36202, 36204, 36206, 36207, 36209, 36210, 36216, - 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224, 36226, 36227, - 36230, 36231, 36232, 36233, 36236, 36237, 36238, 36239, 36240, 36242, - 36243, 36245, 36246, 36247, 36248, 36249, 36250, 36251, 36252, 36253, - 36254, 36256, 36257, 36258, 36260, 36261, 36262, 36263, 36264, 36265, - 36266, 36267, 36268, 36269, 36270, 36271, 36272, 36274, 36278, 36279, - 36281, 36283, 36285, 36288, 36289, 36290, 36293, 36295, 36296, 36297, - 36298, 36301, 36304, 36306, 36307, 36308, 20935, 20886, 20898, 20901, - 35744, 35750, 35751, 35754, 35764, 35765, 35767, 35778, 35779, 35787, - 35791, 35790, 35794, 35795, 35796, 35798, 35800, 35801, 35804, 35807, - 35808, 35812, 35816, 35817, 35822, 35824, 35827, 35830, 35833, 35836, - 35839, 35840, 35842, 35844, 35847, 35852, 35855, 35857, 35858, 35860, - 35861, 35862, 35865, 35867, 35864, 35869, 35871, 35872, 35873, 35877, - 35879, 35882, 35883, 35886, 35887, 35890, 35891, 35893, 35894, 21353, - 21370, 38429, 38434, 38433, 38449, 38442, 38461, 38460, 38466, 38473, - 38484, 38495, 38503, 38508, 38514, 38516, 38536, 38541, 38551, 38576, - 37015, 37019, 37021, 37017, 37036, 37025, 37044, 37043, 37046, 37050, - 36309, 36312, 36313, 36316, 36320, 36321, 36322, 36325, 36326, 36327, - 36329, 36333, 36334, 36336, 36337, 36338, 36340, 36342, 36348, 36350, - 36351, 36352, 36353, 36354, 36355, 36356, 36358, 36359, 36360, 36363, - 36365, 36366, 36368, 36369, 36370, 36371, 36373, 36374, 36375, 36376, - 36377, 36378, 36379, 36380, 36384, 36385, 36388, 36389, 36390, 36391, - 36392, 36395, 36397, 36400, 36402, 36403, 36404, 36406, 36407, 36408, - 36411, 36412, 36414, 36415, 36419, 36421, 36422, 36428, 36429, 36430, - 36431, 36432, 36435, 36436, 36437, 36438, 36439, 36440, 36442, 36443, - 36444, 36445, 36446, 36447, 36448, 36449, 36450, 36451, 36452, 36453, - 36455, 36456, 36458, 36459, 36462, 36465, 37048, 37040, 37071, 37061, - 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, 37083, - 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, 37177, - 37187, 37190, 21005, 22850, 21154, 21164, 21165, 21182, 21759, 21200, - 21206, 21232, 21471, 29166, 30669, 24308, 20981, 20988, 39727, 21430, - 24321, 30042, 24047, 22348, 22441, 22433, 22654, 22716, 22725, 22737, - 22313, 22316, 22314, 22323, 22329, 22318, 22319, 22364, 22331, 22338, - 22377, 22405, 22379, 22406, 22396, 22395, 22376, 22381, 22390, 22387, - 22445, 22436, 22412, 22450, 22479, 22439, 22452, 22419, 22432, 22485, - 22488, 22490, 22489, 22482, 22456, 22516, 22511, 22520, 22500, 22493, - 36467, 36469, 36471, 36472, 36473, 36474, 36475, 36477, 36478, 36480, - 36482, 36483, 36484, 36486, 36488, 36489, 36490, 36491, 36492, 36493, - 36494, 36497, 36498, 36499, 36501, 36502, 36503, 36504, 36505, 36506, - 36507, 36509, 36511, 36512, 36513, 36514, 36515, 36516, 36517, 36518, - 36519, 36520, 36521, 36522, 36525, 36526, 36528, 36529, 36531, 36532, - 36533, 36534, 36535, 36536, 36537, 36539, 36540, 36541, 36542, 36543, - 36544, 36545, 36546, 36547, 36548, 36549, 36550, 36551, 36552, 36553, - 36554, 36555, 36556, 36557, 36559, 36560, 36561, 36562, 36563, 36564, - 36565, 36566, 36567, 36568, 36569, 36570, 36571, 36572, 36573, 36574, - 36575, 36576, 36577, 36578, 36579, 36580, 22539, 22541, 22525, 22509, - 22528, 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, - 22656, 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, - 33412, 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, - 33482, 33507, 33432, 33463, 33454, 33483, 33484, 33473, 33449, 33460, - 33441, 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, - 33551, 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, - 33562, 33542, 33556, 33557, 33504, 33493, 33564, 33617, 33627, 33628, - 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, - 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, - 36581, 36582, 36583, 36584, 36585, 36586, 36587, 36588, 36589, 36590, - 36591, 36592, 36593, 36594, 36595, 36596, 36597, 36598, 36599, 36600, - 36601, 36602, 36603, 36604, 36605, 36606, 36607, 36608, 36609, 36610, - 36611, 36612, 36613, 36614, 36615, 36616, 36617, 36618, 36619, 36620, - 36621, 36622, 36623, 36624, 36625, 36626, 36627, 36628, 36629, 36630, - 36631, 36632, 36633, 36634, 36635, 36636, 36637, 36638, 36639, 36640, - 36641, 36642, 36643, 36644, 36645, 36646, 36647, 36648, 36649, 36650, - 36651, 36652, 36653, 36654, 36655, 36656, 36657, 36658, 36659, 36660, - 36661, 36662, 36663, 36664, 36665, 36666, 36667, 36668, 36669, 36670, - 36671, 36672, 36673, 36674, 36675, 36676, 33640, 33563, 33641, 33644, - 33642, 33645, 33646, 33712, 33656, 33715, 33716, 33696, 33706, 33683, - 33692, 33669, 33660, 33718, 33705, 33661, 33720, 33659, 33688, 33694, - 33704, 33722, 33724, 33729, 33793, 33765, 33752, 22535, 33816, 33803, - 33757, 33789, 33750, 33820, 33848, 33809, 33798, 33748, 33759, 33807, - 33795, 33784, 33785, 33770, 33733, 33728, 33830, 33776, 33761, 33884, - 33873, 33882, 33881, 33907, 33927, 33928, 33914, 33929, 33912, 33852, - 33862, 33897, 33910, 33932, 33934, 33841, 33901, 33985, 33997, 34000, - 34022, 33981, 34003, 33994, 33983, 33978, 34016, 33953, 33977, 33972, - 33943, 34021, 34019, 34060, 29965, 34104, 34032, 34105, 34079, 34106, - 36677, 36678, 36679, 36680, 36681, 36682, 36683, 36684, 36685, 36686, - 36687, 36688, 36689, 36690, 36691, 36692, 36693, 36694, 36695, 36696, - 36697, 36698, 36699, 36700, 36701, 36702, 36703, 36704, 36705, 36706, - 36707, 36708, 36709, 36714, 36736, 36748, 36754, 36765, 36768, 36769, - 36770, 36772, 36773, 36774, 36775, 36778, 36780, 36781, 36782, 36783, - 36786, 36787, 36788, 36789, 36791, 36792, 36794, 36795, 36796, 36799, - 36800, 36803, 36806, 36809, 36810, 36811, 36812, 36813, 36815, 36818, - 36822, 36823, 36826, 36832, 36833, 36835, 36839, 36844, 36847, 36849, - 36850, 36852, 36853, 36854, 36858, 36859, 36860, 36862, 36863, 36871, - 36872, 36876, 36878, 36883, 36885, 36888, 34134, 34107, 34047, 34044, - 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, - 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, - 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, - 24318, 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, 23586, - 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, 25306, 25303, - 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, 25457, 25466, - 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, 25586, 25592, - 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, 25669, 25665, - 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, 25709, 25750, - 36889, 36892, 36899, 36900, 36901, 36903, 36904, 36905, 36906, 36907, - 36908, 36912, 36913, 36914, 36915, 36916, 36919, 36921, 36922, 36925, - 36927, 36928, 36931, 36933, 36934, 36936, 36937, 36938, 36939, 36940, - 36942, 36948, 36949, 36950, 36953, 36954, 36956, 36957, 36958, 36959, - 36960, 36961, 36964, 36966, 36967, 36969, 36970, 36971, 36972, 36975, - 36976, 36977, 36978, 36979, 36982, 36983, 36984, 36985, 36986, 36987, - 36988, 36990, 36993, 36996, 36997, 36998, 36999, 37001, 37002, 37004, - 37005, 37006, 37007, 37008, 37010, 37012, 37014, 37016, 37018, 37020, - 37022, 37023, 37024, 37028, 37029, 37031, 37032, 37033, 37035, 37037, - 37042, 37047, 37052, 37053, 37055, 37056, 25722, 25783, 25784, 25753, - 25786, 25792, 25808, 25815, 25828, 25826, 25865, 25893, 25902, 24331, - 24530, 29977, 24337, 21343, 21489, 21501, 21481, 21480, 21499, 21522, - 21526, 21510, 21579, 21586, 21587, 21588, 21590, 21571, 21537, 21591, - 21593, 21539, 21554, 21634, 21652, 21623, 21617, 21604, 21658, 21659, - 21636, 21622, 21606, 21661, 21712, 21677, 21698, 21684, 21714, 21671, - 21670, 21715, 21716, 21618, 21667, 21717, 21691, 21695, 21708, 21721, - 21722, 21724, 21673, 21674, 21668, 21725, 21711, 21726, 21787, 21735, - 21792, 21757, 21780, 21747, 21794, 21795, 21775, 21777, 21799, 21802, - 21863, 21903, 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, - 37058, 37059, 37062, 37064, 37065, 37067, 37068, 37069, 37074, 37076, - 37077, 37078, 37080, 37081, 37082, 37086, 37087, 37088, 37091, 37092, - 37093, 37097, 37098, 37100, 37102, 37104, 37105, 37106, 37107, 37109, - 37110, 37111, 37113, 37114, 37115, 37116, 37119, 37120, 37121, 37123, - 37125, 37126, 37127, 37128, 37129, 37130, 37131, 37132, 37133, 37134, - 37135, 37136, 37137, 37138, 37139, 37140, 37141, 37142, 37143, 37144, - 37146, 37147, 37148, 37149, 37151, 37152, 37153, 37156, 37157, 37158, - 37159, 37160, 37161, 37162, 37163, 37164, 37165, 37166, 37168, 37170, - 37171, 37172, 37173, 37174, 37175, 37176, 37178, 37179, 37180, 37181, - 37182, 37183, 37184, 37185, 37186, 37188, 21815, 21846, 21877, 21878, - 21879, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, 21896, - 21889, 21919, 21886, 21974, 21905, 21883, 21983, 21949, 21950, 21908, - 21913, 21994, 22007, 21961, 22047, 21969, 21995, 21996, 21972, 21990, - 21981, 21956, 21999, 21989, 22002, 22003, 21964, 21965, 21992, 22005, - 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, 22014, 22016, - 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, 22105, 22108, - 22092, 22100, 22150, 22116, 22129, 22123, 22139, 22140, 22149, 22163, - 22191, 22228, 22231, 22237, 22241, 22261, 22251, 22265, 22271, 22276, - 22282, 22281, 22300, 24079, 24089, 24084, 24081, 24113, 24123, 24124, - 37189, 37191, 37192, 37201, 37203, 37204, 37205, 37206, 37208, 37209, - 37211, 37212, 37215, 37216, 37222, 37223, 37224, 37227, 37229, 37235, - 37242, 37243, 37244, 37248, 37249, 37250, 37251, 37252, 37254, 37256, - 37258, 37262, 37263, 37267, 37268, 37269, 37270, 37271, 37272, 37273, - 37276, 37277, 37278, 37279, 37280, 37281, 37284, 37285, 37286, 37287, - 37288, 37289, 37291, 37292, 37296, 37297, 37298, 37299, 37302, 37303, - 37304, 37305, 37307, 37308, 37309, 37310, 37311, 37312, 37313, 37314, - 37315, 37316, 37317, 37318, 37320, 37323, 37328, 37330, 37331, 37332, - 37333, 37334, 37335, 37336, 37337, 37338, 37339, 37341, 37342, 37343, - 37344, 37345, 37346, 37347, 37348, 37349, 24119, 24132, 24148, 24155, - 24158, 24161, 23692, 23674, 23693, 23696, 23702, 23688, 23704, 23705, - 23697, 23706, 23708, 23733, 23714, 23741, 23724, 23723, 23729, 23715, - 23745, 23735, 23748, 23762, 23780, 23755, 23781, 23810, 23811, 23847, - 23846, 23854, 23844, 23838, 23814, 23835, 23896, 23870, 23860, 23869, - 23916, 23899, 23919, 23901, 23915, 23883, 23882, 23913, 23924, 23938, - 23961, 23965, 35955, 23991, 24005, 24435, 24439, 24450, 24455, 24457, - 24460, 24469, 24473, 24476, 24488, 24493, 24501, 24508, 34914, 24417, - 29357, 29360, 29364, 29367, 29368, 29379, 29377, 29390, 29389, 29394, - 29416, 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, 29434, - 37350, 37351, 37352, 37353, 37354, 37355, 37356, 37357, 37358, 37359, - 37360, 37361, 37362, 37363, 37364, 37365, 37366, 37367, 37368, 37369, - 37370, 37371, 37372, 37373, 37374, 37375, 37376, 37377, 37378, 37379, - 37380, 37381, 37382, 37383, 37384, 37385, 37386, 37387, 37388, 37389, - 37390, 37391, 37392, 37393, 37394, 37395, 37396, 37397, 37398, 37399, - 37400, 37401, 37402, 37403, 37404, 37405, 37406, 37407, 37408, 37409, - 37410, 37411, 37412, 37413, 37414, 37415, 37416, 37417, 37418, 37419, - 37420, 37421, 37422, 37423, 37424, 37425, 37426, 37427, 37428, 37429, - 37430, 37431, 37432, 37433, 37434, 37435, 37436, 37437, 37438, 37439, - 37440, 37441, 37442, 37443, 37444, 37445, 29435, 29463, 29459, 29473, - 29450, 29470, 29469, 29461, 29474, 29497, 29477, 29484, 29496, 29489, - 29520, 29517, 29527, 29536, 29548, 29551, 29566, 33307, 22821, 39143, - 22820, 22786, 39267, 39271, 39272, 39273, 39274, 39275, 39276, 39284, - 39287, 39293, 39296, 39300, 39303, 39306, 39309, 39312, 39313, 39315, - 39316, 39317, 24192, 24209, 24203, 24214, 24229, 24224, 24249, 24245, - 24254, 24243, 36179, 24274, 24273, 24283, 24296, 24298, 33210, 24516, - 24521, 24534, 24527, 24579, 24558, 24580, 24545, 24548, 24574, 24581, - 24582, 24554, 24557, 24568, 24601, 24629, 24614, 24603, 24591, 24589, - 24617, 24619, 24586, 24639, 24609, 24696, 24697, 24699, 24698, 24642, - 37446, 37447, 37448, 37449, 37450, 37451, 37452, 37453, 37454, 37455, - 37456, 37457, 37458, 37459, 37460, 37461, 37462, 37463, 37464, 37465, - 37466, 37467, 37468, 37469, 37470, 37471, 37472, 37473, 37474, 37475, - 37476, 37477, 37478, 37479, 37480, 37481, 37482, 37483, 37484, 37485, - 37486, 37487, 37488, 37489, 37490, 37491, 37493, 37494, 37495, 37496, - 37497, 37498, 37499, 37500, 37501, 37502, 37503, 37504, 37505, 37506, - 37507, 37508, 37509, 37510, 37511, 37512, 37513, 37514, 37515, 37516, - 37517, 37519, 37520, 37521, 37522, 37523, 37524, 37525, 37526, 37527, - 37528, 37529, 37530, 37531, 37532, 37533, 37534, 37535, 37536, 37537, - 37538, 37539, 37540, 37541, 37542, 37543, 24682, 24701, 24726, 24730, - 24749, 24733, 24707, 24722, 24716, 24731, 24812, 24763, 24753, 24797, - 24792, 24774, 24794, 24756, 24864, 24870, 24853, 24867, 24820, 24832, - 24846, 24875, 24906, 24949, 25004, 24980, 24999, 25015, 25044, 25077, - 24541, 38579, 38377, 38379, 38385, 38387, 38389, 38390, 38396, 38398, - 38403, 38404, 38406, 38408, 38410, 38411, 38412, 38413, 38415, 38418, - 38421, 38422, 38423, 38425, 38426, 20012, 29247, 25109, 27701, 27732, - 27740, 27722, 27811, 27781, 27792, 27796, 27788, 27752, 27753, 27764, - 27766, 27782, 27817, 27856, 27860, 27821, 27895, 27896, 27889, 27863, - 27826, 27872, 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, - 37544, 37545, 37546, 37547, 37548, 37549, 37551, 37552, 37553, 37554, - 37555, 37556, 37557, 37558, 37559, 37560, 37561, 37562, 37563, 37564, - 37565, 37566, 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574, - 37575, 37577, 37578, 37579, 37580, 37581, 37582, 37583, 37584, 37585, - 37586, 37587, 37588, 37589, 37590, 37591, 37592, 37593, 37594, 37595, - 37596, 37597, 37598, 37599, 37600, 37601, 37602, 37603, 37604, 37605, - 37606, 37607, 37608, 37609, 37610, 37611, 37612, 37613, 37614, 37615, - 37616, 37617, 37618, 37619, 37620, 37621, 37622, 37623, 37624, 37625, - 37626, 37627, 37628, 37629, 37630, 37631, 37632, 37633, 37634, 37635, - 37636, 37637, 37638, 37639, 37640, 37641, 27961, 27943, 27916, 27971, - 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, 27957, 27930, - 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, 27998, 28051, - 28052, 27996, 28000, 28028, 28003, 28186, 28103, 28101, 28126, 28174, - 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, 28172, 28078, - 28203, 28270, 28238, 28267, 28338, 28255, 28294, 28243, 28244, 28210, - 28197, 28228, 28383, 28337, 28312, 28384, 28461, 28386, 28325, 28327, - 28349, 28347, 28343, 28375, 28340, 28367, 28303, 28354, 28319, 28514, - 28486, 28487, 28452, 28437, 28409, 28463, 28470, 28491, 28532, 28458, - 28425, 28457, 28553, 28557, 28556, 28536, 28530, 28540, 28538, 28625, - 37642, 37643, 37644, 37645, 37646, 37647, 37648, 37649, 37650, 37651, - 37652, 37653, 37654, 37655, 37656, 37657, 37658, 37659, 37660, 37661, - 37662, 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670, 37671, - 37672, 37673, 37674, 37675, 37676, 37677, 37678, 37679, 37680, 37681, - 37682, 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690, 37691, - 37692, 37693, 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702, - 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710, 37711, 37712, - 37713, 37714, 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, - 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, 37731, 37732, - 37733, 37734, 37735, 37736, 37737, 37739, 28617, 28583, 28601, 28598, - 28610, 28641, 28654, 28638, 28640, 28655, 28698, 28707, 28699, 28729, - 28725, 28751, 28766, 23424, 23428, 23445, 23443, 23461, 23480, 29999, - 39582, 25652, 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, - 36821, 36837, 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, - 36875, 36902, 36881, 36877, 36886, 36897, 36917, 36918, 36909, 36911, - 36932, 36945, 36946, 36944, 36968, 36952, 36962, 36955, 26297, 36980, - 36989, 36994, 37000, 36995, 37003, 24400, 24407, 24406, 24408, 23611, - 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, - 33396, 24380, 39739, 23662, 22913, 22915, 22925, 22953, 22954, 22947, - 37740, 37741, 37742, 37743, 37744, 37745, 37746, 37747, 37748, 37749, - 37750, 37751, 37752, 37753, 37754, 37755, 37756, 37757, 37758, 37759, - 37760, 37761, 37762, 37763, 37764, 37765, 37766, 37767, 37768, 37769, - 37770, 37771, 37772, 37773, 37774, 37776, 37777, 37778, 37779, 37780, - 37781, 37782, 37783, 37784, 37785, 37786, 37787, 37788, 37789, 37790, - 37791, 37792, 37793, 37794, 37795, 37796, 37797, 37798, 37799, 37800, - 37801, 37802, 37803, 37804, 37805, 37806, 37807, 37808, 37809, 37810, - 37811, 37812, 37813, 37814, 37815, 37816, 37817, 37818, 37819, 37820, - 37821, 37822, 37823, 37824, 37825, 37826, 37827, 37828, 37829, 37830, - 37831, 37832, 37833, 37835, 37836, 37837, 22935, 22986, 22955, 22942, - 22948, 22994, 22962, 22959, 22999, 22974, 23045, 23046, 23005, 23048, - 23011, 23000, 23033, 23052, 23049, 23090, 23092, 23057, 23075, 23059, - 23104, 23143, 23114, 23125, 23100, 23138, 23157, 33004, 23210, 23195, - 23159, 23162, 23230, 23275, 23218, 23250, 23252, 23224, 23264, 23267, - 23281, 23254, 23270, 23256, 23260, 23305, 23319, 23318, 23346, 23351, - 23360, 23573, 23580, 23386, 23397, 23411, 23377, 23379, 23394, 39541, - 39543, 39544, 39546, 39551, 39549, 39552, 39553, 39557, 39560, 39562, - 39568, 39570, 39571, 39574, 39576, 39579, 39580, 39581, 39583, 39584, - 39586, 39587, 39589, 39591, 32415, 32417, 32419, 32421, 32424, 32425, - 37838, 37839, 37840, 37841, 37842, 37843, 37844, 37845, 37847, 37848, - 37849, 37850, 37851, 37852, 37853, 37854, 37855, 37856, 37857, 37858, - 37859, 37860, 37861, 37862, 37863, 37864, 37865, 37866, 37867, 37868, - 37869, 37870, 37871, 37872, 37873, 37874, 37875, 37876, 37877, 37878, - 37879, 37880, 37881, 37882, 37883, 37884, 37885, 37886, 37887, 37888, - 37889, 37890, 37891, 37892, 37893, 37894, 37895, 37896, 37897, 37898, - 37899, 37900, 37901, 37902, 37903, 37904, 37905, 37906, 37907, 37908, - 37909, 37910, 37911, 37912, 37913, 37914, 37915, 37916, 37917, 37918, - 37919, 37920, 37921, 37922, 37923, 37924, 37925, 37926, 37927, 37928, - 37929, 37930, 37931, 37932, 37933, 37934, 32429, 32432, 32446, 32448, - 32449, 32450, 32457, 32459, 32460, 32464, 32468, 32471, 32475, 32480, - 32481, 32488, 32491, 32494, 32495, 32497, 32498, 32525, 32502, 32506, - 32507, 32510, 32513, 32514, 32515, 32519, 32520, 32523, 32524, 32527, - 32529, 32530, 32535, 32537, 32540, 32539, 32543, 32545, 32546, 32547, - 32548, 32549, 32550, 32551, 32554, 32555, 32556, 32557, 32559, 32560, - 32561, 32562, 32563, 32565, 24186, 30079, 24027, 30014, 37013, 29582, - 29585, 29614, 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, - 29641, 29640, 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, - 29682, 29711, 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, - 37935, 37936, 37937, 37938, 37939, 37940, 37941, 37942, 37943, 37944, - 37945, 37946, 37947, 37948, 37949, 37951, 37952, 37953, 37954, 37955, - 37956, 37957, 37958, 37959, 37960, 37961, 37962, 37963, 37964, 37965, - 37966, 37967, 37968, 37969, 37970, 37971, 37972, 37973, 37974, 37975, - 37976, 37977, 37978, 37979, 37980, 37981, 37982, 37983, 37984, 37985, - 37986, 37987, 37988, 37989, 37990, 37991, 37992, 37993, 37994, 37996, - 37997, 37998, 37999, 38000, 38001, 38002, 38003, 38004, 38005, 38006, - 38007, 38008, 38009, 38010, 38011, 38012, 38013, 38014, 38015, 38016, - 38017, 38018, 38019, 38020, 38033, 38038, 38040, 38087, 38095, 38099, - 38100, 38106, 38118, 38139, 38172, 38176, 29723, 29722, 29761, 29788, - 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, 29824, 29825, - 29831, 29835, 29854, 29864, 29865, 29840, 29863, 29906, 29882, 38890, - 38891, 38892, 26444, 26451, 26462, 26440, 26473, 26533, 26503, 26474, - 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, 26487, 26492, - 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, 26549, 26586, - 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, 26621, 26674, - 26675, 26720, 26721, 26702, 26722, 26692, 26724, 26755, 26653, 26709, - 26726, 26689, 26727, 26688, 26686, 26698, 26697, 26665, 26805, 26767, - 26740, 26743, 26771, 26731, 26818, 26990, 26876, 26911, 26912, 26873, - 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, - 38260, 38261, 38263, 38264, 38265, 38266, 38267, 38268, 38269, 38270, - 38272, 38273, 38274, 38275, 38276, 38277, 38278, 38279, 38280, 38281, - 38282, 38283, 38284, 38285, 38286, 38287, 38288, 38289, 38290, 38291, - 38292, 38293, 38294, 38295, 38296, 38297, 38298, 38299, 38300, 38301, - 38302, 38303, 38304, 38305, 38306, 38307, 38308, 38309, 38310, 38311, - 38312, 38313, 38314, 38315, 38316, 38317, 38318, 38319, 38320, 38321, - 38322, 38323, 38324, 38325, 38326, 38327, 38328, 38329, 38330, 38331, - 38332, 38333, 38334, 38335, 38336, 38337, 38338, 38339, 38340, 38341, - 38342, 38343, 38344, 38345, 38346, 38347, 26916, 26864, 26891, 26881, - 26967, 26851, 26896, 26993, 26937, 26976, 26946, 26973, 27012, 26987, - 27008, 27032, 27000, 26932, 27084, 27015, 27016, 27086, 27017, 26982, - 26979, 27001, 27035, 27047, 27067, 27051, 27053, 27092, 27057, 27073, - 27082, 27103, 27029, 27104, 27021, 27135, 27183, 27117, 27159, 27160, - 27237, 27122, 27204, 27198, 27296, 27216, 27227, 27189, 27278, 27257, - 27197, 27176, 27224, 27260, 27281, 27280, 27305, 27287, 27307, 29495, - 29522, 27521, 27522, 27527, 27524, 27538, 27539, 27533, 27546, 27547, - 27553, 27562, 36715, 36717, 36721, 36722, 36723, 36725, 36726, 36728, - 36727, 36729, 36730, 36732, 36734, 36737, 36738, 36740, 36743, 36747, - 38348, 38349, 38350, 38351, 38352, 38353, 38354, 38355, 38356, 38357, - 38358, 38359, 38360, 38361, 38362, 38363, 38364, 38365, 38366, 38367, - 38368, 38369, 38370, 38371, 38372, 38373, 38374, 38375, 38380, 38399, - 38407, 38419, 38424, 38427, 38430, 38432, 38435, 38436, 38437, 38438, - 38439, 38440, 38441, 38443, 38444, 38445, 38447, 38448, 38455, 38456, - 38457, 38458, 38462, 38465, 38467, 38474, 38478, 38479, 38481, 38482, - 38483, 38486, 38487, 38488, 38489, 38490, 38492, 38493, 38494, 38496, - 38499, 38501, 38502, 38507, 38509, 38510, 38511, 38512, 38513, 38515, - 38520, 38521, 38522, 38523, 38524, 38525, 38526, 38527, 38528, 38529, - 38530, 38531, 38532, 38535, 38537, 38538, 36749, 36750, 36751, 36760, - 36762, 36558, 25099, 25111, 25115, 25119, 25122, 25121, 25125, 25124, - 25132, 33255, 29935, 29940, 29951, 29967, 29969, 29971, 25908, 26094, - 26095, 26096, 26122, 26137, 26482, 26115, 26133, 26112, 28805, 26359, - 26141, 26164, 26161, 26166, 26165, 32774, 26207, 26196, 26177, 26191, - 26198, 26209, 26199, 26231, 26244, 26252, 26279, 26269, 26302, 26331, - 26332, 26342, 26345, 36146, 36147, 36150, 36155, 36157, 36160, 36165, - 36166, 36168, 36169, 36167, 36173, 36181, 36185, 35271, 35274, 35275, - 35276, 35278, 35279, 35280, 35281, 29294, 29343, 29277, 29286, 29295, - 29310, 29311, 29316, 29323, 29325, 29327, 29330, 25352, 25394, 25520, - 38540, 38542, 38545, 38546, 38547, 38549, 38550, 38554, 38555, 38557, - 38558, 38559, 38560, 38561, 38562, 38563, 38564, 38565, 38566, 38568, - 38569, 38570, 38571, 38572, 38573, 38574, 38575, 38577, 38578, 38580, - 38581, 38583, 38584, 38586, 38587, 38591, 38594, 38595, 38600, 38602, - 38603, 38608, 38609, 38611, 38612, 38614, 38615, 38616, 38617, 38618, - 38619, 38620, 38621, 38622, 38623, 38625, 38626, 38627, 38628, 38629, - 38630, 38631, 38635, 38636, 38637, 38638, 38640, 38641, 38642, 38644, - 38645, 38648, 38650, 38651, 38652, 38653, 38655, 38658, 38659, 38661, - 38666, 38667, 38668, 38672, 38673, 38674, 38676, 38677, 38679, 38680, - 38681, 38682, 38683, 38685, 38687, 38688, 25663, 25816, 32772, 27626, - 27635, 27645, 27637, 27641, 27653, 27655, 27654, 27661, 27669, 27672, - 27673, 27674, 27681, 27689, 27684, 27690, 27698, 25909, 25941, 25963, - 29261, 29266, 29270, 29232, 34402, 21014, 32927, 32924, 32915, 32956, - 26378, 32957, 32945, 32939, 32941, 32948, 32951, 32999, 33000, 33001, - 33002, 32987, 32962, 32964, 32985, 32973, 32983, 26384, 32989, 33003, - 33009, 33012, 33005, 33037, 33038, 33010, 33020, 26389, 33042, 35930, - 33078, 33054, 33068, 33048, 33074, 33096, 33100, 33107, 33140, 33113, - 33114, 33137, 33120, 33129, 33148, 33149, 33133, 33127, 22605, 23221, - 33160, 33154, 33169, 28373, 33187, 33194, 33228, 26406, 33226, 33211, - 38689, 38690, 38691, 38692, 38693, 38694, 38695, 38696, 38697, 38699, - 38700, 38702, 38703, 38705, 38707, 38708, 38709, 38710, 38711, 38714, - 38715, 38716, 38717, 38719, 38720, 38721, 38722, 38723, 38724, 38725, - 38726, 38727, 38728, 38729, 38730, 38731, 38732, 38733, 38734, 38735, - 38736, 38737, 38740, 38741, 38743, 38744, 38746, 38748, 38749, 38751, - 38755, 38756, 38758, 38759, 38760, 38762, 38763, 38764, 38765, 38766, - 38767, 38768, 38769, 38770, 38773, 38775, 38776, 38777, 38778, 38779, - 38781, 38782, 38783, 38784, 38785, 38786, 38787, 38788, 38790, 38791, - 38792, 38793, 38794, 38796, 38798, 38799, 38800, 38803, 38805, 38806, - 38807, 38809, 38810, 38811, 38812, 38813, 33217, 33190, 27428, 27447, - 27449, 27459, 27462, 27481, 39121, 39122, 39123, 39125, 39129, 39130, - 27571, 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, 26052, - 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, 28859, - 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, 28975, - 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, 29080, - 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, 29224, - 28780, 28952, 29030, 29113, 25150, 25149, 25155, 25160, 25161, 31035, - 31040, 31046, 31049, 31067, 31068, 31059, 31066, 31074, 31063, 31072, - 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, 24528, - 38814, 38815, 38817, 38818, 38820, 38821, 38822, 38823, 38824, 38825, - 38826, 38828, 38830, 38832, 38833, 38835, 38837, 38838, 38839, 38840, - 38841, 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849, 38850, - 38851, 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859, 38860, - 38861, 38862, 38863, 38864, 38865, 38866, 38867, 38868, 38869, 38870, - 38871, 38872, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, - 38881, 38882, 38883, 38884, 38885, 38888, 38894, 38895, 38896, 38897, - 38898, 38900, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, - 38911, 38912, 38913, 38914, 38915, 38916, 38917, 38918, 38919, 38920, - 38921, 38922, 38923, 38924, 38925, 38926, 24636, 24669, 24666, 24679, - 24641, 24665, 24675, 24747, 24838, 24845, 24925, 25001, 24989, 25035, - 25041, 25094, 32896, 32895, 27795, 27894, 28156, 30710, 30712, 30720, - 30729, 30743, 30744, 30737, 26027, 30765, 30748, 30749, 30777, 30778, - 30779, 30751, 30780, 30757, 30764, 30755, 30761, 30798, 30829, 30806, - 30807, 30758, 30800, 30791, 30796, 30826, 30875, 30867, 30874, 30855, - 30876, 30881, 30883, 30898, 30905, 30885, 30932, 30937, 30921, 30956, - 30962, 30981, 30964, 30995, 31012, 31006, 31028, 40859, 40697, 40699, - 40700, 30449, 30468, 30477, 30457, 30471, 30472, 30490, 30498, 30489, - 30509, 30502, 30517, 30520, 30544, 30545, 30535, 30531, 30554, 30568, - 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, - 38937, 38938, 38939, 38940, 38941, 38942, 38943, 38944, 38945, 38946, - 38947, 38948, 38949, 38950, 38951, 38952, 38953, 38954, 38955, 38956, - 38957, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, - 38967, 38968, 38969, 38970, 38971, 38972, 38973, 38974, 38975, 38976, - 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, - 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38996, - 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, - 39007, 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015, 39016, - 39017, 39018, 39019, 39020, 39021, 39022, 30562, 30565, 30591, 30605, - 30589, 30592, 30604, 30609, 30623, 30624, 30640, 30645, 30653, 30010, - 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, 32609, - 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, 30437, - 34866, 38021, 38022, 38023, 38027, 38026, 38028, 38029, 38031, 38032, - 38036, 38039, 38037, 38042, 38043, 38044, 38051, 38052, 38059, 38058, - 38061, 38060, 38063, 38064, 38066, 38068, 38070, 38071, 38072, 38073, - 38074, 38076, 38077, 38079, 38084, 38088, 38089, 38090, 38091, 38092, - 38093, 38094, 38096, 38097, 38098, 38101, 38102, 38103, 38105, 38104, - 38107, 38110, 38111, 38112, 38114, 38116, 38117, 38119, 38120, 38122, - 39023, 39024, 39025, 39026, 39027, 39028, 39051, 39054, 39058, 39061, - 39065, 39075, 39080, 39081, 39082, 39083, 39084, 39085, 39086, 39087, - 39088, 39089, 39090, 39091, 39092, 39093, 39094, 39095, 39096, 39097, - 39098, 39099, 39100, 39101, 39102, 39103, 39104, 39105, 39106, 39107, - 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, - 39119, 39120, 39124, 39126, 39127, 39131, 39132, 39133, 39136, 39137, - 39138, 39139, 39140, 39141, 39142, 39145, 39146, 39147, 39148, 39149, - 39150, 39151, 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159, - 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167, 39168, 39169, - 39170, 39171, 39172, 39173, 39174, 39175, 38121, 38123, 38126, 38127, - 38131, 38132, 38133, 38135, 38137, 38140, 38141, 38143, 38147, 38146, - 38150, 38151, 38153, 38154, 38157, 38158, 38159, 38162, 38163, 38164, - 38165, 38166, 38168, 38171, 38173, 38174, 38175, 38178, 38186, 38187, - 38185, 38188, 38193, 38194, 38196, 38198, 38199, 38200, 38204, 38206, - 38207, 38210, 38197, 38212, 38213, 38214, 38217, 38220, 38222, 38223, - 38226, 38227, 38228, 38230, 38231, 38232, 38233, 38235, 38238, 38239, - 38237, 38241, 38242, 38244, 38245, 38246, 38247, 38248, 38249, 38250, - 38251, 38252, 38255, 38257, 38258, 38259, 38202, 30695, 30700, 38601, - 31189, 31213, 31203, 31211, 31238, 23879, 31235, 31234, 31262, 31252, - 39176, 39177, 39178, 39179, 39180, 39182, 39183, 39185, 39186, 39187, - 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195, 39196, 39197, - 39198, 39199, 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207, - 39208, 39209, 39210, 39211, 39212, 39213, 39215, 39216, 39217, 39218, - 39219, 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227, 39228, - 39229, 39230, 39231, 39232, 39233, 39234, 39235, 39236, 39237, 39238, - 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39248, - 39249, 39250, 39251, 39254, 39255, 39256, 39257, 39258, 39259, 39260, - 39261, 39262, 39263, 39264, 39265, 39266, 39268, 39270, 39283, 39288, - 39289, 39291, 39294, 39298, 39299, 39305, 31289, 31287, 31313, 40655, - 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, - 40480, 40482, 40488, 40489, 40490, 40491, 40492, 40498, 40497, 40502, - 40504, 40503, 40505, 40506, 40510, 40513, 40514, 40516, 40518, 40519, - 40520, 40521, 40523, 40524, 40526, 40529, 40533, 40535, 40538, 40539, - 40540, 40542, 40547, 40550, 40551, 40552, 40553, 40554, 40555, 40556, - 40561, 40557, 40563, 30098, 30100, 30102, 30112, 30109, 30124, 30115, - 30131, 30132, 30136, 30148, 30129, 30128, 30147, 30146, 30166, 30157, - 30179, 30184, 30182, 30180, 30187, 30183, 30211, 30193, 30204, 30207, - 30224, 30208, 30213, 30220, 30231, 30218, 30245, 30232, 30229, 30233, - 39308, 39310, 39322, 39323, 39324, 39325, 39326, 39327, 39328, 39329, - 39330, 39331, 39332, 39334, 39335, 39337, 39338, 39339, 39340, 39341, - 39342, 39343, 39344, 39345, 39346, 39347, 39348, 39349, 39350, 39351, - 39352, 39353, 39354, 39355, 39356, 39357, 39358, 39359, 39360, 39361, - 39362, 39363, 39364, 39365, 39366, 39367, 39368, 39369, 39370, 39371, - 39372, 39373, 39374, 39375, 39376, 39377, 39378, 39379, 39380, 39381, - 39382, 39383, 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391, - 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401, - 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409, 39410, 39411, - 39412, 39413, 39414, 39415, 39416, 39417, 30235, 30268, 30242, 30240, - 30272, 30253, 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, - 30292, 30300, 30294, 30315, 30319, 32714, 31462, 31352, 31353, 31360, - 31366, 31368, 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, - 34921, 34930, 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, - 35042, 35022, 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, - 35105, 35097, 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, - 35195, 30091, 32997, 30386, 30388, 30684, 32786, 32788, 32790, 32796, - 32800, 32802, 32805, 32806, 32807, 32809, 32808, 32817, 32779, 32821, - 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, - 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425, 39426, 39427, - 39428, 39429, 39430, 39431, 39432, 39433, 39434, 39435, 39436, 39437, - 39438, 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446, 39447, - 39448, 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456, 39457, - 39458, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, 39467, - 39468, 39469, 39470, 39471, 39472, 39473, 39474, 39475, 39476, 39477, - 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, - 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, - 39498, 39499, 39500, 39501, 39502, 39503, 39504, 39505, 39506, 39507, - 39508, 39509, 39510, 39511, 39512, 39513, 39049, 39052, 39053, 39055, - 39060, 39066, 39067, 39070, 39071, 39073, 39074, 39077, 39078, 34381, - 34388, 34412, 34414, 34431, 34426, 34428, 34427, 34472, 34445, 34443, - 34476, 34461, 34471, 34467, 34474, 34451, 34473, 34486, 34500, 34485, - 34510, 34480, 34490, 34481, 34479, 34505, 34511, 34484, 34537, 34545, - 34546, 34541, 34547, 34512, 34579, 34526, 34548, 34527, 34520, 34513, - 34563, 34567, 34552, 34568, 34570, 34573, 34569, 34595, 34619, 34590, - 34597, 34606, 34586, 34622, 34632, 34612, 34609, 34601, 34615, 34623, - 34690, 34594, 34685, 34686, 34683, 34656, 34672, 34636, 34670, 34699, - 34643, 34659, 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, - 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523, - 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531, 39538, 39555, - 39561, 39565, 39566, 39572, 39573, 39577, 39590, 39593, 39594, 39595, - 39596, 39597, 39598, 39599, 39602, 39603, 39604, 39605, 39609, 39611, - 39613, 39614, 39615, 39619, 39620, 39622, 39623, 39624, 39625, 39626, - 39629, 39630, 39631, 39632, 39634, 39636, 39637, 39638, 39639, 39641, - 39642, 39643, 39644, 39645, 39646, 39648, 39650, 39651, 39652, 39653, - 39655, 39656, 39657, 39658, 39660, 39662, 39664, 39665, 39666, 39667, - 39668, 39669, 39670, 39671, 39672, 39674, 39676, 39677, 39678, 39679, - 39680, 39681, 39682, 39684, 39685, 39686, 34758, 34696, 34693, 34733, - 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, 34771, 34749, - 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, 34835, 34814, - 34826, 34843, 34849, 34873, 34876, 32566, 32578, 32580, 32581, 33296, - 31482, 31485, 31496, 31491, 31492, 31509, 31498, 31531, 31503, 31559, - 31544, 31530, 31513, 31534, 31537, 31520, 31525, 31524, 31539, 31550, - 31518, 31576, 31578, 31557, 31605, 31564, 31581, 31584, 31598, 31611, - 31586, 31602, 31601, 31632, 31654, 31655, 31672, 31660, 31645, 31656, - 31621, 31658, 31644, 31650, 31659, 31668, 31697, 31681, 31692, 31709, - 31706, 31717, 31718, 31722, 31756, 31742, 31740, 31759, 31766, 31755, - 39687, 39689, 39690, 39691, 39692, 39693, 39694, 39696, 39697, 39698, - 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, - 39710, 39712, 39713, 39714, 39716, 39717, 39718, 39719, 39720, 39721, - 39722, 39723, 39724, 39725, 39726, 39728, 39729, 39731, 39732, 39733, - 39734, 39735, 39736, 39737, 39738, 39741, 39742, 39743, 39744, 39750, - 39754, 39755, 39756, 39758, 39760, 39762, 39763, 39765, 39766, 39767, - 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777, - 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785, 39786, 39787, - 39788, 39789, 39790, 39791, 39792, 39793, 39794, 39795, 39796, 39797, - 39798, 39799, 39800, 39801, 39802, 39803, 31775, 31786, 31782, 31800, - 31809, 31808, 33278, 33281, 33282, 33284, 33260, 34884, 33313, 33314, - 33315, 33325, 33327, 33320, 33323, 33336, 33339, 33331, 33332, 33342, - 33348, 33353, 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, - 35032, 35039, 35166, 32669, 32671, 32679, 32687, 32688, 32690, 31868, - 25929, 31889, 31901, 31900, 31902, 31906, 31922, 31932, 31933, 31937, - 31943, 31948, 31949, 31944, 31941, 31959, 31976, 33390, 26280, 32703, - 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, 31992, 32119, - 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, 36241, - 36273, 36199, 36205, 35911, 35913, 37194, 37200, 37198, 37199, 37220, - 39804, 39805, 39806, 39807, 39808, 39809, 39810, 39811, 39812, 39813, - 39814, 39815, 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823, - 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833, - 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841, 39842, 39843, - 39844, 39845, 39846, 39847, 39848, 39849, 39850, 39851, 39852, 39853, - 39854, 39855, 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863, - 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873, - 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881, 39882, 39883, - 39884, 39885, 39886, 39887, 39888, 39889, 39890, 39891, 39892, 39893, - 39894, 39895, 39896, 39897, 39898, 39899, 37218, 37217, 37232, 37225, - 37231, 37245, 37246, 37234, 37236, 37241, 37260, 37253, 37264, 37261, - 37265, 37282, 37283, 37290, 37293, 37294, 37295, 37301, 37300, 37306, - 35925, 40574, 36280, 36331, 36357, 36441, 36457, 36277, 36287, 36284, - 36282, 36292, 36310, 36311, 36314, 36318, 36302, 36303, 36315, 36294, - 36332, 36343, 36344, 36323, 36345, 36347, 36324, 36361, 36349, 36372, - 36381, 36383, 36396, 36398, 36387, 36399, 36410, 36416, 36409, 36405, - 36413, 36401, 36425, 36417, 36418, 36433, 36434, 36426, 36464, 36470, - 36476, 36463, 36468, 36485, 36495, 36500, 36496, 36508, 36510, 35960, - 35970, 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, - 39900, 39901, 39902, 39903, 39904, 39905, 39906, 39907, 39908, 39909, - 39910, 39911, 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919, - 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929, - 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937, 39938, 39939, - 39940, 39941, 39942, 39943, 39944, 39945, 39946, 39947, 39948, 39949, - 39950, 39951, 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959, - 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969, - 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977, 39978, 39979, - 39980, 39981, 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989, - 39990, 39991, 39992, 39993, 39994, 39995, 35301, 35307, 35311, 35390, - 35622, 38739, 38633, 38643, 38639, 38662, 38657, 38664, 38671, 38670, - 38698, 38701, 38704, 38718, 40832, 40835, 40837, 40838, 40839, 40840, - 40841, 40842, 40844, 40702, 40715, 40717, 38585, 38588, 38589, 38606, - 38610, 30655, 38624, 37518, 37550, 37576, 37694, 37738, 37834, 37775, - 37950, 37995, 40063, 40066, 40069, 40070, 40071, 40072, 31267, 40075, - 40078, 40080, 40081, 40082, 40084, 40085, 40090, 40091, 40094, 40095, - 40096, 40097, 40098, 40099, 40101, 40102, 40103, 40104, 40105, 40107, - 40109, 40110, 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119, - 40122, 40123, 40124, 40125, 40132, 40133, 40134, 40135, 40138, 40139, - 39996, 39997, 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005, - 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015, - 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023, 40024, 40025, - 40026, 40027, 40028, 40029, 40030, 40031, 40032, 40033, 40034, 40035, - 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045, - 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055, - 40056, 40057, 40058, 40059, 40061, 40062, 40064, 40067, 40068, 40073, - 40074, 40076, 40079, 40083, 40086, 40087, 40088, 40089, 40093, 40106, - 40108, 40111, 40121, 40126, 40127, 40128, 40129, 40130, 40136, 40137, - 40145, 40146, 40154, 40155, 40160, 40161, 40140, 40141, 40142, 40143, - 40144, 40147, 40148, 40149, 40151, 40152, 40153, 40156, 40157, 40159, - 40162, 38780, 38789, 38801, 38802, 38804, 38831, 38827, 38819, 38834, - 38836, 39601, 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, - 39621, 39618, 39627, 39628, 39633, 39749, 39747, 39751, 39753, 39752, - 39757, 39761, 39144, 39181, 39214, 39253, 39252, 39647, 39649, 39654, - 39663, 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, - 40637, 40638, 32315, 40578, 40583, 40584, 40587, 40594, 37846, 40605, - 40607, 40667, 40668, 40669, 40672, 40671, 40674, 40681, 40679, 40677, - 40682, 40687, 40738, 40748, 40751, 40761, 40759, 40765, 40766, 40772, - 40163, 40164, 40165, 40166, 40167, 40168, 40169, 40170, 40171, 40172, - 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, - 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191, 40192, - 40193, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, - 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, - 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, - 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, - 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, - 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40251, 40252, - 40253, 40254, 40255, 40256, 40257, 40258, 57908, 57909, 57910, 57911, - 57912, 57913, 57914, 57915, 57916, 57917, 57918, 57919, 57920, 57921, - 57922, 57923, 57924, 57925, 57926, 57927, 57928, 57929, 57930, 57931, - 57932, 57933, 57934, 57935, 57936, 57937, 57938, 57939, 57940, 57941, - 57942, 57943, 57944, 57945, 57946, 57947, 57948, 57949, 57950, 57951, - 57952, 57953, 57954, 57955, 57956, 57957, 57958, 57959, 57960, 57961, - 57962, 57963, 57964, 57965, 57966, 57967, 57968, 57969, 57970, 57971, - 57972, 57973, 57974, 57975, 57976, 57977, 57978, 57979, 57980, 57981, - 57982, 57983, 57984, 57985, 57986, 57987, 57988, 57989, 57990, 57991, - 57992, 57993, 57994, 57995, 57996, 57997, 57998, 57999, 58000, 58001, - 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, - 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, - 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, - 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, - 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, - 40309, 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, 40318, - 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, 40328, - 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, - 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, - 40349, 40350, 40351, 40352, 40353, 40354, 58002, 58003, 58004, 58005, - 58006, 58007, 58008, 58009, 58010, 58011, 58012, 58013, 58014, 58015, - 58016, 58017, 58018, 58019, 58020, 58021, 58022, 58023, 58024, 58025, - 58026, 58027, 58028, 58029, 58030, 58031, 58032, 58033, 58034, 58035, - 58036, 58037, 58038, 58039, 58040, 58041, 58042, 58043, 58044, 58045, - 58046, 58047, 58048, 58049, 58050, 58051, 58052, 58053, 58054, 58055, - 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, - 58066, 58067, 58068, 58069, 58070, 58071, 58072, 58073, 58074, 58075, - 58076, 58077, 58078, 58079, 58080, 58081, 58082, 58083, 58084, 58085, - 58086, 58087, 58088, 58089, 58090, 58091, 58092, 58093, 58094, 58095, - 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40364, - 40365, 40366, 40367, 40368, 40369, 40370, 40371, 40372, 40373, 40374, - 40375, 40376, 40377, 40378, 40379, 40380, 40381, 40382, 40383, 40384, - 40385, 40386, 40387, 40388, 40389, 40390, 40391, 40392, 40393, 40394, - 40395, 40396, 40397, 40398, 40399, 40400, 40401, 40402, 40403, 40404, - 40405, 40406, 40407, 40408, 40409, 40410, 40411, 40412, 40413, 40414, - 40415, 40416, 40417, 40418, 40419, 40420, 40421, 40422, 40423, 40424, - 40425, 40426, 40427, 40428, 40429, 40430, 40431, 40432, 40433, 40434, - 40435, 40436, 40437, 40438, 40439, 40440, 40441, 40442, 40443, 40444, - 40445, 40446, 40447, 40448, 40449, 40450, 58096, 58097, 58098, 58099, - 58100, 58101, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, - 58110, 58111, 58112, 58113, 58114, 58115, 58116, 58117, 58118, 58119, - 58120, 58121, 58122, 58123, 58124, 58125, 58126, 58127, 58128, 58129, - 58130, 58131, 58132, 58133, 58134, 58135, 58136, 58137, 58138, 58139, - 58140, 58141, 58142, 58143, 58144, 58145, 58146, 58147, 58148, 58149, - 58150, 58151, 58152, 58153, 58154, 58155, 58156, 58157, 58158, 58159, - 58160, 58161, 58162, 58163, 58164, 58165, 58166, 58167, 58168, 58169, - 58170, 58171, 58172, 58173, 58174, 58175, 58176, 58177, 58178, 58179, - 58180, 58181, 58182, 58183, 58184, 58185, 58186, 58187, 58188, 58189, - 40451, 40452, 40453, 40454, 40455, 40456, 40457, 40458, 40459, 40460, - 40461, 40462, 40463, 40464, 40465, 40466, 40467, 40468, 40469, 40470, - 40471, 40472, 40473, 40474, 40475, 40476, 40477, 40478, 40484, 40487, - 40494, 40496, 40500, 40507, 40508, 40512, 40525, 40528, 40530, 40531, - 40532, 40534, 40537, 40541, 40543, 40544, 40545, 40546, 40549, 40558, - 40559, 40562, 40564, 40565, 40566, 40567, 40568, 40569, 40570, 40571, - 40572, 40573, 40576, 40577, 40579, 40580, 40581, 40582, 40585, 40586, - 40588, 40589, 40590, 40591, 40592, 40593, 40596, 40597, 40598, 40599, - 40600, 40601, 40602, 40603, 40604, 40606, 40608, 40609, 40610, 40611, - 40612, 40613, 40615, 40616, 40617, 40618, 58190, 58191, 58192, 58193, - 58194, 58195, 58196, 58197, 58198, 58199, 58200, 58201, 58202, 58203, - 58204, 58205, 58206, 58207, 58208, 58209, 58210, 58211, 58212, 58213, - 58214, 58215, 58216, 58217, 58218, 58219, 58220, 58221, 58222, 58223, - 58224, 58225, 58226, 58227, 58228, 58229, 58230, 58231, 58232, 58233, - 58234, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58242, 58243, - 58244, 58245, 58246, 58247, 58248, 58249, 58250, 58251, 58252, 58253, - 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58263, - 58264, 58265, 58266, 58267, 58268, 58269, 58270, 58271, 58272, 58273, - 58274, 58275, 58276, 58277, 58278, 58279, 58280, 58281, 58282, 58283, - 40619, 40620, 40621, 40622, 40623, 40624, 40625, 40626, 40627, 40629, - 40630, 40631, 40633, 40634, 40636, 40639, 40640, 40641, 40642, 40643, - 40645, 40646, 40647, 40648, 40650, 40651, 40652, 40656, 40658, 40659, - 40661, 40662, 40663, 40665, 40666, 40670, 40673, 40675, 40676, 40678, - 40680, 40683, 40684, 40685, 40686, 40688, 40689, 40690, 40691, 40692, - 40693, 40694, 40695, 40696, 40698, 40701, 40703, 40704, 40705, 40706, - 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40716, 40719, - 40721, 40722, 40724, 40725, 40726, 40728, 40730, 40731, 40732, 40733, - 40734, 40735, 40737, 40739, 40740, 40741, 40742, 40743, 40744, 40745, - 40746, 40747, 40749, 40750, 40752, 40753, 58284, 58285, 58286, 58287, - 58288, 58289, 58290, 58291, 58292, 58293, 58294, 58295, 58296, 58297, - 58298, 58299, 58300, 58301, 58302, 58303, 58304, 58305, 58306, 58307, - 58308, 58309, 58310, 58311, 58312, 58313, 58314, 58315, 58316, 58317, - 58318, 58319, 58320, 58321, 58322, 58323, 58324, 58325, 58326, 58327, - 58328, 58329, 58330, 58331, 58332, 58333, 58334, 58335, 58336, 58337, - 58338, 58339, 58340, 58341, 58342, 58343, 58344, 58345, 58346, 58347, - 58348, 58349, 58350, 58351, 58352, 58353, 58354, 58355, 58356, 58357, - 58358, 58359, 58360, 58361, 58362, 58363, 58364, 58365, 58366, 58367, - 58368, 58369, 58370, 58371, 58372, 58373, 58374, 58375, 58376, 58377, - 40754, 40755, 40756, 40757, 40758, 40760, 40762, 40764, 40767, 40768, - 40769, 40770, 40771, 40773, 40774, 40775, 40776, 40777, 40778, 40779, - 40780, 40781, 40782, 40783, 40786, 40787, 40788, 40789, 40790, 40791, - 40792, 40793, 40794, 40795, 40796, 40797, 40798, 40799, 40800, 40801, - 40802, 40803, 40804, 40805, 40806, 40807, 40808, 40809, 40810, 40811, - 40812, 40813, 40814, 40815, 40816, 40817, 40818, 40819, 40820, 40821, - 40822, 40823, 40824, 40825, 40826, 40827, 40828, 40829, 40830, 40833, - 40834, 40845, 40846, 40847, 40848, 40849, 40850, 40851, 40852, 40853, - 40854, 40855, 40856, 40860, 40861, 40862, 40865, 40866, 40867, 40868, - 40869, 63788, 63865, 63893, 63975, 63985, 58378, 58379, 58380, 58381, - 58382, 58383, 58384, 58385, 58386, 58387, 58388, 58389, 58390, 58391, - 58392, 58393, 58394, 58395, 58396, 58397, 58398, 58399, 58400, 58401, - 58402, 58403, 58404, 58405, 58406, 58407, 58408, 58409, 58410, 58411, - 58412, 58413, 58414, 58415, 58416, 58417, 58418, 58419, 58420, 58421, - 58422, 58423, 58424, 58425, 58426, 58427, 58428, 58429, 58430, 58431, - 58432, 58433, 58434, 58435, 58436, 58437, 58438, 58439, 58440, 58441, - 58442, 58443, 58444, 58445, 58446, 58447, 58448, 58449, 58450, 58451, - 58452, 58453, 58454, 58455, 58456, 58457, 58458, 58459, 58460, 58461, - 58462, 58463, 58464, 58465, 58466, 58467, 58468, 58469, 58470, 58471, - 64012, 64013, 64014, 64015, 64017, 64019, 64020, 64024, 64031, 64032, - 64033, 64035, 64036, 64039, 64040, 64041, 11905, 59414, 59415, 59416, - 11908, 13427, 13383, 11912, 11915, 59422, 13726, 13850, 13838, 11916, - 11927, 14702, 14616, 59430, 14799, 14815, 14963, 14800, 59435, 59436, - 15182, 15470, 15584, 11943, 59441, 59442, 11946, 16470, 16735, 11950, - 17207, 11955, 11958, 11959, 59451, 17329, 17324, 11963, 17373, 17622, - 18017, 17996, 59459, 18211, 18217, 18300, 18317, 11978, 18759, 18810, - 18813, 18818, 18819, 18821, 18822, 18847, 18843, 18871, 18870, 59476, - 59477, 19619, 19615, 19616, 19617, 19575, 19618, 19731, 19732, 19733, - 19734, 19735, 19736, 19737, 19886, 59492, 58472, 58473, 58474, 58475, - 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58485, - 58486, 58487, 58488, 58489, 58490, 58491, 58492, 58493, 58494, 58495, - 58496, 58497, 58498, 58499, 58500, 58501, 58502, 58503, 58504, 58505, - 58506, 58507, 58508, 58509, 58510, 58511, 58512, 58513, 58514, 58515, - 58516, 58517, 58518, 58519, 58520, 58521, 58522, 58523, 58524, 58525, - 58526, 58527, 58528, 58529, 58530, 58531, 58532, 58533, 58534, 58535, - 58536, 58537, 58538, 58539, 58540, 58541, 58542, 58543, 58544, 58545, - 58546, 58547, 58548, 58549, 58550, 58551, 58552, 58553, 58554, 58555, - 58556, 58557, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, - -}; - -static const unsigned long myhtml_encoding_map_gb18030_ranges[][2] = { - {0, 128}, {36, 165}, {38, 169}, {45, 178}, {50, 184}, - {81, 216}, {89, 226}, {95, 235}, {96, 238}, {100, 244}, - {103, 248}, {104, 251}, {105, 253}, {109, 258}, {126, 276}, - {133, 284}, {148, 300}, {172, 325}, {175, 329}, {179, 334}, - {208, 364}, {306, 463}, {307, 465}, {308, 467}, {309, 469}, - {310, 471}, {311, 473}, {312, 475}, {313, 477}, {341, 506}, - {428, 594}, {443, 610}, {544, 712}, {545, 716}, {558, 730}, - {741, 930}, {742, 938}, {749, 962}, {750, 970}, {805, 1026}, - {819, 1104}, {820, 1106}, {7922, 8209}, {7924, 8215}, {7925, 8218}, - {7927, 8222}, {7934, 8231}, {7943, 8241}, {7944, 8244}, {7945, 8246}, - {7950, 8252}, {8062, 8365}, {8148, 8452}, {8149, 8454}, {8152, 8458}, - {8164, 8471}, {8174, 8482}, {8236, 8556}, {8240, 8570}, {8262, 8596}, - {8264, 8602}, {8374, 8713}, {8380, 8720}, {8381, 8722}, {8384, 8726}, - {8388, 8731}, {8390, 8737}, {8392, 8740}, {8393, 8742}, {8394, 8748}, - {8396, 8751}, {8401, 8760}, {8406, 8766}, {8416, 8777}, {8419, 8781}, - {8424, 8787}, {8437, 8802}, {8439, 8808}, {8445, 8816}, {8482, 8854}, - {8485, 8858}, {8496, 8870}, {8521, 8896}, {8603, 8979}, {8936, 9322}, - {8946, 9372}, {9046, 9548}, {9050, 9588}, {9063, 9616}, {9066, 9622}, - {9076, 9634}, {9092, 9652}, {9100, 9662}, {9108, 9672}, {9111, 9676}, - {9113, 9680}, {9131, 9702}, {9162, 9735}, {9164, 9738}, {9218, 9793}, - {9219, 9795}, {11329, 11906}, {11331, 11909}, {11334, 11913}, {11336, 11917}, - {11346, 11928}, {11361, 11944}, {11363, 11947}, {11366, 11951}, {11370, 11956}, - {11372, 11960}, {11375, 11964}, {11389, 11979}, {11682, 12284}, {11686, 12292}, - {11687, 12312}, {11692, 12319}, {11694, 12330}, {11714, 12351}, {11716, 12436}, - {11723, 12447}, {11725, 12535}, {11730, 12543}, {11736, 12586}, {11982, 12842}, - {11989, 12850}, {12102, 12964}, {12336, 13200}, {12348, 13215}, {12350, 13218}, - {12384, 13253}, {12393, 13263}, {12395, 13267}, {12397, 13270}, {12510, 13384}, - {12553, 13428}, {12851, 13727}, {12962, 13839}, {12973, 13851}, {13738, 14617}, - {13823, 14703}, {13919, 14801}, {13933, 14816}, {14080, 14964}, {14298, 15183}, - {14585, 15471}, {14698, 15585}, {15583, 16471}, {15847, 16736}, {16318, 17208}, - {16434, 17325}, {16438, 17330}, {16481, 17374}, {16729, 17623}, {17102, 17997}, - {17122, 18018}, {17315, 18212}, {17320, 18218}, {17402, 18301}, {17418, 18318}, - {17859, 18760}, {17909, 18811}, {17911, 18814}, {17915, 18820}, {17916, 18823}, - {17936, 18844}, {17939, 18848}, {17961, 18872}, {18664, 19576}, {18703, 19620}, - {18814, 19738}, {18962, 19887}, {19043, 40870}, {33469, 59244}, {33470, 59336}, - {33471, 59367}, {33484, 59413}, {33485, 59417}, {33490, 59423}, {33497, 59431}, - {33501, 59437}, {33505, 59443}, {33513, 59452}, {33520, 59460}, {33536, 59478}, - {33550, 59493}, {37845, 63789}, {37921, 63866}, {37948, 63894}, {38029, 63976}, - {38038, 63986}, {38064, 64016}, {38065, 64018}, {38066, 64021}, {38069, 64025}, - {38075, 64034}, {38076, 64037}, {38078, 64042}, {39108, 65074}, {39109, 65093}, - {39113, 65107}, {39114, 65112}, {39115, 65127}, {39116, 65132}, {39265, 65375}, - {39394, 65510}, {189000, 65536}, -}; - -static const unsigned long myhtml_encoding_map_ibm866[] = { - 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, - 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, - 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, - 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 9617, 9618, - 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, - 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, - 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, - 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, - 9484, 9608, 9604, 9612, 9616, 9600, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, - 1102, 1103, 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, - 176, 8729, 183, 8730, 8470, 164, 9632, 160, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_10[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 260, 274, 290, 298, 296, 310, 167, - 315, 272, 352, 358, 381, 173, 362, 330, 176, 261, - 275, 291, 299, 297, 311, 183, 316, 273, 353, 359, - 382, 8213, 363, 331, 256, 193, 194, 195, 196, 197, - 198, 302, 268, 201, 280, 203, 278, 205, 206, 207, - 208, 325, 332, 211, 212, 213, 214, 360, 216, 370, - 218, 219, 220, 221, 222, 223, 257, 225, 226, 227, - 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, - 238, 239, 240, 326, 333, 243, 244, 245, 246, 361, - 248, 371, 250, 251, 252, 253, 254, 312, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_13[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 8221, 162, 163, 164, 8222, 166, 167, - 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, - 178, 179, 8220, 181, 182, 183, 248, 185, 343, 187, - 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, - 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, - 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, - 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, - 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, - 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, - 371, 322, 347, 363, 252, 380, 382, 8217, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_14[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 7682, 7683, 163, 266, 267, 7690, 167, - 7808, 169, 7810, 7691, 7922, 173, 174, 376, 7710, 7711, - 288, 289, 7744, 7745, 182, 7766, 7809, 7767, 7811, 7776, - 7923, 7812, 7813, 7777, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 372, 209, 210, 211, 212, 213, 214, 7786, 216, 217, - 218, 219, 220, 221, 374, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 373, 241, 242, 243, 244, 245, 246, 7787, - 248, 249, 250, 251, 252, 253, 375, 255, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_15[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 8364, 165, 352, 167, - 353, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 381, 181, 182, 183, 382, 185, 186, 187, - 338, 339, 376, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_16[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 260, 261, 321, 8364, 8222, 352, 167, - 353, 169, 536, 171, 377, 173, 378, 379, 176, 177, - 268, 322, 381, 8221, 182, 183, 382, 269, 537, 187, - 338, 339, 376, 380, 192, 193, 194, 258, 196, 262, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 272, 323, 210, 211, 212, 336, 214, 346, 368, 217, - 218, 219, 220, 280, 538, 223, 224, 225, 226, 259, - 228, 263, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 273, 324, 242, 243, 244, 337, 246, 347, - 369, 249, 250, 251, 252, 281, 539, 255, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_2[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 260, 728, 321, 164, 317, 346, 167, - 168, 352, 350, 356, 377, 173, 381, 379, 176, 261, - 731, 322, 180, 318, 347, 711, 184, 353, 351, 357, - 378, 733, 382, 380, 340, 193, 194, 258, 196, 313, - 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, - 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, - 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, - 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, - 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, - 345, 367, 250, 369, 252, 253, 355, 729, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_3[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 294, 728, 163, 164, 0x0000, 292, 167, - 168, 304, 350, 286, 308, 173, 0x0000, 379, 176, 295, - 178, 179, 180, 181, 293, 183, 184, 305, 351, 287, - 309, 189, 0x0000, 380, 192, 193, 194, 0x0000, 196, 266, - 264, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 0x0000, 209, 210, 211, 212, 288, 214, 215, 284, 217, - 218, 219, 220, 364, 348, 223, 224, 225, 226, 0x0000, - 228, 267, 265, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 0x0000, 241, 242, 243, 244, 289, 246, 247, - 285, 249, 250, 251, 252, 365, 349, 729, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_4[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 260, 312, 342, 164, 296, 315, 167, - 168, 352, 274, 290, 358, 173, 381, 175, 176, 261, - 731, 343, 180, 297, 316, 711, 184, 353, 275, 291, - 359, 330, 382, 331, 256, 193, 194, 195, 196, 197, - 198, 302, 268, 201, 280, 203, 278, 205, 206, 298, - 272, 325, 332, 310, 212, 213, 214, 215, 216, 370, - 218, 219, 220, 360, 362, 223, 257, 225, 226, 227, - 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, - 238, 299, 273, 326, 333, 311, 244, 245, 246, 247, - 248, 371, 250, 251, 252, 361, 363, 729, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_5[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 1025, 1026, 1027, 1028, 1029, 1030, 1031, - 1032, 1033, 1034, 1035, 1036, 173, 1038, 1039, 1040, 1041, - 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, - 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, - 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, - 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, - 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, - 1102, 1103, 8470, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 167, 1118, 1119, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_6[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 0x0000, 0x0000, 0x0000, 164, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 1548, 173, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1563, - 0x0000, 0x0000, 0x0000, 1567, 0x0000, 1569, 1570, 1571, 1572, 1573, - 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, - 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, - 1594, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1600, 1601, 1602, 1603, - 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, - 1614, 1615, 1616, 1617, 1618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_7[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 8216, 8217, 163, 8364, 8367, 166, 167, - 168, 169, 890, 171, 172, 173, 0x0000, 8213, 176, 177, - 178, 179, 900, 901, 902, 183, 904, 905, 906, 187, - 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, - 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, - 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_iso_8859_8[] = { - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 0x0000, 162, 163, 164, 165, 166, 167, - 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, - 188, 189, 190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8215, 1488, 1489, 1490, 1491, - 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, - 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, - 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_jis0208[] = { - 12288, 12289, 12290, 65292, 65294, 12539, 65306, 65307, 65311, 65281, - 12443, 12444, 180, 65344, 168, 65342, 65507, 65343, 12541, 12542, - 12445, 12446, 12291, 20189, 12293, 12294, 12295, 12540, 8213, 8208, - 65295, 65340, 65374, 8741, 65372, 8230, 8229, 8216, 8217, 8220, - 8221, 65288, 65289, 12308, 12309, 65339, 65341, 65371, 65373, 12296, - 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 65291, - 65293, 177, 215, 247, 65309, 8800, 65308, 65310, 8806, 8807, - 8734, 8756, 9794, 9792, 176, 8242, 8243, 8451, 65509, 65284, - 65504, 65505, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, - 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, - 9660, 8251, 12306, 8594, 8592, 8593, 8595, 12307, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8712, - 8715, 8838, 8839, 8834, 8835, 8746, 8745, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8743, 8744, 65506, 8658, 8660, - 8704, 8707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 8736, 8869, 8978, 8706, 8711, 8801, 8786, - 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8491, 8240, 9839, 9837, 9834, - 8224, 8225, 182, 0x0000, 0x0000, 0x0000, 0x0000, 9711, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 65296, 65297, 65298, 65299, 65300, 65301, 65302, - 65303, 65304, 65305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, - 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, - 65333, 65334, 65335, 65336, 65337, 65338, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, - 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, - 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 0x0000, 0x0000, - 0x0000, 0x0000, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, - 12361, 12362, 12363, 12364, 12365, 12366, 12367, 12368, 12369, 12370, - 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, - 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, - 12391, 12392, 12393, 12394, 12395, 12396, 12397, 12398, 12399, 12400, - 12401, 12402, 12403, 12404, 12405, 12406, 12407, 12408, 12409, 12410, - 12411, 12412, 12413, 12414, 12415, 12416, 12417, 12418, 12419, 12420, - 12421, 12422, 12423, 12424, 12425, 12426, 12427, 12428, 12429, 12430, - 12431, 12432, 12433, 12434, 12435, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12449, 12450, 12451, 12452, - 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, - 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, - 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, - 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, - 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, - 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, - 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, - 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, - 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, - 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, - 934, 935, 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, - 964, 965, 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 1040, 1041, 1042, 1043, 1044, 1045, - 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, - 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, - 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, - 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, - 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, - 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9472, 9474, - 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, - 9475, 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, - 9504, 9519, 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9312, 9313, - 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, - 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 8544, 8545, - 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 0x0000, 13129, - 13076, 13090, 13133, 13080, 13095, 13059, 13110, 13137, 13143, 13069, - 13094, 13091, 13099, 13130, 13115, 13212, 13213, 13214, 13198, 13199, - 13252, 13217, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 13179, 12317, 12319, 8470, 13261, 8481, 12964, 12965, 12966, 12967, - 12968, 12849, 12850, 12857, 13182, 13181, 13180, 8786, 8801, 8747, - 8750, 8721, 8730, 8869, 8736, 8735, 8895, 8757, 8745, 8746, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 20124, 21782, 23043, 38463, 21696, 24859, 25384, 23030, 36898, 33909, - 33564, 31312, 24746, 25569, 28197, 26093, 33894, 33446, 39925, 26771, - 22311, 26017, 25201, 23451, 22992, 34427, 39156, 32098, 32190, 39822, - 25110, 31903, 34999, 23433, 24245, 25353, 26263, 26696, 38343, 38797, - 26447, 20197, 20234, 20301, 20381, 20553, 22258, 22839, 22996, 23041, - 23561, 24799, 24847, 24944, 26131, 26885, 28858, 30031, 30064, 31227, - 32173, 32239, 32963, 33806, 34915, 35586, 36949, 36986, 21307, 20117, - 20133, 22495, 32946, 37057, 30959, 19968, 22769, 28322, 36920, 31282, - 33576, 33419, 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, - 39154, 28139, 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, - 23431, 28879, 32701, 36802, 38632, 21359, 40284, 31418, 19985, 30867, - 33276, 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, 28006, - 29916, 38287, 22082, 20113, 36939, 38642, 33615, 39180, 21473, 21942, - 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, 29787, 30408, - 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, 30410, 39365, - 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, 22576, 22852, - 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, 28948, 29017, - 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, 40219, 22633, - 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, 25276, 26106, - 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, 40644, 23713, - 27798, 33659, 20740, 23627, 25014, 33222, 26742, 29281, 20057, 20474, - 21368, 24681, 28201, 31311, 38899, 19979, 21270, 20206, 20309, 20285, - 20385, 20339, 21152, 21487, 22025, 22799, 23233, 23478, 23521, 31185, - 26247, 26524, 26550, 27468, 27827, 28779, 29634, 31117, 31166, 31292, - 31623, 33457, 33499, 33540, 33655, 33775, 33747, 34662, 35506, 22057, - 36008, 36838, 36942, 38686, 34442, 20420, 23784, 25105, 29273, 30011, - 33253, 33469, 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, - 22238, 22602, 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, - 25296, 25913, 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, - 33445, 34809, 38283, 38542, 35997, 20977, 21182, 22806, 21683, 23475, - 23830, 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, - 28012, 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, - 24275, 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, - 35282, 36203, 36611, 37101, 38307, 38548, 38761, 23398, 23731, 27005, - 38989, 38990, 25499, 31520, 27179, 27263, 26806, 39949, 28511, 21106, - 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, 36676, 19988, - 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, 33970, 37340, - 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, 33477, 29926, - 20094, 20355, 20896, 23506, 21002, 21208, 21223, 24059, 21914, 22570, - 23014, 23436, 23448, 23515, 24178, 24185, 24739, 24863, 24931, 25022, - 25563, 25954, 26577, 26707, 26874, 27454, 27475, 27735, 28450, 28567, - 28485, 29872, 29976, 30435, 30475, 31487, 31649, 31777, 32233, 32566, - 32752, 32925, 33382, 33694, 35251, 35532, 36011, 36996, 37969, 38291, - 38289, 38306, 38501, 38867, 39208, 33304, 20024, 21547, 23736, 24012, - 29609, 30284, 30524, 23721, 32747, 36107, 38593, 38929, 38996, 39000, - 20225, 20238, 21361, 21916, 22120, 22522, 22855, 23305, 23492, 23696, - 24076, 24190, 24524, 25582, 26426, 26071, 26082, 26399, 26827, 26820, - 27231, 24112, 27589, 27671, 27773, 30079, 31048, 23395, 31232, 32000, - 24509, 35215, 35352, 36020, 36215, 36556, 36637, 39138, 39438, 39740, - 20096, 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, - 30097, 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, - 21507, 21931, 26708, 27224, 35440, 30759, 26485, 40653, 21364, 23458, - 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, - 24339, 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, 31350, - 31406, 31496, 32026, 31998, 32102, 26087, 29275, 21435, 23621, 24040, - 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, 28417, 31142, - 39770, 20136, 20139, 20140, 20379, 20384, 20689, 20807, 31478, 20849, - 20982, 21332, 21281, 21375, 21483, 21932, 22659, 23777, 24375, 24394, - 24623, 24656, 24685, 25375, 25945, 27211, 27841, 29378, 29421, 30703, - 33016, 33029, 33288, 34126, 37111, 37857, 38911, 39255, 39514, 20208, - 20957, 23597, 26241, 26989, 23616, 26354, 26997, 29577, 26704, 31873, - 20677, 21220, 22343, 24062, 37670, 26020, 27427, 27453, 29748, 31105, - 31165, 31563, 32202, 33465, 33740, 34943, 35167, 35641, 36817, 37329, - 21535, 37504, 20061, 20534, 21477, 21306, 29399, 29590, 30697, 33510, - 36527, 39366, 39368, 39378, 20855, 24858, 34398, 21936, 31354, 20598, - 23507, 36935, 38533, 20018, 27355, 37351, 23633, 23624, 25496, 31391, - 27795, 38772, 36705, 31402, 29066, 38536, 31874, 26647, 32368, 26705, - 37740, 21234, 21531, 34219, 35347, 32676, 36557, 37089, 21350, 34952, - 31041, 20418, 20670, 21009, 20804, 21843, 22317, 29674, 22411, 22865, - 24418, 24452, 24693, 24950, 24935, 25001, 25522, 25658, 25964, 26223, - 26690, 28179, 30054, 31293, 31995, 32076, 32153, 32331, 32619, 33550, - 33610, 34509, 35336, 35427, 35686, 36605, 38938, 40335, 33464, 36814, - 39912, 21127, 25119, 25731, 28608, 38553, 26689, 20625, 27424, 27770, - 28500, 31348, 32080, 34880, 35363, 26376, 20214, 20537, 20518, 20581, - 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, 25010, 25080, - 25331, 25458, 26908, 27177, 29309, 29356, 29486, 30740, 30831, 32121, - 30476, 32937, 35211, 35609, 36066, 36562, 36963, 37749, 38522, 38997, - 39443, 40568, 20803, 21407, 21427, 24187, 24358, 28187, 28304, 29572, - 29694, 32067, 33335, 35328, 35578, 38480, 20046, 20491, 21476, 21628, - 22266, 22993, 23396, 24049, 24235, 24359, 25144, 25925, 26543, 28246, - 29392, 31946, 34996, 32929, 32993, 33776, 34382, 35463, 36328, 37431, - 38599, 39015, 40723, 20116, 20114, 20237, 21320, 21577, 21566, 23087, - 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, 35703, - 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, 20844, - 21151, 21177, 21246, 21402, 21475, 21521, 21518, 21897, 22353, 22434, - 22909, 23380, 23389, 23439, 24037, 24039, 24055, 24184, 24195, 24218, - 24247, 24344, 24658, 24908, 25239, 25304, 25511, 25915, 26114, 26179, - 26356, 26477, 26657, 26775, 27083, 27743, 27946, 28009, 28207, 28317, - 30002, 30343, 30828, 31295, 31968, 32005, 32024, 32094, 32177, 32789, - 32771, 32943, 32945, 33108, 33167, 33322, 33618, 34892, 34913, 35611, - 36002, 36092, 37066, 37237, 37489, 30783, 37628, 38308, 38477, 38917, - 39321, 39640, 40251, 21083, 21163, 21495, 21512, 22741, 25335, 28640, - 35946, 36703, 40633, 20811, 21051, 21578, 22269, 31296, 37239, 40288, - 40658, 29508, 28425, 33136, 29969, 24573, 24794, 39592, 29403, 36796, - 27492, 38915, 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, - 26118, 26681, 26801, 28151, 30165, 32058, 33390, 39746, 20123, 20304, - 21449, 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, - 37782, 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, - 22622, 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, - 37319, 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, - 38555, 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, - 27018, 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, - 25662, 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, - 31545, 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, - 34217, 38609, 30352, 39894, 25420, 37638, 39851, 30399, 26194, 19977, - 20632, 21442, 23665, 24808, 25746, 25955, 26719, 29158, 29642, 29987, - 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, 27531, - 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, 22763, - 22987, 22985, 23039, 23376, 23629, 24066, 24107, 24535, 24605, 25351, - 25903, 23388, 26031, 26045, 26088, 26525, 27490, 27515, 27663, 29509, - 31049, 31169, 31992, 32025, 32043, 32930, 33026, 33267, 35222, 35422, - 35433, 35430, 35468, 35566, 36039, 36060, 38604, 39164, 27503, 20107, - 20284, 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, - 27835, 29246, 29885, 30164, 30913, 31034, 32780, 32819, 33258, 33940, - 36766, 27728, 40575, 24335, 35672, 40235, 31482, 36600, 23437, 38635, - 19971, 21489, 22519, 22833, 23241, 23460, 24713, 28287, 28422, 30142, - 36074, 23455, 34048, 31712, 20594, 26612, 33437, 23649, 34122, 32286, - 33294, 20889, 23556, 25448, 36198, 26012, 29038, 31038, 32023, 32773, - 35613, 36554, 36974, 34503, 37034, 20511, 21242, 23610, 26451, 28796, - 29237, 37196, 37320, 37675, 33509, 23490, 24369, 24825, 20027, 21462, - 23432, 25163, 26417, 27530, 29417, 29664, 31278, 33131, 36259, 37202, - 39318, 20754, 21463, 21610, 23551, 25480, 27193, 32172, 38656, 22234, - 21454, 21608, 23447, 23601, 24030, 20462, 24833, 25342, 27954, 31168, - 31179, 32066, 32333, 32722, 33261, 33311, 33936, 34886, 35186, 35728, - 36468, 36655, 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, - 21313, 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, - 21460, 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, - 34899, 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, - 24490, 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, - 36981, 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, - 32210, 32626, 26360, 34223, 34295, 35576, 21161, 21465, 22899, 24207, - 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, - 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, 23567, - 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, 25307, 25484, - 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, 27189, 27836, - 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, 30813, 30977, - 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, 33931, 34121, - 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, 37284, 37478, - 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, 20887, 21104, - 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, 26454, 27972, - 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, 22516, 39166, - 25325, 26893, 27542, 29165, 32340, 32887, 33394, 35302, 39135, 34645, - 36785, 23611, 20280, 20449, 20405, 21767, 23072, 23517, 23529, 24515, - 24910, 25391, 26032, 26187, 26862, 27035, 28024, 28145, 30003, 30137, - 30495, 31070, 31206, 32051, 33251, 33455, 34218, 35242, 35386, 36523, - 36763, 36914, 37341, 38663, 20154, 20161, 20995, 22645, 22764, 23563, - 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, - 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, 27700, 28810, - 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, 29790, - 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, 26905, - 33733, 38935, 38592, 35070, 28548, 25722, 23544, 19990, 28716, 30045, - 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, 25919, 25972, - 26143, 26228, 26866, 26646, 27491, 28165, 29298, 29983, 30427, 31934, - 32854, 22768, 35069, 35199, 35488, 35475, 35531, 36893, 37266, 38738, - 38745, 25993, 31246, 33030, 38587, 24109, 24796, 25114, 26021, 26132, - 26512, 30707, 31309, 31821, 32318, 33034, 36012, 36196, 36321, 36447, - 30889, 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, - 38634, 32118, 33292, 34633, 20185, 20808, 21315, 21344, 23459, 23554, - 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, - 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, - 33146, 33307, 33337, 34214, 35438, 36046, 36341, 36984, 36983, 37549, - 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, 32341, - 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, 29401, - 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, 35380, - 38459, 36961, 40736, 20711, 21109, 21452, 21474, 20489, 21930, 22766, - 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, 25475, 25407, - 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, 29157, 20105, - 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, 33624, 33900, - 33980, 34299, 35013, 36208, 36865, 36973, 37783, 38684, 39442, 20687, - 22679, 24974, 33235, 34101, 36104, 36896, 20419, 20596, 21063, 21363, - 24687, 25417, 26463, 28204, 36275, 36895, 20439, 23646, 36042, 26063, - 32154, 21330, 34966, 20854, 25539, 23384, 23403, 23562, 25613, 26449, - 36956, 20182, 22810, 22826, 27760, 35409, 21822, 22549, 22949, 24816, - 25171, 26561, 33333, 26965, 38464, 39364, 39464, 20307, 22534, 23550, - 32784, 23729, 24111, 24453, 24608, 24907, 25140, 26367, 27888, 28382, - 32974, 33151, 33492, 34955, 36024, 36864, 36910, 38538, 40667, 39899, - 20195, 21488, 22823, 31532, 37261, 38988, 40441, 28381, 28711, 21331, - 21828, 23429, 25176, 25246, 25299, 27810, 28655, 29730, 35351, 37944, - 28609, 35582, 33592, 20967, 34552, 21482, 21481, 20294, 36948, 36784, - 22890, 33073, 24061, 31466, 36799, 26842, 35895, 29432, 40008, 27197, - 35504, 20025, 21336, 22022, 22374, 25285, 25506, 26086, 27470, 28129, - 28251, 28845, 30701, 31471, 31658, 32187, 32829, 32966, 34507, 35477, - 37723, 22243, 22727, 24382, 26029, 26262, 27264, 27573, 30007, 35527, - 20516, 30693, 22320, 24347, 24677, 26234, 27744, 30196, 31258, 32622, - 33268, 34584, 36933, 39347, 31689, 30044, 31481, 31569, 33988, 36880, - 31209, 31378, 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, - 26172, 26609, 27880, 34411, 34935, 35387, 37198, 37619, 39376, 27159, - 28710, 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, - 24086, 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, - 26397, 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, - 35548, 36229, 36339, 37530, 38263, 38914, 40165, 21189, 25431, 30452, - 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, 26894, 27084, - 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, 20291, 28460, - 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, 22775, 23340, - 32044, 29226, 21514, 37347, 40372, 20141, 20302, 20572, 20597, 21059, - 35998, 21576, 22564, 23450, 24093, 24213, 24237, 24311, 24351, 24716, - 25269, 25402, 25552, 26799, 27712, 30855, 31118, 31243, 32224, 33351, - 35330, 35558, 36420, 36883, 37048, 37165, 37336, 40718, 27877, 25688, - 25826, 25973, 28404, 30340, 31515, 36969, 37841, 28346, 21746, 24505, - 25764, 36685, 36845, 37444, 20856, 22635, 22825, 23637, 24215, 28155, - 32399, 29980, 36028, 36578, 39003, 28857, 20253, 27583, 28593, 30000, - 38651, 20814, 21520, 22581, 22615, 22956, 23648, 24466, 26007, 26460, - 28193, 30331, 33759, 36077, 36884, 37117, 37709, 30757, 30778, 21162, - 24230, 22303, 22900, 24594, 20498, 20826, 20908, 20941, 20992, 21776, - 22612, 22616, 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, - 26691, 26812, 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, - 30168, 31095, 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, - 34276, 35342, 35588, 35910, 36367, 36867, 36879, 37913, 38518, 38957, - 39472, 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, - 30643, 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, - 24499, 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, - 27233, 20984, 31361, 26932, 23626, 40182, 33515, 23493, 37193, 28702, - 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, - 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, - 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, - 20108, 23612, 24336, 36841, 21250, 36049, 32905, 34425, 24319, 26085, - 20083, 20837, 22914, 23615, 38894, 20219, 22922, 24525, 35469, 28641, - 31152, 31074, 23527, 33905, 29483, 29105, 24180, 24565, 25467, 25754, - 29123, 31896, 20035, 24316, 20043, 22492, 22178, 24745, 28611, 32013, - 33021, 33075, 33215, 36786, 35223, 34468, 24052, 25226, 25773, 35207, - 26487, 27874, 27966, 29750, 30772, 23110, 32629, 33453, 39340, 20467, - 24259, 25309, 25490, 25943, 26479, 30403, 29260, 32972, 32954, 36649, - 37197, 20493, 22521, 23186, 26757, 26995, 29028, 29437, 36023, 22770, - 36064, 38506, 36889, 34687, 31204, 30695, 33833, 20271, 21093, 21338, - 25293, 26575, 27850, 30333, 31636, 31893, 33334, 34180, 36843, 26333, - 28448, 29190, 32283, 33707, 39361, 40614, 20989, 31665, 30834, 31672, - 32903, 31560, 27368, 24161, 32908, 30033, 30048, 20843, 37474, 28300, - 30330, 37271, 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, - 22617, 34532, 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, - 26001, 26495, 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, - 34281, 36009, 31684, 37318, 29033, 38930, 39151, 25405, 26217, 30058, - 30436, 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, - 24754, 25161, 25209, 25259, 26000, 27604, 27852, 30130, 30382, 30865, - 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, 38750, 39131, - 27147, 31800, 20633, 23614, 24494, 26503, 27608, 29749, 30473, 32654, - 40763, 26570, 31255, 21305, 30091, 39661, 24422, 33181, 33777, 32920, - 24380, 24517, 30050, 31558, 36924, 26727, 23019, 23195, 32016, 30334, - 35628, 20469, 24426, 27161, 27703, 28418, 29922, 31080, 34920, 35413, - 35961, 24287, 25551, 30149, 31186, 33495, 37672, 37618, 33948, 34541, - 39981, 21697, 24428, 25996, 27996, 28693, 36007, 36051, 38971, 25935, - 29942, 19981, 20184, 22496, 22827, 23142, 23500, 20904, 24067, 24220, - 24598, 25206, 25975, 26023, 26222, 28014, 29238, 31526, 33104, 33178, - 33433, 35676, 36000, 36070, 36212, 38428, 38468, 20398, 25771, 27494, - 33310, 33889, 34154, 37096, 23553, 26963, 39080, 33914, 34135, 20239, - 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, - 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, - 25198, 28954, 22894, 31881, 31966, 32027, 38640, 25991, 32862, 19993, - 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, 38281, - 38491, 31859, 38913, 20731, 22721, 30294, 30887, 21029, 30629, 34065, - 31622, 20559, 22793, 29255, 31687, 32232, 36794, 36820, 36941, 20415, - 21193, 23081, 24321, 38829, 20445, 33303, 37610, 22275, 25429, 27497, - 29995, 35036, 36628, 31298, 21215, 22675, 24917, 25098, 26286, 27597, - 31807, 33769, 20515, 20472, 21253, 21574, 22577, 22857, 23453, 23792, - 23791, 23849, 24214, 25265, 25447, 25918, 26041, 26379, 27861, 27873, - 28921, 30770, 32299, 32990, 33459, 33804, 34028, 34562, 35090, 35370, - 35914, 37030, 37586, 39165, 40179, 40300, 20047, 20129, 20621, 21078, - 22346, 22952, 24125, 24536, 24537, 25151, 26292, 26395, 26576, 26834, - 20882, 32033, 32938, 33192, 35584, 35980, 36031, 37502, 38450, 21536, - 38956, 21271, 20693, 21340, 22696, 25778, 26420, 29287, 30566, 31302, - 37350, 21187, 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, - 30406, 25705, 30952, 39764, 40635, 22475, 22969, 26151, 26522, 27598, - 21737, 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, - 20451, 21448, 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, - 24930, 28288, 28459, 34067, 21619, 26410, 39749, 24051, 31637, 23724, - 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, 27665, 30496, - 21209, 22818, 28961, 29279, 30683, 38695, 40289, 26891, 23167, 23064, - 20901, 21517, 21629, 26126, 30431, 36855, 37528, 40180, 23018, 29277, - 28357, 20813, 26825, 32191, 32236, 38754, 40634, 25720, 27169, 33538, - 22916, 23391, 27611, 29467, 30450, 32178, 32791, 33945, 20786, 26408, - 40665, 30446, 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, - 24758, 32011, 38272, 21249, 20063, 20918, 22812, 29242, 32822, 37326, - 24357, 30690, 21380, 24441, 32004, 34220, 35379, 36493, 38742, 26611, - 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, 21807, 20305, - 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, 26377, 26586, - 28263, 28044, 29494, 29495, 30001, 31056, 35029, 35480, 36938, 37009, - 37109, 38596, 34701, 22805, 20104, 20313, 19982, 35465, 36671, 38928, - 20653, 24188, 22934, 23481, 24248, 25562, 25594, 25793, 26332, 26954, - 27096, 27915, 28342, 29076, 29992, 31407, 32650, 32768, 33865, 33993, - 35201, 35617, 36362, 36965, 38525, 39178, 24958, 25233, 27442, 27779, - 28020, 32716, 32764, 28096, 32645, 34746, 35064, 26469, 33713, 38972, - 38647, 27931, 32097, 33853, 37226, 20081, 21365, 23888, 27396, 28651, - 34253, 34349, 35239, 21033, 21519, 23653, 26446, 26792, 29702, 29827, - 30178, 35023, 35041, 37324, 38626, 38520, 24459, 29575, 31435, 33870, - 25504, 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, - 31452, 40845, 20406, 24942, 26053, 34396, 20102, 20142, 20698, 20001, - 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, 31260, 31975, - 33391, 35538, 36988, 37327, 38517, 38936, 21147, 32209, 20523, 21400, - 26519, 28107, 29136, 29747, 33256, 36650, 38563, 40023, 40607, 29792, - 22593, 28057, 32047, 39006, 20196, 20278, 20363, 20919, 21169, 23994, - 24604, 29618, 31036, 33491, 37428, 38583, 38646, 38666, 40599, 40802, - 26278, 27508, 21015, 21155, 28872, 35010, 24265, 24651, 24976, 28451, - 29001, 31806, 32244, 32879, 34030, 36899, 37676, 21570, 39791, 27347, - 28809, 36034, 36335, 38706, 21172, 23105, 24266, 24324, 26391, 27004, - 27028, 28010, 28431, 29282, 29436, 31725, 32769, 32894, 34635, 37070, - 20845, 40595, 31108, 32907, 37682, 35542, 20525, 21644, 35441, 27498, - 36036, 33031, 24785, 26528, 40434, 20121, 20120, 39952, 35435, 34241, - 34152, 26880, 28286, 30871, 33109, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24332, 19984, - 19989, 20010, 20017, 20022, 20028, 20031, 20034, 20054, 20056, 20098, - 20101, 35947, 20106, 33298, 24333, 20110, 20126, 20127, 20128, 20130, - 20144, 20147, 20150, 20174, 20173, 20164, 20166, 20162, 20183, 20190, - 20205, 20191, 20215, 20233, 20314, 20272, 20315, 20317, 20311, 20295, - 20342, 20360, 20367, 20376, 20347, 20329, 20336, 20369, 20335, 20358, - 20374, 20760, 20436, 20447, 20430, 20440, 20443, 20433, 20442, 20432, - 20452, 20453, 20506, 20520, 20500, 20522, 20517, 20485, 20252, 20470, - 20513, 20521, 20524, 20478, 20463, 20497, 20486, 20547, 20551, 26371, - 20565, 20560, 20552, 20570, 20566, 20588, 20600, 20608, 20634, 20613, - 20660, 20658, 20681, 20682, 20659, 20674, 20694, 20702, 20709, 20717, - 20707, 20718, 20729, 20725, 20745, 20737, 20738, 20758, 20757, 20756, - 20762, 20769, 20794, 20791, 20796, 20795, 20799, 20800, 20818, 20812, - 20820, 20834, 31480, 20841, 20842, 20846, 20864, 20866, 22232, 20876, - 20873, 20879, 20881, 20883, 20885, 20886, 20900, 20902, 20898, 20905, - 20906, 20907, 20915, 20913, 20914, 20912, 20917, 20925, 20933, 20937, - 20955, 20960, 34389, 20969, 20973, 20976, 20981, 20990, 20996, 21003, - 21012, 21006, 21031, 21034, 21038, 21043, 21049, 21071, 21060, 21067, - 21068, 21086, 21076, 21098, 21108, 21097, 21107, 21119, 21117, 21133, - 21140, 21138, 21105, 21128, 21137, 36776, 36775, 21164, 21165, 21180, - 21173, 21185, 21197, 21207, 21214, 21219, 21222, 39149, 21216, 21235, - 21237, 21240, 21241, 21254, 21256, 30008, 21261, 21264, 21263, 21269, - 21274, 21283, 21295, 21297, 21299, 21304, 21312, 21318, 21317, 19991, - 21321, 21325, 20950, 21342, 21353, 21358, 22808, 21371, 21367, 21378, - 21398, 21408, 21414, 21413, 21422, 21424, 21430, 21443, 31762, 38617, - 21471, 26364, 29166, 21486, 21480, 21485, 21498, 21505, 21565, 21568, - 21548, 21549, 21564, 21550, 21558, 21545, 21533, 21582, 21647, 21621, - 21646, 21599, 21617, 21623, 21616, 21650, 21627, 21632, 21622, 21636, - 21648, 21638, 21703, 21666, 21688, 21669, 21676, 21700, 21704, 21672, - 21675, 21698, 21668, 21694, 21692, 21720, 21733, 21734, 21775, 21780, - 21757, 21742, 21741, 21754, 21730, 21817, 21824, 21859, 21836, 21806, - 21852, 21829, 21846, 21847, 21816, 21811, 21853, 21913, 21888, 21679, - 21898, 21919, 21883, 21886, 21912, 21918, 21934, 21884, 21891, 21929, - 21895, 21928, 21978, 21957, 21983, 21956, 21980, 21988, 21972, 22036, - 22007, 22038, 22014, 22013, 22043, 22009, 22094, 22096, 29151, 22068, - 22070, 22066, 22072, 22123, 22116, 22063, 22124, 22122, 22150, 22144, - 22154, 22176, 22164, 22159, 22181, 22190, 22198, 22196, 22210, 22204, - 22209, 22211, 22208, 22216, 22222, 22225, 22227, 22231, 22254, 22265, - 22272, 22271, 22276, 22281, 22280, 22283, 22285, 22291, 22296, 22294, - 21959, 22300, 22310, 22327, 22328, 22350, 22331, 22336, 22351, 22377, - 22464, 22408, 22369, 22399, 22409, 22419, 22432, 22451, 22436, 22442, - 22448, 22467, 22470, 22484, 22482, 22483, 22538, 22486, 22499, 22539, - 22553, 22557, 22642, 22561, 22626, 22603, 22640, 27584, 22610, 22589, - 22649, 22661, 22713, 22687, 22699, 22714, 22750, 22715, 22712, 22702, - 22725, 22739, 22737, 22743, 22745, 22744, 22757, 22748, 22756, 22751, - 22767, 22778, 22777, 22779, 22780, 22781, 22786, 22794, 22800, 22811, - 26790, 22821, 22828, 22829, 22834, 22840, 22846, 31442, 22869, 22864, - 22862, 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, - 22941, 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, 23001, - 23002, 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, - 23093, 23094, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, - 23267, 23255, 23270, 23273, 23254, 23290, 23291, 23308, 23307, 23318, - 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, - 23386, 23387, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, - 23424, 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, 23524, - 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, 23559, - 23560, 23565, 23571, 23584, 23586, 23592, 23608, 23609, 23617, 23622, - 23630, 23635, 23632, 23631, 23409, 23660, 23662, 20066, 23670, 23673, - 23692, 23697, 23700, 22939, 23723, 23739, 23734, 23740, 23735, 23749, - 23742, 23751, 23769, 23785, 23805, 23802, 23789, 23948, 23786, 23819, - 23829, 23831, 23900, 23839, 23835, 23825, 23828, 23842, 23834, 23833, - 23832, 23884, 23890, 23886, 23883, 23916, 23923, 23926, 23943, 23940, - 23938, 23970, 23965, 23980, 23982, 23997, 23952, 23991, 23996, 24009, - 24013, 24019, 24018, 24022, 24027, 24043, 24050, 24053, 24075, 24090, - 24089, 24081, 24091, 24118, 24119, 24132, 24131, 24128, 24142, 24151, - 24148, 24159, 24162, 24164, 24135, 24181, 24182, 24186, 40636, 24191, - 24224, 24257, 24258, 24264, 24272, 24271, 24278, 24291, 24285, 24282, - 24283, 24290, 24289, 24296, 24297, 24300, 24305, 24307, 24304, 24308, - 24312, 24318, 24323, 24329, 24413, 24412, 24331, 24337, 24342, 24361, - 24365, 24376, 24385, 24392, 24396, 24398, 24367, 24401, 24406, 24407, - 24409, 24417, 24429, 24435, 24439, 24451, 24450, 24447, 24458, 24456, - 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, 24534, - 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, 24601, - 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, 24634, - 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, 24643, - 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, 24730, - 24708, 24731, 24726, 24727, 24722, 24743, 24715, 24801, 24760, 24800, - 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, 24838, - 24822, 24823, 24832, 24820, 24826, 24835, 24865, 24827, 24817, 24845, - 24846, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, 24884, - 24893, 24898, 24900, 24947, 24951, 24920, 24921, 24922, 24939, 24948, - 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, - 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, - 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, - 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, 25096, 25097, - 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, 25138, - 25139, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, 25218, - 25225, 25214, 25234, 25235, 25238, 25300, 25219, 25236, 25303, 25297, - 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, 25282, - 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, 25327, - 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, 25515, - 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, 25577, - 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, 25606, - 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, 25718, - 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, 25810, - 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, 25824, 25825, - 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, 25856, 25853, - 25880, 25884, 25861, 25892, 25891, 25899, 25908, 25909, 25911, 25910, - 25912, 30027, 25928, 25942, 25941, 25933, 25944, 25950, 25949, 25970, - 25976, 25986, 25987, 35722, 26011, 26015, 26027, 26039, 26051, 26054, - 26049, 26052, 26060, 26066, 26075, 26073, 26080, 26081, 26097, 26482, - 26122, 26115, 26107, 26483, 26165, 26166, 26164, 26140, 26191, 26180, - 26185, 26177, 26206, 26205, 26212, 26215, 26216, 26207, 26210, 26224, - 26243, 26248, 26254, 26249, 26244, 26264, 26269, 26305, 26297, 26313, - 26302, 26300, 26308, 26296, 26326, 26330, 26336, 26175, 26342, 26345, - 26352, 26357, 26359, 26383, 26390, 26398, 26406, 26407, 38712, 26414, - 26431, 26422, 26433, 26424, 26423, 26438, 26462, 26464, 26457, 26467, - 26468, 26505, 26480, 26537, 26492, 26474, 26508, 26507, 26534, 26529, - 26501, 26551, 26607, 26548, 26604, 26547, 26601, 26552, 26596, 26590, - 26589, 26594, 26606, 26553, 26574, 26566, 26599, 27292, 26654, 26694, - 26665, 26688, 26701, 26674, 26702, 26803, 26667, 26713, 26723, 26743, - 26751, 26783, 26767, 26797, 26772, 26781, 26779, 26755, 27310, 26809, - 26740, 26805, 26784, 26810, 26895, 26765, 26750, 26881, 26826, 26888, - 26840, 26914, 26918, 26849, 26892, 26829, 26836, 26855, 26837, 26934, - 26898, 26884, 26839, 26851, 26917, 26873, 26848, 26863, 26920, 26922, - 26906, 26915, 26913, 26822, 27001, 26999, 26972, 27000, 26987, 26964, - 27006, 26990, 26937, 26996, 26941, 26969, 26928, 26977, 26974, 26973, - 27009, 26986, 27058, 27054, 27088, 27071, 27073, 27091, 27070, 27086, - 23528, 27082, 27101, 27067, 27075, 27047, 27182, 27025, 27040, 27036, - 27029, 27060, 27102, 27112, 27138, 27163, 27135, 27402, 27129, 27122, - 27111, 27141, 27057, 27166, 27117, 27156, 27115, 27146, 27154, 27329, - 27171, 27155, 27204, 27148, 27250, 27190, 27256, 27207, 27234, 27225, - 27238, 27208, 27192, 27170, 27280, 27277, 27296, 27268, 27298, 27299, - 27287, 34327, 27323, 27331, 27330, 27320, 27315, 27308, 27358, 27345, - 27359, 27306, 27354, 27370, 27387, 27397, 34326, 27386, 27410, 27414, - 39729, 27423, 27448, 27447, 30428, 27449, 39150, 27463, 27459, 27465, - 27472, 27481, 27476, 27483, 27487, 27489, 27512, 27513, 27519, 27520, - 27524, 27523, 27533, 27544, 27541, 27550, 27556, 27562, 27563, 27567, - 27570, 27569, 27571, 27575, 27580, 27590, 27595, 27603, 27615, 27628, - 27627, 27635, 27631, 40638, 27656, 27667, 27668, 27675, 27684, 27683, - 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, 27774, - 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, 27845, - 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, 27935, - 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, 27916, - 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, 28037, - 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, 28126, - 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, 28142, - 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, 28203, - 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, 28216, - 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, 28338, - 28372, 28373, 28303, 28325, 28354, 28319, 28481, 28433, 28748, 28396, - 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, 28435, - 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, 28525, - 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, 28577, - 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, 28657, - 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, 28699, - 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, 28771, - 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, 28875, - 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, 29030, - 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, 29100, - 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, 29159, - 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, 29228, - 29232, 29234, 29243, 29244, 29247, 29248, 29254, 29259, 29272, 29300, - 29310, 29314, 29313, 29319, 29330, 29334, 29346, 29351, 29369, 29362, - 29379, 29382, 29380, 29390, 29394, 29410, 29408, 29409, 29433, 29431, - 20495, 29463, 29450, 29468, 29462, 29469, 29492, 29487, 29481, 29477, - 29502, 29518, 29519, 40664, 29527, 29546, 29544, 29552, 29560, 29557, - 29563, 29562, 29640, 29619, 29646, 29627, 29632, 29669, 29678, 29662, - 29858, 29701, 29807, 29733, 29688, 29746, 29754, 29781, 29759, 29791, - 29785, 29761, 29788, 29801, 29808, 29795, 29802, 29814, 29822, 29835, - 29854, 29863, 29898, 29903, 29908, 29681, 29920, 29923, 29927, 29929, - 29934, 29938, 29936, 29937, 29944, 29943, 29956, 29955, 29957, 29964, - 29966, 29965, 29973, 29971, 29982, 29990, 29996, 30012, 30020, 30029, - 30026, 30025, 30043, 30022, 30042, 30057, 30052, 30055, 30059, 30061, - 30072, 30070, 30086, 30087, 30068, 30090, 30089, 30082, 30100, 30106, - 30109, 30117, 30115, 30146, 30131, 30147, 30133, 30141, 30136, 30140, - 30129, 30157, 30154, 30162, 30169, 30179, 30174, 30206, 30207, 30204, - 30209, 30192, 30202, 30194, 30195, 30219, 30221, 30217, 30239, 30247, - 30240, 30241, 30242, 30244, 30260, 30256, 30267, 30279, 30280, 30278, - 30300, 30296, 30305, 30306, 30312, 30313, 30314, 30311, 30316, 30320, - 30322, 30326, 30328, 30332, 30336, 30339, 30344, 30347, 30350, 30358, - 30355, 30361, 30362, 30384, 30388, 30392, 30393, 30394, 30402, 30413, - 30422, 30418, 30430, 30433, 30437, 30439, 30442, 34351, 30459, 30472, - 30471, 30468, 30505, 30500, 30494, 30501, 30502, 30491, 30519, 30520, - 30535, 30554, 30568, 30571, 30555, 30565, 30591, 30590, 30585, 30606, - 30603, 30609, 30624, 30622, 30640, 30646, 30649, 30655, 30652, 30653, - 30651, 30663, 30669, 30679, 30682, 30684, 30691, 30702, 30716, 30732, - 30738, 31014, 30752, 31018, 30789, 30862, 30836, 30854, 30844, 30874, - 30860, 30883, 30901, 30890, 30895, 30929, 30918, 30923, 30932, 30910, - 30908, 30917, 30922, 30956, 30951, 30938, 30973, 30964, 30983, 30994, - 30993, 31001, 31020, 31019, 31040, 31072, 31063, 31071, 31066, 31061, - 31059, 31098, 31103, 31114, 31133, 31143, 40779, 31146, 31150, 31155, - 31161, 31162, 31177, 31189, 31207, 31212, 31201, 31203, 31240, 31245, - 31256, 31257, 31264, 31263, 31104, 31281, 31291, 31294, 31287, 31299, - 31319, 31305, 31329, 31330, 31337, 40861, 31344, 31353, 31357, 31368, - 31383, 31381, 31384, 31382, 31401, 31432, 31408, 31414, 31429, 31428, - 31423, 36995, 31431, 31434, 31437, 31439, 31445, 31443, 31449, 31450, - 31453, 31457, 31458, 31462, 31469, 31472, 31490, 31503, 31498, 31494, - 31539, 31512, 31513, 31518, 31541, 31528, 31542, 31568, 31610, 31492, - 31565, 31499, 31564, 31557, 31605, 31589, 31604, 31591, 31600, 31601, - 31596, 31598, 31645, 31640, 31647, 31629, 31644, 31642, 31627, 31634, - 31631, 31581, 31641, 31691, 31681, 31692, 31695, 31668, 31686, 31709, - 31721, 31761, 31764, 31718, 31717, 31840, 31744, 31751, 31763, 31731, - 31735, 31767, 31757, 31734, 31779, 31783, 31786, 31775, 31799, 31787, - 31805, 31820, 31811, 31828, 31823, 31808, 31824, 31832, 31839, 31844, - 31830, 31845, 31852, 31861, 31875, 31888, 31908, 31917, 31906, 31915, - 31905, 31912, 31923, 31922, 31921, 31918, 31929, 31933, 31936, 31941, - 31938, 31960, 31954, 31964, 31970, 39739, 31983, 31986, 31988, 31990, - 31994, 32006, 32002, 32028, 32021, 32010, 32069, 32075, 32046, 32050, - 32063, 32053, 32070, 32115, 32086, 32078, 32114, 32104, 32110, 32079, - 32099, 32147, 32137, 32091, 32143, 32125, 32155, 32186, 32174, 32163, - 32181, 32199, 32189, 32171, 32317, 32162, 32175, 32220, 32184, 32159, - 32176, 32216, 32221, 32228, 32222, 32251, 32242, 32225, 32261, 32266, - 32291, 32289, 32274, 32305, 32287, 32265, 32267, 32290, 32326, 32358, - 32315, 32309, 32313, 32323, 32311, 32306, 32314, 32359, 32349, 32342, - 32350, 32345, 32346, 32377, 32362, 32361, 32380, 32379, 32387, 32213, - 32381, 36782, 32383, 32392, 32393, 32396, 32402, 32400, 32403, 32404, - 32406, 32398, 32411, 32412, 32568, 32570, 32581, 32588, 32589, 32590, - 32592, 32593, 32597, 32596, 32600, 32607, 32608, 32616, 32617, 32615, - 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, 32669, - 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, 32709, - 32710, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, 39132, - 32774, 32772, 32779, 32786, 32792, 32793, 32796, 32801, 32808, 32831, - 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, 32872, 32883, - 32882, 32880, 32886, 32889, 32893, 32895, 32900, 32902, 32901, 32923, - 32915, 32922, 32941, 20880, 32940, 32987, 32997, 32985, 32989, 32964, - 32986, 32982, 33033, 33007, 33009, 33051, 33065, 33059, 33071, 33099, - 38539, 33094, 33086, 33107, 33105, 33020, 33137, 33134, 33125, 33126, - 33140, 33155, 33160, 33162, 33152, 33154, 33184, 33173, 33188, 33187, - 33119, 33171, 33193, 33200, 33205, 33214, 33208, 33213, 33216, 33218, - 33210, 33225, 33229, 33233, 33241, 33240, 33224, 33242, 33247, 33248, - 33255, 33274, 33275, 33278, 33281, 33282, 33285, 33287, 33290, 33293, - 33296, 33302, 33321, 33323, 33336, 33331, 33344, 33369, 33368, 33373, - 33370, 33375, 33380, 33378, 33384, 33386, 33387, 33326, 33393, 33399, - 33400, 33406, 33421, 33426, 33451, 33439, 33467, 33452, 33505, 33507, - 33503, 33490, 33524, 33523, 33530, 33683, 33539, 33531, 33529, 33502, - 33542, 33500, 33545, 33497, 33589, 33588, 33558, 33586, 33585, 33600, - 33593, 33616, 33605, 33583, 33579, 33559, 33560, 33669, 33690, 33706, - 33695, 33698, 33686, 33571, 33678, 33671, 33674, 33660, 33717, 33651, - 33653, 33696, 33673, 33704, 33780, 33811, 33771, 33742, 33789, 33795, - 33752, 33803, 33729, 33783, 33799, 33760, 33778, 33805, 33826, 33824, - 33725, 33848, 34054, 33787, 33901, 33834, 33852, 34138, 33924, 33911, - 33899, 33965, 33902, 33922, 33897, 33862, 33836, 33903, 33913, 33845, - 33994, 33890, 33977, 33983, 33951, 34009, 33997, 33979, 34010, 34000, - 33985, 33990, 34006, 33953, 34081, 34047, 34036, 34071, 34072, 34092, - 34079, 34069, 34068, 34044, 34112, 34147, 34136, 34120, 34113, 34306, - 34123, 34133, 34176, 34212, 34184, 34193, 34186, 34216, 34157, 34196, - 34203, 34282, 34183, 34204, 34167, 34174, 34192, 34249, 34234, 34255, - 34233, 34256, 34261, 34269, 34277, 34268, 34297, 34314, 34323, 34315, - 34302, 34298, 34310, 34338, 34330, 34352, 34367, 34381, 20053, 34388, - 34399, 34407, 34417, 34451, 34467, 34473, 34474, 34443, 34444, 34486, - 34479, 34500, 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, - 34540, 34527, 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, - 34577, 34569, 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, - 34601, 34586, 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, - 34670, 34649, 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, - 34763, 34749, 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, - 34747, 34799, 34802, 34784, 34831, 34829, 34814, 34806, 34807, 34830, - 34770, 34833, 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, - 34875, 34884, 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, - 34974, 34933, 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, - 34978, 34957, 34980, 34992, 35007, 34993, 35011, 35012, 35028, 35032, - 35033, 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, - 35082, 35091, 35139, 35102, 35109, 35114, 35115, 35137, 35140, 35131, - 35126, 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, - 35183, 35188, 35191, 35198, 35203, 35208, 35210, 35219, 35224, 35233, - 35241, 35238, 35244, 35247, 35250, 35258, 35261, 35263, 35264, 35290, - 35292, 35293, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, - 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, - 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, 35493, 35494, - 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, - 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, - 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, - 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, - 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, 35730, 35731, - 35734, 35737, 35738, 35898, 35905, 35903, 35912, 35916, 35918, 35920, - 35925, 35938, 35948, 35960, 35962, 35970, 35977, 35973, 35978, 35981, - 35982, 35988, 35964, 35992, 25117, 36013, 36010, 36029, 36018, 36019, - 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, 36090, 36091, - 36100, 36101, 36106, 36103, 36111, 36109, 36112, 40782, 36115, 36045, - 36116, 36118, 36199, 36205, 36209, 36211, 36225, 36249, 36290, 36286, - 36282, 36303, 36314, 36310, 36300, 36315, 36299, 36330, 36331, 36319, - 36323, 36348, 36360, 36361, 36351, 36381, 36382, 36368, 36383, 36418, - 36405, 36400, 36404, 36426, 36423, 36425, 36428, 36432, 36424, 36441, - 36452, 36448, 36394, 36451, 36437, 36470, 36466, 36476, 36481, 36487, - 36485, 36484, 36491, 36490, 36499, 36497, 36500, 36505, 36522, 36513, - 36524, 36528, 36550, 36529, 36542, 36549, 36552, 36555, 36571, 36579, - 36604, 36603, 36587, 36606, 36618, 36613, 36629, 36626, 36633, 36627, - 36636, 36639, 36635, 36620, 36646, 36659, 36667, 36665, 36677, 36674, - 36670, 36684, 36681, 36678, 36686, 36695, 36700, 36706, 36707, 36708, - 36764, 36767, 36771, 36781, 36783, 36791, 36826, 36837, 36834, 36842, - 36847, 36999, 36852, 36869, 36857, 36858, 36881, 36885, 36897, 36877, - 36894, 36886, 36875, 36903, 36918, 36917, 36921, 36856, 36943, 36944, - 36945, 36946, 36878, 36937, 36926, 36950, 36952, 36958, 36968, 36975, - 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, 37001, 37007, - 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, 37122, 37138, - 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, 37225, 37235, - 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, 37301, 37300, - 37306, 37312, 37313, 37321, 37323, 37328, 37334, 37343, 37345, 37339, - 37372, 37365, 37366, 37406, 37375, 37396, 37420, 37397, 37393, 37470, - 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, 37456, 37532, - 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, 37647, 37626, - 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, 37691, 37724, - 37728, 37756, 37742, 37718, 37808, 37804, 37805, 37780, 37817, 37846, - 37847, 37864, 37861, 37848, 37827, 37853, 37840, 37832, 37860, 37914, - 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, 37921, 37946, - 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, 37417, 38000, - 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, 38274, 38279, - 38282, 38292, 38294, 38296, 38297, 38304, 38312, 38311, 38317, 38332, - 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, 38357, 38356, - 38358, 38364, 38369, 38373, 38370, 38433, 38440, 38446, 38447, 38466, - 38476, 38479, 38475, 38519, 38492, 38494, 38493, 38495, 38502, 38514, - 38508, 38541, 38552, 38549, 38551, 38570, 38567, 38577, 38578, 38576, - 38580, 38582, 38584, 38585, 38606, 38603, 38601, 38605, 35149, 38620, - 38669, 38613, 38649, 38660, 38662, 38664, 38675, 38670, 38673, 38671, - 38678, 38681, 38692, 38698, 38704, 38713, 38717, 38718, 38724, 38726, - 38728, 38722, 38729, 38748, 38752, 38756, 38758, 38760, 21202, 38763, - 38769, 38777, 38789, 38780, 38785, 38778, 38790, 38795, 38799, 38800, - 38812, 38824, 38822, 38819, 38835, 38836, 38851, 38854, 38856, 38859, - 38876, 38893, 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, - 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, 39023, 39024, - 39025, 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, - 39145, 39147, 39171, 39177, 39186, 39188, 39192, 39201, 39197, 39198, - 39204, 39200, 39212, 39214, 39229, 39230, 39234, 39241, 39237, 39248, - 39243, 39249, 39250, 39244, 39253, 39319, 39320, 39333, 39341, 39342, - 39356, 39391, 39387, 39389, 39384, 39377, 39405, 39406, 39409, 39410, - 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, 39479, 39493, - 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, 39519, 39522, - 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, 39616, 39631, - 39633, 39635, 39636, 39646, 39647, 39650, 39651, 39654, 39663, 39659, - 39662, 39668, 39665, 39671, 39675, 39686, 39704, 39706, 39711, 39714, - 39715, 39717, 39719, 39720, 39721, 39722, 39726, 39727, 39730, 39748, - 39747, 39759, 39757, 39758, 39761, 39768, 39796, 39827, 39811, 39825, - 39830, 39831, 39839, 39840, 39848, 39860, 39872, 39882, 39865, 39878, - 39887, 39889, 39890, 39907, 39906, 39908, 39892, 39905, 39994, 39922, - 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, 39954, - 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, 39986, - 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, 40176, - 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, 40223, - 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, 40285, 40286, - 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, 40303, 40314, - 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, 40378, 40390, - 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, 40445, 40474, - 40475, 40478, 40565, 40569, 40573, 40577, 40584, 40587, 40588, 40594, - 40597, 40593, 40605, 40613, 40617, 40632, 40618, 40621, 38753, 40652, - 40654, 40655, 40656, 40660, 40668, 40670, 40669, 40672, 40677, 40680, - 40687, 40692, 40694, 40695, 40697, 40699, 40700, 40701, 40711, 40712, - 30391, 40725, 40737, 40748, 40766, 40778, 40786, 40788, 40803, 40799, - 40800, 40801, 40806, 40807, 40812, 40810, 40823, 40818, 40822, 40853, - 40860, 40864, 22575, 27079, 36953, 29796, 20956, 29081, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 32394, 35100, 37704, 37512, 34012, 20425, 28859, 26161, - 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, 20227, 20281, - 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, 20479, 20510, - 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, 20893, 20926, - 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, 21284, 21362, - 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, 21894, 22361, - 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, 22795, 22867, - 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, 23512, 23532, - 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, 23917, 23992, - 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, 24709, 24714, - 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, 25107, 25254, - 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, 26121, 26158, - 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, 26290, - 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, 26625, 26692, - 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, - 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, - 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, - 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, - 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, 29182, 29361, - 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, - 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, 29953, 30063, - 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, - 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, 31131, 31441, - 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, 32160, 32214, - 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, 33782, 33864, - 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, 34823, 35061, - 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, 35667, 35711, - 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, 36967, 37086, - 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, 37348, 37349, - 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, 37457, 37433, - 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, 64039, 37589, - 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, 37661, 37634, - 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, 37960, 38290, - 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, 38735, 38737, - 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, 39502, 39641, - 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, 40299, 64045, - 40473, 40657, 0x0000, 0x0000, 8560, 8561, 8562, 8563, 8564, 8565, - 8566, 8567, 8568, 8569, 65506, 65508, 65287, 65282, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8560, 8561, 8562, 8563, - 8564, 8565, 8566, 8567, 8568, 8569, 8544, 8545, 8546, 8547, - 8548, 8549, 8550, 8551, 8552, 8553, 65506, 65508, 65287, 65282, - 12849, 8470, 8481, 8757, 32394, 35100, 37704, 37512, 34012, 20425, - 28859, 26161, 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, - 20227, 20281, 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, - 20479, 20510, 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, - 20893, 20926, 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, - 21284, 21362, 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, - 21894, 22361, 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, - 22795, 22867, 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, - 23512, 23532, 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, - 23917, 23992, 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, - 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, - 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, - 26121, 26158, 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, - 26272, 26290, 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, - 26625, 26692, 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, - 27206, 27251, 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, - 27866, 27908, 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, - 28217, 28252, 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, - 28712, 28805, 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, - 29182, 29361, 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, - 29650, 29703, 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, - 29953, 30063, 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, - 30753, 30798, 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, - 31131, 31441, 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, - 32160, 32214, 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, - 33782, 33864, 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, - 34823, 35061, 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, - 35667, 35711, 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, - 36967, 37086, 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, - 37348, 37349, 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, - 37457, 37433, 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, - 64039, 37589, 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, - 37661, 37634, 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, - 37960, 38290, 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, - 38735, 38737, 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, - 39502, 39641, 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, - 40299, 64045, 40473, 40657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - -}; - -static const unsigned long myhtml_encoding_map_jis0212[] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 728, 711, - 184, 729, 733, 175, 731, 730, 65374, 900, 901, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 161, 166, 191, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 186, 170, - 169, 174, 8482, 164, 8470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 902, 904, 905, 906, 938, 0x0000, - 908, 0x0000, 910, 939, 0x0000, 911, 0x0000, 0x0000, 0x0000, 0x0000, - 940, 941, 942, 943, 970, 912, 972, 962, 973, 971, - 944, 974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1026, 1027, 1028, - 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, 1039, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1106, 1107, 1108, 1109, 1110, - 1111, 1112, 1113, 1114, 1115, 1116, 1118, 1119, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 198, 272, 0x0000, 294, 0x0000, 306, 0x0000, 321, - 319, 0x0000, 330, 216, 338, 0x0000, 358, 222, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 230, 273, 240, 295, 305, 307, - 312, 322, 320, 329, 331, 248, 339, 223, 359, 254, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 193, 192, 196, 194, - 258, 461, 256, 260, 197, 195, 262, 264, 268, 199, - 266, 270, 201, 200, 203, 202, 282, 278, 274, 280, - 0x0000, 284, 286, 290, 288, 292, 205, 204, 207, 206, - 463, 304, 298, 302, 296, 308, 310, 313, 317, 315, - 323, 327, 325, 209, 211, 210, 214, 212, 465, 336, - 332, 213, 340, 344, 342, 346, 348, 352, 350, 356, - 354, 218, 217, 220, 219, 364, 467, 368, 362, 370, - 366, 360, 471, 475, 473, 469, 372, 221, 376, 374, - 377, 381, 379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 225, 224, 228, 226, 259, 462, 257, 261, 229, 227, - 263, 265, 269, 231, 267, 271, 233, 232, 235, 234, - 283, 279, 275, 281, 501, 285, 287, 0x0000, 289, 293, - 237, 236, 239, 238, 464, 0x0000, 299, 303, 297, 309, - 311, 314, 318, 316, 324, 328, 326, 241, 243, 242, - 246, 244, 466, 337, 333, 245, 341, 345, 343, 347, - 349, 353, 351, 357, 355, 250, 249, 252, 251, 365, - 468, 369, 363, 371, 367, 361, 472, 476, 474, 470, - 373, 253, 255, 375, 378, 382, 380, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 19970, 19972, 19973, 19980, 19986, 19999, 20003, 20004, 20008, 20011, - 20014, 20015, 20016, 20021, 20032, 20033, 20036, 20039, 20049, 20058, - 20060, 20067, 20072, 20073, 20084, 20085, 20089, 20095, 20109, 20118, - 20119, 20125, 20143, 20153, 20163, 20176, 20186, 20187, 20192, 20193, - 20194, 20200, 20207, 20209, 20211, 20213, 20221, 20222, 20223, 20224, - 20226, 20227, 20232, 20235, 20236, 20242, 20245, 20246, 20247, 20249, - 20270, 20273, 20320, 20275, 20277, 20279, 20281, 20283, 20286, 20288, - 20290, 20296, 20297, 20299, 20300, 20306, 20308, 20310, 20312, 20319, - 20323, 20330, 20332, 20334, 20337, 20343, 20344, 20345, 20346, 20349, - 20350, 20353, 20354, 20356, 20357, 20361, 20362, 20364, 20366, 20368, - 20370, 20371, 20372, 20375, 20377, 20378, 20382, 20383, 20402, 20407, - 20409, 20411, 20412, 20413, 20414, 20416, 20417, 20421, 20422, 20424, - 20425, 20427, 20428, 20429, 20431, 20434, 20444, 20448, 20450, 20464, - 20466, 20476, 20477, 20479, 20480, 20481, 20484, 20487, 20490, 20492, - 20494, 20496, 20499, 20503, 20504, 20507, 20508, 20509, 20510, 20514, - 20519, 20526, 20528, 20530, 20531, 20533, 20544, 20545, 20546, 20549, - 20550, 20554, 20556, 20558, 20561, 20562, 20563, 20567, 20569, 20575, - 20576, 20578, 20579, 20582, 20583, 20586, 20589, 20592, 20593, 20539, - 20609, 20611, 20612, 20614, 20618, 20622, 20623, 20624, 20626, 20627, - 20628, 20630, 20635, 20636, 20638, 20639, 20640, 20641, 20642, 20650, - 20655, 20656, 20665, 20666, 20669, 20672, 20675, 20676, 20679, 20684, - 20686, 20688, 20691, 20692, 20696, 20700, 20701, 20703, 20706, 20708, - 20710, 20712, 20713, 20719, 20721, 20726, 20730, 20734, 20739, 20742, - 20743, 20744, 20747, 20748, 20749, 20750, 20722, 20752, 20759, 20761, - 20763, 20764, 20765, 20766, 20771, 20775, 20776, 20780, 20781, 20783, - 20785, 20787, 20788, 20789, 20792, 20793, 20802, 20810, 20815, 20819, - 20821, 20823, 20824, 20831, 20836, 20838, 20862, 20867, 20868, 20875, - 20878, 20888, 20893, 20897, 20899, 20909, 20920, 20922, 20924, 20926, - 20927, 20930, 20936, 20943, 20945, 20946, 20947, 20949, 20952, 20958, - 20962, 20965, 20974, 20978, 20979, 20980, 20983, 20993, 20994, 20997, - 21010, 21011, 21013, 21014, 21016, 21026, 21032, 21041, 21042, 21045, - 21052, 21061, 21065, 21077, 21079, 21080, 21082, 21084, 21087, 21088, - 21089, 21094, 21102, 21111, 21112, 21113, 21120, 21122, 21125, 21130, - 21132, 21139, 21141, 21142, 21143, 21144, 21146, 21148, 21156, 21157, - 21158, 21159, 21167, 21168, 21174, 21175, 21176, 21178, 21179, 21181, - 21184, 21188, 21190, 21192, 21196, 21199, 21201, 21204, 21206, 21211, - 21212, 21217, 21221, 21224, 21225, 21226, 21228, 21232, 21233, 21236, - 21238, 21239, 21248, 21251, 21258, 21259, 21260, 21265, 21267, 21272, - 21275, 21276, 21278, 21279, 21285, 21287, 21288, 21289, 21291, 21292, - 21293, 21296, 21298, 21301, 21308, 21309, 21310, 21314, 21324, 21323, - 21337, 21339, 21345, 21347, 21349, 21356, 21357, 21362, 21369, 21374, - 21379, 21383, 21384, 21390, 21395, 21396, 21401, 21405, 21409, 21412, - 21418, 21419, 21423, 21426, 21428, 21429, 21431, 21432, 21434, 21437, - 21440, 21445, 21455, 21458, 21459, 21461, 21466, 21469, 21470, 21472, - 21478, 21479, 21493, 21506, 21523, 21530, 21537, 21543, 21544, 21546, - 21551, 21553, 21556, 21557, 21571, 21572, 21575, 21581, 21583, 21598, - 21602, 21604, 21606, 21607, 21609, 21611, 21613, 21614, 21620, 21631, - 21633, 21635, 21637, 21640, 21641, 21645, 21649, 21653, 21654, 21660, - 21663, 21665, 21670, 21671, 21673, 21674, 21677, 21678, 21681, 21687, - 21689, 21690, 21691, 21695, 21702, 21706, 21709, 21710, 21728, 21738, - 21740, 21743, 21750, 21756, 21758, 21759, 21760, 21761, 21765, 21768, - 21769, 21772, 21773, 21774, 21781, 21802, 21803, 21810, 21813, 21814, - 21819, 21820, 21821, 21825, 21831, 21833, 21834, 21837, 21840, 21841, - 21848, 21850, 21851, 21854, 21856, 21857, 21860, 21862, 21887, 21889, - 21890, 21894, 21896, 21902, 21903, 21905, 21906, 21907, 21908, 21911, - 21923, 21924, 21933, 21938, 21951, 21953, 21955, 21958, 21961, 21963, - 21964, 21966, 21969, 21970, 21971, 21975, 21976, 21979, 21982, 21986, - 21993, 22006, 22015, 22021, 22024, 22026, 22029, 22030, 22031, 22032, - 22033, 22034, 22041, 22060, 22064, 22067, 22069, 22071, 22073, 22075, - 22076, 22077, 22079, 22080, 22081, 22083, 22084, 22086, 22089, 22091, - 22093, 22095, 22100, 22110, 22112, 22113, 22114, 22115, 22118, 22121, - 22125, 22127, 22129, 22130, 22133, 22148, 22149, 22152, 22155, 22156, - 22165, 22169, 22170, 22173, 22174, 22175, 22182, 22183, 22184, 22185, - 22187, 22188, 22189, 22193, 22195, 22199, 22206, 22213, 22217, 22218, - 22219, 22223, 22224, 22220, 22221, 22233, 22236, 22237, 22239, 22241, - 22244, 22245, 22246, 22247, 22248, 22257, 22251, 22253, 22262, 22263, - 22273, 22274, 22279, 22282, 22284, 22289, 22293, 22298, 22299, 22301, - 22304, 22306, 22307, 22308, 22309, 22313, 22314, 22316, 22318, 22319, - 22323, 22324, 22333, 22334, 22335, 22341, 22342, 22348, 22349, 22354, - 22370, 22373, 22375, 22376, 22379, 22381, 22382, 22383, 22384, 22385, - 22387, 22388, 22389, 22391, 22393, 22394, 22395, 22396, 22398, 22401, - 22403, 22412, 22420, 22423, 22425, 22426, 22428, 22429, 22430, 22431, - 22433, 22421, 22439, 22440, 22441, 22444, 22456, 22461, 22471, 22472, - 22476, 22479, 22485, 22493, 22494, 22500, 22502, 22503, 22505, 22509, - 22512, 22517, 22518, 22520, 22525, 22526, 22527, 22531, 22532, 22536, - 22537, 22497, 22540, 22541, 22555, 22558, 22559, 22560, 22566, 22567, - 22573, 22578, 22585, 22591, 22601, 22604, 22605, 22607, 22608, 22613, - 22623, 22625, 22628, 22631, 22632, 22648, 22652, 22655, 22656, 22657, - 22663, 22664, 22665, 22666, 22668, 22669, 22671, 22672, 22676, 22678, - 22685, 22688, 22689, 22690, 22694, 22697, 22705, 22706, 22724, 22716, - 22722, 22728, 22733, 22734, 22736, 22738, 22740, 22742, 22746, 22749, - 22753, 22754, 22761, 22771, 22789, 22790, 22795, 22796, 22802, 22803, - 22804, 34369, 22813, 22817, 22819, 22820, 22824, 22831, 22832, 22835, - 22837, 22838, 22847, 22851, 22854, 22866, 22867, 22873, 22875, 22877, - 22878, 22879, 22881, 22883, 22891, 22893, 22895, 22898, 22901, 22902, - 22905, 22907, 22908, 22923, 22924, 22926, 22930, 22933, 22935, 22943, - 22948, 22951, 22957, 22958, 22959, 22960, 22963, 22967, 22970, 22972, - 22977, 22979, 22980, 22984, 22986, 22989, 22994, 23005, 23006, 23007, - 23011, 23012, 23015, 23022, 23023, 23025, 23026, 23028, 23031, 23040, - 23044, 23052, 23053, 23054, 23058, 23059, 23070, 23075, 23076, 23079, - 23080, 23082, 23085, 23088, 23108, 23109, 23111, 23112, 23116, 23120, - 23125, 23134, 23139, 23141, 23143, 23149, 23159, 23162, 23163, 23166, - 23179, 23184, 23187, 23190, 23193, 23196, 23198, 23199, 23200, 23202, - 23207, 23212, 23217, 23218, 23219, 23221, 23224, 23226, 23227, 23231, - 23236, 23238, 23240, 23247, 23258, 23260, 23264, 23269, 23274, 23278, - 23285, 23286, 23293, 23296, 23297, 23304, 23319, 23348, 23321, 23323, - 23325, 23329, 23333, 23341, 23352, 23361, 23371, 23372, 23378, 23382, - 23390, 23400, 23406, 23407, 23420, 23421, 23422, 23423, 23425, 23428, - 23430, 23434, 23438, 23440, 23441, 23443, 23444, 23446, 23464, 23465, - 23468, 23469, 23471, 23473, 23474, 23479, 23482, 23484, 23488, 23489, - 23501, 23503, 23510, 23511, 23512, 23513, 23514, 23520, 23535, 23537, - 23540, 23549, 23564, 23575, 23582, 23583, 23587, 23590, 23593, 23595, - 23596, 23598, 23600, 23602, 23605, 23606, 23641, 23642, 23644, 23650, - 23651, 23655, 23656, 23657, 23661, 23664, 23668, 23669, 23674, 23675, - 23676, 23677, 23687, 23688, 23690, 23695, 23698, 23709, 23711, 23712, - 23714, 23715, 23718, 23722, 23730, 23732, 23733, 23738, 23753, 23755, - 23762, 23773, 23767, 23790, 23793, 23794, 23796, 23809, 23814, 23821, - 23826, 23851, 23843, 23844, 23846, 23847, 23857, 23860, 23865, 23869, - 23871, 23874, 23875, 23878, 23880, 23893, 23889, 23897, 23882, 23903, - 23904, 23905, 23906, 23908, 23914, 23917, 23920, 23929, 23930, 23934, - 23935, 23937, 23939, 23944, 23946, 23954, 23955, 23956, 23957, 23961, - 23963, 23967, 23968, 23975, 23979, 23984, 23988, 23992, 23993, 24003, - 24007, 24011, 24016, 24014, 24024, 24025, 24032, 24036, 24041, 24056, - 24057, 24064, 24071, 24077, 24082, 24084, 24085, 24088, 24095, 24096, - 24110, 24104, 24114, 24117, 24126, 24139, 24144, 24137, 24145, 24150, - 24152, 24155, 24156, 24158, 24168, 24170, 24171, 24172, 24173, 24174, - 24176, 24192, 24203, 24206, 24226, 24228, 24229, 24232, 24234, 24236, - 24241, 24243, 24253, 24254, 24255, 24262, 24268, 24267, 24270, 24273, - 24274, 24276, 24277, 24284, 24286, 24293, 24299, 24322, 24326, 24327, - 24328, 24334, 24345, 24348, 24349, 24353, 24354, 24355, 24356, 24360, - 24363, 24364, 24366, 24368, 24372, 24374, 24379, 24381, 24383, 24384, - 24388, 24389, 24391, 24397, 24400, 24404, 24408, 24411, 24416, 24419, - 24420, 24423, 24431, 24434, 24436, 24437, 24440, 24442, 24445, 24446, - 24457, 24461, 24463, 24470, 24476, 24477, 24482, 24487, 24491, 24484, - 24492, 24495, 24496, 24497, 24504, 24516, 24519, 24520, 24521, 24523, - 24528, 24529, 24530, 24531, 24532, 24542, 24545, 24546, 24552, 24553, - 24554, 24556, 24557, 24558, 24559, 24562, 24563, 24566, 24570, 24572, - 24583, 24586, 24589, 24595, 24596, 24599, 24600, 24602, 24607, 24612, - 24621, 24627, 24629, 24640, 24647, 24648, 24649, 24652, 24657, 24660, - 24662, 24663, 24669, 24673, 24679, 24689, 24702, 24703, 24706, 24710, - 24712, 24714, 24718, 24721, 24723, 24725, 24728, 24733, 24734, 24738, - 24740, 24741, 24744, 24752, 24753, 24759, 24763, 24766, 24770, 24772, - 24776, 24777, 24778, 24779, 24782, 24783, 24788, 24789, 24793, 24795, - 24797, 24798, 24802, 24805, 24818, 24821, 24824, 24828, 24829, 24834, - 24839, 24842, 24844, 24848, 24849, 24850, 24851, 24852, 24854, 24855, - 24857, 24860, 24862, 24866, 24874, 24875, 24880, 24881, 24885, 24886, - 24887, 24889, 24897, 24901, 24902, 24905, 24926, 24928, 24940, 24946, - 24952, 24955, 24956, 24959, 24960, 24961, 24963, 24964, 24971, 24973, - 24978, 24979, 24983, 24984, 24988, 24989, 24991, 24992, 24997, 25000, - 25002, 25005, 25016, 25017, 25020, 25024, 25025, 25026, 25038, 25039, - 25045, 25052, 25053, 25054, 25055, 25057, 25058, 25063, 25065, 25061, - 25068, 25069, 25071, 25089, 25091, 25092, 25095, 25107, 25109, 25116, - 25120, 25122, 25123, 25127, 25129, 25131, 25145, 25149, 25154, 25155, - 25156, 25158, 25164, 25168, 25169, 25170, 25172, 25174, 25178, 25180, - 25188, 25197, 25199, 25203, 25210, 25213, 25229, 25230, 25231, 25232, - 25254, 25256, 25267, 25270, 25271, 25274, 25278, 25279, 25284, 25294, - 25301, 25302, 25306, 25322, 25330, 25332, 25340, 25341, 25347, 25348, - 25354, 25355, 25357, 25360, 25363, 25366, 25368, 25385, 25386, 25389, - 25397, 25398, 25401, 25404, 25409, 25410, 25411, 25412, 25414, 25418, - 25419, 25422, 25426, 25427, 25428, 25432, 25435, 25445, 25446, 25452, - 25453, 25457, 25460, 25461, 25464, 25468, 25469, 25471, 25474, 25476, - 25479, 25482, 25488, 25492, 25493, 25497, 25498, 25502, 25508, 25510, - 25517, 25518, 25519, 25533, 25537, 25541, 25544, 25550, 25553, 25555, - 25556, 25557, 25564, 25568, 25573, 25578, 25580, 25586, 25587, 25589, - 25592, 25593, 25609, 25610, 25616, 25618, 25620, 25624, 25630, 25632, - 25634, 25636, 25637, 25641, 25642, 25647, 25648, 25653, 25661, 25663, - 25675, 25679, 25681, 25682, 25683, 25684, 25690, 25691, 25692, 25693, - 25695, 25696, 25697, 25699, 25709, 25715, 25716, 25723, 25725, 25733, - 25735, 25743, 25744, 25745, 25752, 25753, 25755, 25757, 25759, 25761, - 25763, 25766, 25768, 25772, 25779, 25789, 25790, 25791, 25796, 25801, - 25802, 25803, 25804, 25806, 25808, 25809, 25813, 25815, 25828, 25829, - 25833, 25834, 25837, 25840, 25845, 25847, 25851, 25855, 25857, 25860, - 25864, 25865, 25866, 25871, 25875, 25876, 25878, 25881, 25883, 25886, - 25887, 25890, 25894, 25897, 25902, 25905, 25914, 25916, 25917, 25923, - 25927, 25929, 25936, 25938, 25940, 25951, 25952, 25959, 25963, 25978, - 25981, 25985, 25989, 25994, 26002, 26005, 26008, 26013, 26016, 26019, - 26022, 26030, 26034, 26035, 26036, 26047, 26050, 26056, 26057, 26062, - 26064, 26068, 26070, 26072, 26079, 26096, 26098, 26100, 26101, 26105, - 26110, 26111, 26112, 26116, 26120, 26121, 26125, 26129, 26130, 26133, - 26134, 26141, 26142, 26145, 26146, 26147, 26148, 26150, 26153, 26154, - 26155, 26156, 26158, 26160, 26161, 26163, 26169, 26167, 26176, 26181, - 26182, 26186, 26188, 26193, 26190, 26199, 26200, 26201, 26203, 26204, - 26208, 26209, 26363, 26218, 26219, 26220, 26238, 26227, 26229, 26239, - 26231, 26232, 26233, 26235, 26240, 26236, 26251, 26252, 26253, 26256, - 26258, 26265, 26266, 26267, 26268, 26271, 26272, 26276, 26285, 26289, - 26290, 26293, 26299, 26303, 26304, 26306, 26307, 26312, 26316, 26318, - 26319, 26324, 26331, 26335, 26344, 26347, 26348, 26350, 26362, 26373, - 26375, 26382, 26387, 26393, 26396, 26400, 26402, 26419, 26430, 26437, - 26439, 26440, 26444, 26452, 26453, 26461, 26470, 26476, 26478, 26484, - 26486, 26491, 26497, 26500, 26510, 26511, 26513, 26515, 26518, 26520, - 26521, 26523, 26544, 26545, 26546, 26549, 26555, 26556, 26557, 26617, - 26560, 26562, 26563, 26565, 26568, 26569, 26578, 26583, 26585, 26588, - 26593, 26598, 26608, 26610, 26614, 26615, 26706, 26644, 26649, 26653, - 26655, 26664, 26663, 26668, 26669, 26671, 26672, 26673, 26675, 26683, - 26687, 26692, 26693, 26698, 26700, 26709, 26711, 26712, 26715, 26731, - 26734, 26735, 26736, 26737, 26738, 26741, 26745, 26746, 26747, 26748, - 26754, 26756, 26758, 26760, 26774, 26776, 26778, 26780, 26785, 26787, - 26789, 26793, 26794, 26798, 26802, 26811, 26821, 26824, 26828, 26831, - 26832, 26833, 26835, 26838, 26841, 26844, 26845, 26853, 26856, 26858, - 26859, 26860, 26861, 26864, 26865, 26869, 26870, 26875, 26876, 26877, - 26886, 26889, 26890, 26896, 26897, 26899, 26902, 26903, 26929, 26931, - 26933, 26936, 26939, 26946, 26949, 26953, 26958, 26967, 26971, 26979, - 26980, 26981, 26982, 26984, 26985, 26988, 26992, 26993, 26994, 27002, - 27003, 27007, 27008, 27021, 27026, 27030, 27032, 27041, 27045, 27046, - 27048, 27051, 27053, 27055, 27063, 27064, 27066, 27068, 27077, 27080, - 27089, 27094, 27095, 27106, 27109, 27118, 27119, 27121, 27123, 27125, - 27134, 27136, 27137, 27139, 27151, 27153, 27157, 27162, 27165, 27168, - 27172, 27176, 27184, 27186, 27188, 27191, 27195, 27198, 27199, 27205, - 27206, 27209, 27210, 27214, 27216, 27217, 27218, 27221, 27222, 27227, - 27236, 27239, 27242, 27249, 27251, 27262, 27265, 27267, 27270, 27271, - 27273, 27275, 27281, 27291, 27293, 27294, 27295, 27301, 27307, 27311, - 27312, 27313, 27316, 27325, 27326, 27327, 27334, 27337, 27336, 27340, - 27344, 27348, 27349, 27350, 27356, 27357, 27364, 27367, 27372, 27376, - 27377, 27378, 27388, 27389, 27394, 27395, 27398, 27399, 27401, 27407, - 27408, 27409, 27415, 27419, 27422, 27428, 27432, 27435, 27436, 27439, - 27445, 27446, 27451, 27455, 27462, 27466, 27469, 27474, 27478, 27480, - 27485, 27488, 27495, 27499, 27502, 27504, 27509, 27517, 27518, 27522, - 27525, 27543, 27547, 27551, 27552, 27554, 27555, 27560, 27561, 27564, - 27565, 27566, 27568, 27576, 27577, 27581, 27582, 27587, 27588, 27593, - 27596, 27606, 27610, 27617, 27619, 27622, 27623, 27630, 27633, 27639, - 27641, 27647, 27650, 27652, 27653, 27657, 27661, 27662, 27664, 27666, - 27673, 27679, 27686, 27687, 27688, 27692, 27694, 27699, 27701, 27702, - 27706, 27707, 27711, 27722, 27723, 27725, 27727, 27730, 27732, 27737, - 27739, 27740, 27755, 27757, 27759, 27764, 27766, 27768, 27769, 27771, - 27781, 27782, 27783, 27785, 27796, 27797, 27799, 27800, 27804, 27807, - 27824, 27826, 27828, 27842, 27846, 27853, 27855, 27856, 27857, 27858, - 27860, 27862, 27866, 27868, 27872, 27879, 27881, 27883, 27884, 27886, - 27890, 27892, 27908, 27911, 27914, 27918, 27919, 27921, 27923, 27930, - 27942, 27943, 27944, 27751, 27950, 27951, 27953, 27961, 27964, 27967, - 27991, 27998, 27999, 28001, 28005, 28007, 28015, 28016, 28028, 28034, - 28039, 28049, 28050, 28052, 28054, 28055, 28056, 28074, 28076, 28084, - 28087, 28089, 28093, 28095, 28100, 28104, 28106, 28110, 28111, 28118, - 28123, 28125, 28127, 28128, 28130, 28133, 28137, 28143, 28144, 28148, - 28150, 28156, 28160, 28164, 28190, 28194, 28199, 28210, 28214, 28217, - 28219, 28220, 28228, 28229, 28232, 28233, 28235, 28239, 28241, 28242, - 28243, 28244, 28247, 28252, 28253, 28254, 28258, 28259, 28264, 28275, - 28283, 28285, 28301, 28307, 28313, 28320, 28327, 28333, 28334, 28337, - 28339, 28347, 28351, 28352, 28353, 28355, 28359, 28360, 28362, 28365, - 28366, 28367, 28395, 28397, 28398, 28409, 28411, 28413, 28420, 28424, - 28426, 28428, 28429, 28438, 28440, 28442, 28443, 28454, 28457, 28458, - 28463, 28464, 28467, 28470, 28475, 28476, 28461, 28495, 28497, 28498, - 28499, 28503, 28505, 28506, 28509, 28510, 28513, 28514, 28520, 28524, - 28541, 28542, 28547, 28551, 28552, 28555, 28556, 28557, 28560, 28562, - 28563, 28564, 28566, 28570, 28575, 28576, 28581, 28582, 28583, 28584, - 28590, 28591, 28592, 28597, 28598, 28604, 28613, 28615, 28616, 28618, - 28634, 28638, 28648, 28649, 28656, 28661, 28665, 28668, 28669, 28672, - 28677, 28678, 28679, 28685, 28695, 28704, 28707, 28719, 28724, 28727, - 28729, 28732, 28739, 28740, 28744, 28745, 28746, 28747, 28756, 28757, - 28765, 28766, 28750, 28772, 28773, 28780, 28782, 28789, 28790, 28798, - 28801, 28805, 28806, 28820, 28821, 28822, 28823, 28824, 28827, 28836, - 28843, 28848, 28849, 28852, 28855, 28874, 28881, 28883, 28884, 28885, - 28886, 28888, 28892, 28900, 28922, 28931, 28932, 28933, 28934, 28935, - 28939, 28940, 28943, 28958, 28960, 28971, 28973, 28975, 28976, 28977, - 28984, 28993, 28997, 28998, 28999, 29002, 29003, 29008, 29010, 29015, - 29018, 29020, 29022, 29024, 29032, 29049, 29056, 29061, 29063, 29068, - 29074, 29082, 29083, 29088, 29090, 29103, 29104, 29106, 29107, 29114, - 29119, 29120, 29121, 29124, 29131, 29132, 29139, 29142, 29145, 29146, - 29148, 29176, 29182, 29184, 29191, 29192, 29193, 29203, 29207, 29210, - 29213, 29215, 29220, 29227, 29231, 29236, 29240, 29241, 29249, 29250, - 29251, 29253, 29262, 29263, 29264, 29267, 29269, 29270, 29274, 29276, - 29278, 29280, 29283, 29288, 29291, 29294, 29295, 29297, 29303, 29304, - 29307, 29308, 29311, 29316, 29321, 29325, 29326, 29331, 29339, 29352, - 29357, 29358, 29361, 29364, 29374, 29377, 29383, 29385, 29388, 29397, - 29398, 29400, 29407, 29413, 29427, 29428, 29434, 29435, 29438, 29442, - 29444, 29445, 29447, 29451, 29453, 29458, 29459, 29464, 29465, 29470, - 29474, 29476, 29479, 29480, 29484, 29489, 29490, 29493, 29498, 29499, - 29501, 29507, 29517, 29520, 29522, 29526, 29528, 29533, 29534, 29535, - 29536, 29542, 29543, 29545, 29547, 29548, 29550, 29551, 29553, 29559, - 29561, 29564, 29568, 29569, 29571, 29573, 29574, 29582, 29584, 29587, - 29589, 29591, 29592, 29596, 29598, 29599, 29600, 29602, 29605, 29606, - 29610, 29611, 29613, 29621, 29623, 29625, 29628, 29629, 29631, 29637, - 29638, 29641, 29643, 29644, 29647, 29650, 29651, 29654, 29657, 29661, - 29665, 29667, 29670, 29671, 29673, 29684, 29685, 29687, 29689, 29690, - 29691, 29693, 29695, 29696, 29697, 29700, 29703, 29706, 29713, 29722, - 29723, 29732, 29734, 29736, 29737, 29738, 29739, 29740, 29741, 29742, - 29743, 29744, 29745, 29753, 29760, 29763, 29764, 29766, 29767, 29771, - 29773, 29777, 29778, 29783, 29789, 29794, 29798, 29799, 29800, 29803, - 29805, 29806, 29809, 29810, 29824, 29825, 29829, 29830, 29831, 29833, - 29839, 29840, 29841, 29842, 29848, 29849, 29850, 29852, 29855, 29856, - 29857, 29859, 29862, 29864, 29865, 29866, 29867, 29870, 29871, 29873, - 29874, 29877, 29881, 29883, 29887, 29896, 29897, 29900, 29904, 29907, - 29912, 29914, 29915, 29918, 29919, 29924, 29928, 29930, 29931, 29935, - 29940, 29946, 29947, 29948, 29951, 29958, 29970, 29974, 29975, 29984, - 29985, 29988, 29991, 29993, 29994, 29999, 30006, 30009, 30013, 30014, - 30015, 30016, 30019, 30023, 30024, 30030, 30032, 30034, 30039, 30046, - 30047, 30049, 30063, 30065, 30073, 30074, 30075, 30076, 30077, 30078, - 30081, 30085, 30096, 30098, 30099, 30101, 30105, 30108, 30114, 30116, - 30132, 30138, 30143, 30144, 30145, 30148, 30150, 30156, 30158, 30159, - 30167, 30172, 30175, 30176, 30177, 30180, 30183, 30188, 30190, 30191, - 30193, 30201, 30208, 30210, 30211, 30212, 30215, 30216, 30218, 30220, - 30223, 30226, 30227, 30229, 30230, 30233, 30235, 30236, 30237, 30238, - 30243, 30245, 30246, 30249, 30253, 30258, 30259, 30261, 30264, 30265, - 30266, 30268, 30282, 30272, 30273, 30275, 30276, 30277, 30281, 30283, - 30293, 30297, 30303, 30308, 30309, 30317, 30318, 30319, 30321, 30324, - 30337, 30341, 30348, 30349, 30357, 30363, 30364, 30365, 30367, 30368, - 30370, 30371, 30372, 30373, 30374, 30375, 30376, 30378, 30381, 30397, - 30401, 30405, 30409, 30411, 30412, 30414, 30420, 30425, 30432, 30438, - 30440, 30444, 30448, 30449, 30454, 30457, 30460, 30464, 30470, 30474, - 30478, 30482, 30484, 30485, 30487, 30489, 30490, 30492, 30498, 30504, - 30509, 30510, 30511, 30516, 30517, 30518, 30521, 30525, 30526, 30530, - 30533, 30534, 30538, 30541, 30542, 30543, 30546, 30550, 30551, 30556, - 30558, 30559, 30560, 30562, 30564, 30567, 30570, 30572, 30576, 30578, - 30579, 30580, 30586, 30589, 30592, 30596, 30604, 30605, 30612, 30613, - 30614, 30618, 30623, 30626, 30631, 30634, 30638, 30639, 30641, 30645, - 30654, 30659, 30665, 30673, 30674, 30677, 30681, 30686, 30687, 30688, - 30692, 30694, 30698, 30700, 30704, 30705, 30708, 30712, 30715, 30725, - 30726, 30729, 30733, 30734, 30737, 30749, 30753, 30754, 30755, 30765, - 30766, 30768, 30773, 30775, 30787, 30788, 30791, 30792, 30796, 30798, - 30802, 30812, 30814, 30816, 30817, 30819, 30820, 30824, 30826, 30830, - 30842, 30846, 30858, 30863, 30868, 30872, 30881, 30877, 30878, 30879, - 30884, 30888, 30892, 30893, 30896, 30897, 30898, 30899, 30907, 30909, - 30911, 30919, 30920, 30921, 30924, 30926, 30930, 30931, 30933, 30934, - 30948, 30939, 30943, 30944, 30945, 30950, 30954, 30962, 30963, 30976, - 30966, 30967, 30970, 30971, 30975, 30982, 30988, 30992, 31002, 31004, - 31006, 31007, 31008, 31013, 31015, 31017, 31021, 31025, 31028, 31029, - 31035, 31037, 31039, 31044, 31045, 31046, 31050, 31051, 31055, 31057, - 31060, 31064, 31067, 31068, 31079, 31081, 31083, 31090, 31097, 31099, - 31100, 31102, 31115, 31116, 31121, 31123, 31124, 31125, 31126, 31128, - 31131, 31132, 31137, 31144, 31145, 31147, 31151, 31153, 31156, 31160, - 31163, 31170, 31172, 31175, 31176, 31178, 31183, 31188, 31190, 31194, - 31197, 31198, 31200, 31202, 31205, 31210, 31211, 31213, 31217, 31224, - 31228, 31234, 31235, 31239, 31241, 31242, 31244, 31249, 31253, 31259, - 31262, 31265, 31271, 31275, 31277, 31279, 31280, 31284, 31285, 31288, - 31289, 31290, 31300, 31301, 31303, 31304, 31308, 31317, 31318, 31321, - 31324, 31325, 31327, 31328, 31333, 31335, 31338, 31341, 31349, 31352, - 31358, 31360, 31362, 31365, 31366, 31370, 31371, 31376, 31377, 31380, - 31390, 31392, 31395, 31404, 31411, 31413, 31417, 31419, 31420, 31430, - 31433, 31436, 31438, 31441, 31451, 31464, 31465, 31467, 31468, 31473, - 31476, 31483, 31485, 31486, 31495, 31508, 31519, 31523, 31527, 31529, - 31530, 31531, 31533, 31534, 31535, 31536, 31537, 31540, 31549, 31551, - 31552, 31553, 31559, 31566, 31573, 31584, 31588, 31590, 31593, 31594, - 31597, 31599, 31602, 31603, 31607, 31620, 31625, 31630, 31632, 31633, - 31638, 31643, 31646, 31648, 31653, 31660, 31663, 31664, 31666, 31669, - 31670, 31674, 31675, 31676, 31677, 31682, 31685, 31688, 31690, 31700, - 31702, 31703, 31705, 31706, 31707, 31720, 31722, 31730, 31732, 31733, - 31736, 31737, 31738, 31740, 31742, 31745, 31746, 31747, 31748, 31750, - 31753, 31755, 31756, 31758, 31759, 31769, 31771, 31776, 31781, 31782, - 31784, 31788, 31793, 31795, 31796, 31798, 31801, 31802, 31814, 31818, - 31829, 31825, 31826, 31827, 31833, 31834, 31835, 31836, 31837, 31838, - 31841, 31843, 31847, 31849, 31853, 31854, 31856, 31858, 31865, 31868, - 31869, 31878, 31879, 31887, 31892, 31902, 31904, 31910, 31920, 31926, - 31927, 31930, 31931, 31932, 31935, 31940, 31943, 31944, 31945, 31949, - 31951, 31955, 31956, 31957, 31959, 31961, 31962, 31965, 31974, 31977, - 31979, 31989, 32003, 32007, 32008, 32009, 32015, 32017, 32018, 32019, - 32022, 32029, 32030, 32035, 32038, 32042, 32045, 32049, 32060, 32061, - 32062, 32064, 32065, 32071, 32072, 32077, 32081, 32083, 32087, 32089, - 32090, 32092, 32093, 32101, 32103, 32106, 32112, 32120, 32122, 32123, - 32127, 32129, 32130, 32131, 32133, 32134, 32136, 32139, 32140, 32141, - 32145, 32150, 32151, 32157, 32158, 32166, 32167, 32170, 32179, 32182, - 32183, 32185, 32194, 32195, 32196, 32197, 32198, 32204, 32205, 32206, - 32215, 32217, 32256, 32226, 32229, 32230, 32234, 32235, 32237, 32241, - 32245, 32246, 32249, 32250, 32264, 32272, 32273, 32277, 32279, 32284, - 32285, 32288, 32295, 32296, 32300, 32301, 32303, 32307, 32310, 32319, - 32324, 32325, 32327, 32334, 32336, 32338, 32344, 32351, 32353, 32354, - 32357, 32363, 32366, 32367, 32371, 32376, 32382, 32385, 32390, 32391, - 32394, 32397, 32401, 32405, 32408, 32410, 32413, 32414, 32572, 32571, - 32573, 32574, 32575, 32579, 32580, 32583, 32591, 32594, 32595, 32603, - 32604, 32605, 32609, 32611, 32612, 32613, 32614, 32621, 32625, 32637, - 32638, 32639, 32640, 32651, 32653, 32655, 32656, 32657, 32662, 32663, - 32668, 32673, 32674, 32678, 32682, 32685, 32692, 32700, 32703, 32704, - 32707, 32712, 32718, 32719, 32731, 32735, 32739, 32741, 32744, 32748, - 32750, 32751, 32754, 32762, 32765, 32766, 32767, 32775, 32776, 32778, - 32781, 32782, 32783, 32785, 32787, 32788, 32790, 32797, 32798, 32799, - 32800, 32804, 32806, 32812, 32814, 32816, 32820, 32821, 32823, 32825, - 32826, 32828, 32830, 32832, 32836, 32864, 32868, 32870, 32877, 32881, - 32885, 32897, 32904, 32910, 32924, 32926, 32934, 32935, 32939, 32952, - 32953, 32968, 32973, 32975, 32978, 32980, 32981, 32983, 32984, 32992, - 33005, 33006, 33008, 33010, 33011, 33014, 33017, 33018, 33022, 33027, - 33035, 33046, 33047, 33048, 33052, 33054, 33056, 33060, 33063, 33068, - 33072, 33077, 33082, 33084, 33093, 33095, 33098, 33100, 33106, 33111, - 33120, 33121, 33127, 33128, 33129, 33133, 33135, 33143, 33153, 33168, - 33156, 33157, 33158, 33163, 33166, 33174, 33176, 33179, 33182, 33186, - 33198, 33202, 33204, 33211, 33227, 33219, 33221, 33226, 33230, 33231, - 33237, 33239, 33243, 33245, 33246, 33249, 33252, 33259, 33260, 33264, - 33265, 33266, 33269, 33270, 33272, 33273, 33277, 33279, 33280, 33283, - 33295, 33299, 33300, 33305, 33306, 33309, 33313, 33314, 33320, 33330, - 33332, 33338, 33347, 33348, 33349, 33350, 33355, 33358, 33359, 33361, - 33366, 33372, 33376, 33379, 33383, 33389, 33396, 33403, 33405, 33407, - 33408, 33409, 33411, 33412, 33415, 33417, 33418, 33422, 33425, 33428, - 33430, 33432, 33434, 33435, 33440, 33441, 33443, 33444, 33447, 33448, - 33449, 33450, 33454, 33456, 33458, 33460, 33463, 33466, 33468, 33470, - 33471, 33478, 33488, 33493, 33498, 33504, 33506, 33508, 33512, 33514, - 33517, 33519, 33526, 33527, 33533, 33534, 33536, 33537, 33543, 33544, - 33546, 33547, 33620, 33563, 33565, 33566, 33567, 33569, 33570, 33580, - 33581, 33582, 33584, 33587, 33591, 33594, 33596, 33597, 33602, 33603, - 33604, 33607, 33613, 33614, 33617, 33621, 33622, 33623, 33648, 33656, - 33661, 33663, 33664, 33666, 33668, 33670, 33677, 33682, 33684, 33685, - 33688, 33689, 33691, 33692, 33693, 33702, 33703, 33705, 33708, 33726, - 33727, 33728, 33735, 33737, 33743, 33744, 33745, 33748, 33757, 33619, - 33768, 33770, 33782, 33784, 33785, 33788, 33793, 33798, 33802, 33807, - 33809, 33813, 33817, 33709, 33839, 33849, 33861, 33863, 33864, 33866, - 33869, 33871, 33873, 33874, 33878, 33880, 33881, 33882, 33884, 33888, - 33892, 33893, 33895, 33898, 33904, 33907, 33908, 33910, 33912, 33916, - 33917, 33921, 33925, 33938, 33939, 33941, 33950, 33958, 33960, 33961, - 33962, 33967, 33969, 33972, 33978, 33981, 33982, 33984, 33986, 33991, - 33992, 33996, 33999, 34003, 34012, 34023, 34026, 34031, 34032, 34033, - 34034, 34039, 34098, 34042, 34043, 34045, 34050, 34051, 34055, 34060, - 34062, 34064, 34076, 34078, 34082, 34083, 34084, 34085, 34087, 34090, - 34091, 34095, 34099, 34100, 34102, 34111, 34118, 34127, 34128, 34129, - 34130, 34131, 34134, 34137, 34140, 34141, 34142, 34143, 34144, 34145, - 34146, 34148, 34155, 34159, 34169, 34170, 34171, 34173, 34175, 34177, - 34181, 34182, 34185, 34187, 34188, 34191, 34195, 34200, 34205, 34207, - 34208, 34210, 34213, 34215, 34228, 34230, 34231, 34232, 34236, 34237, - 34238, 34239, 34242, 34247, 34250, 34251, 34254, 34221, 34264, 34266, - 34271, 34272, 34278, 34280, 34285, 34291, 34294, 34300, 34303, 34304, - 34308, 34309, 34317, 34318, 34320, 34321, 34322, 34328, 34329, 34331, - 34334, 34337, 34343, 34345, 34358, 34360, 34362, 34364, 34365, 34368, - 34370, 34374, 34386, 34387, 34390, 34391, 34392, 34393, 34397, 34400, - 34401, 34402, 34403, 34404, 34409, 34412, 34415, 34421, 34422, 34423, - 34426, 34445, 34449, 34454, 34456, 34458, 34460, 34465, 34470, 34471, - 34472, 34477, 34481, 34483, 34484, 34485, 34487, 34488, 34489, 34495, - 34496, 34497, 34499, 34501, 34513, 34514, 34517, 34519, 34522, 34524, - 34528, 34531, 34533, 34535, 34440, 34554, 34556, 34557, 34564, 34565, - 34567, 34571, 34574, 34575, 34576, 34579, 34580, 34585, 34590, 34591, - 34593, 34595, 34600, 34606, 34607, 34609, 34610, 34617, 34618, 34620, - 34621, 34622, 34624, 34627, 34629, 34637, 34648, 34653, 34657, 34660, - 34661, 34671, 34673, 34674, 34683, 34691, 34692, 34693, 34694, 34695, - 34696, 34697, 34699, 34700, 34704, 34707, 34709, 34711, 34712, 34713, - 34718, 34720, 34723, 34727, 34732, 34733, 34734, 34737, 34741, 34750, - 34751, 34753, 34760, 34761, 34762, 34766, 34773, 34774, 34777, 34778, - 34780, 34783, 34786, 34787, 34788, 34794, 34795, 34797, 34801, 34803, - 34808, 34810, 34815, 34817, 34819, 34822, 34825, 34826, 34827, 34832, - 34841, 34834, 34835, 34836, 34840, 34842, 34843, 34844, 34846, 34847, - 34856, 34861, 34862, 34864, 34866, 34869, 34874, 34876, 34881, 34883, - 34885, 34888, 34889, 34890, 34891, 34894, 34897, 34901, 34902, 34904, - 34906, 34908, 34911, 34912, 34916, 34921, 34929, 34937, 34939, 34944, - 34968, 34970, 34971, 34972, 34975, 34976, 34984, 34986, 35002, 35005, - 35006, 35008, 35018, 35019, 35020, 35021, 35022, 35025, 35026, 35027, - 35035, 35038, 35047, 35055, 35056, 35057, 35061, 35063, 35073, 35078, - 35085, 35086, 35087, 35093, 35094, 35096, 35097, 35098, 35100, 35104, - 35110, 35111, 35112, 35120, 35121, 35122, 35125, 35129, 35130, 35134, - 35136, 35138, 35141, 35142, 35145, 35151, 35154, 35159, 35162, 35163, - 35164, 35169, 35170, 35171, 35179, 35182, 35184, 35187, 35189, 35194, - 35195, 35196, 35197, 35209, 35213, 35216, 35220, 35221, 35227, 35228, - 35231, 35232, 35237, 35248, 35252, 35253, 35254, 35255, 35260, 35284, - 35285, 35286, 35287, 35288, 35301, 35305, 35307, 35309, 35313, 35315, - 35318, 35321, 35325, 35327, 35332, 35333, 35335, 35343, 35345, 35346, - 35348, 35349, 35358, 35360, 35362, 35364, 35366, 35371, 35372, 35375, - 35381, 35383, 35389, 35390, 35392, 35395, 35397, 35399, 35401, 35405, - 35406, 35411, 35414, 35415, 35416, 35420, 35421, 35425, 35429, 35431, - 35445, 35446, 35447, 35449, 35450, 35451, 35454, 35455, 35456, 35459, - 35462, 35467, 35471, 35472, 35474, 35478, 35479, 35481, 35487, 35495, - 35497, 35502, 35503, 35507, 35510, 35511, 35515, 35518, 35523, 35526, - 35528, 35529, 35530, 35537, 35539, 35540, 35541, 35543, 35549, 35551, - 35564, 35568, 35572, 35573, 35574, 35580, 35583, 35589, 35590, 35595, - 35601, 35612, 35614, 35615, 35594, 35629, 35632, 35639, 35644, 35650, - 35651, 35652, 35653, 35654, 35656, 35666, 35667, 35668, 35673, 35661, - 35678, 35683, 35693, 35702, 35704, 35705, 35708, 35710, 35713, 35716, - 35717, 35723, 35725, 35727, 35732, 35733, 35740, 35742, 35743, 35896, - 35897, 35901, 35902, 35909, 35911, 35913, 35915, 35919, 35921, 35923, - 35924, 35927, 35928, 35931, 35933, 35929, 35939, 35940, 35942, 35944, - 35945, 35949, 35955, 35957, 35958, 35963, 35966, 35974, 35975, 35979, - 35984, 35986, 35987, 35993, 35995, 35996, 36004, 36025, 36026, 36037, - 36038, 36041, 36043, 36047, 36054, 36053, 36057, 36061, 36065, 36072, - 36076, 36079, 36080, 36082, 36085, 36087, 36088, 36094, 36095, 36097, - 36099, 36105, 36114, 36119, 36123, 36197, 36201, 36204, 36206, 36223, - 36226, 36228, 36232, 36237, 36240, 36241, 36245, 36254, 36255, 36256, - 36262, 36267, 36268, 36271, 36274, 36277, 36279, 36281, 36283, 36288, - 36293, 36294, 36295, 36296, 36298, 36302, 36305, 36308, 36309, 36311, - 36313, 36324, 36325, 36327, 36332, 36336, 36284, 36337, 36338, 36340, - 36349, 36353, 36356, 36357, 36358, 36363, 36369, 36372, 36374, 36384, - 36385, 36386, 36387, 36390, 36391, 36401, 36403, 36406, 36407, 36408, - 36409, 36413, 36416, 36417, 36427, 36429, 36430, 36431, 36436, 36443, - 36444, 36445, 36446, 36449, 36450, 36457, 36460, 36461, 36463, 36464, - 36465, 36473, 36474, 36475, 36482, 36483, 36489, 36496, 36498, 36501, - 36506, 36507, 36509, 36510, 36514, 36519, 36521, 36525, 36526, 36531, - 36533, 36538, 36539, 36544, 36545, 36547, 36548, 36551, 36559, 36561, - 36564, 36572, 36584, 36590, 36592, 36593, 36599, 36601, 36602, 36589, - 36608, 36610, 36615, 36616, 36623, 36624, 36630, 36631, 36632, 36638, - 36640, 36641, 36643, 36645, 36647, 36648, 36652, 36653, 36654, 36660, - 36661, 36662, 36663, 36666, 36672, 36673, 36675, 36679, 36687, 36689, - 36690, 36691, 36692, 36693, 36696, 36701, 36702, 36709, 36765, 36768, - 36769, 36772, 36773, 36774, 36789, 36790, 36792, 36798, 36800, 36801, - 36806, 36810, 36811, 36813, 36816, 36818, 36819, 36821, 36832, 36835, - 36836, 36840, 36846, 36849, 36853, 36854, 36859, 36862, 36866, 36868, - 36872, 36876, 36888, 36891, 36904, 36905, 36911, 36906, 36908, 36909, - 36915, 36916, 36919, 36927, 36931, 36932, 36940, 36955, 36957, 36962, - 36966, 36967, 36972, 36976, 36980, 36985, 36997, 37000, 37003, 37004, - 37006, 37008, 37013, 37015, 37016, 37017, 37019, 37024, 37025, 37026, - 37029, 37040, 37042, 37043, 37044, 37046, 37053, 37068, 37054, 37059, - 37060, 37061, 37063, 37064, 37077, 37079, 37080, 37081, 37084, 37085, - 37087, 37093, 37074, 37110, 37099, 37103, 37104, 37108, 37118, 37119, - 37120, 37124, 37125, 37126, 37128, 37133, 37136, 37140, 37142, 37143, - 37144, 37146, 37148, 37150, 37152, 37157, 37154, 37155, 37159, 37161, - 37166, 37167, 37169, 37172, 37174, 37175, 37177, 37178, 37180, 37181, - 37187, 37191, 37192, 37199, 37203, 37207, 37209, 37210, 37211, 37217, - 37220, 37223, 37229, 37236, 37241, 37242, 37243, 37249, 37251, 37253, - 37254, 37258, 37262, 37265, 37267, 37268, 37269, 37272, 37278, 37281, - 37286, 37288, 37292, 37293, 37294, 37296, 37297, 37298, 37299, 37302, - 37307, 37308, 37309, 37311, 37314, 37315, 37317, 37331, 37332, 37335, - 37337, 37338, 37342, 37348, 37349, 37353, 37354, 37356, 37357, 37358, - 37359, 37360, 37361, 37367, 37369, 37371, 37373, 37376, 37377, 37380, - 37381, 37382, 37383, 37385, 37386, 37388, 37392, 37394, 37395, 37398, - 37400, 37404, 37405, 37411, 37412, 37413, 37414, 37416, 37422, 37423, - 37424, 37427, 37429, 37430, 37432, 37433, 37434, 37436, 37438, 37440, - 37442, 37443, 37446, 37447, 37450, 37453, 37454, 37455, 37457, 37464, - 37465, 37468, 37469, 37472, 37473, 37477, 37479, 37480, 37481, 37486, - 37487, 37488, 37493, 37494, 37495, 37496, 37497, 37499, 37500, 37501, - 37503, 37512, 37513, 37514, 37517, 37518, 37522, 37527, 37529, 37535, - 37536, 37540, 37541, 37543, 37544, 37547, 37551, 37554, 37558, 37560, - 37562, 37563, 37564, 37565, 37567, 37568, 37569, 37570, 37571, 37573, - 37574, 37575, 37576, 37579, 37580, 37581, 37582, 37584, 37587, 37589, - 37591, 37592, 37593, 37596, 37597, 37599, 37600, 37601, 37603, 37605, - 37607, 37608, 37612, 37614, 37616, 37625, 37627, 37631, 37632, 37634, - 37640, 37645, 37649, 37652, 37653, 37660, 37661, 37662, 37663, 37665, - 37668, 37669, 37671, 37673, 37674, 37683, 37684, 37686, 37687, 37703, - 37704, 37705, 37712, 37713, 37714, 37717, 37719, 37720, 37722, 37726, - 37732, 37733, 37735, 37737, 37738, 37741, 37743, 37744, 37745, 37747, - 37748, 37750, 37754, 37757, 37759, 37760, 37761, 37762, 37768, 37770, - 37771, 37773, 37775, 37778, 37781, 37784, 37787, 37790, 37793, 37795, - 37796, 37798, 37800, 37803, 37812, 37813, 37814, 37818, 37801, 37825, - 37828, 37829, 37830, 37831, 37833, 37834, 37835, 37836, 37837, 37843, - 37849, 37852, 37854, 37855, 37858, 37862, 37863, 37881, 37879, 37880, - 37882, 37883, 37885, 37889, 37890, 37892, 37896, 37897, 37901, 37902, - 37903, 37909, 37910, 37911, 37919, 37934, 37935, 37937, 37938, 37939, - 37940, 37947, 37951, 37949, 37955, 37957, 37960, 37962, 37964, 37973, - 37977, 37980, 37983, 37985, 37987, 37992, 37995, 37997, 37998, 37999, - 38001, 38002, 38020, 38019, 38264, 38265, 38270, 38276, 38280, 38284, - 38285, 38286, 38301, 38302, 38303, 38305, 38310, 38313, 38315, 38316, - 38324, 38326, 38330, 38333, 38335, 38342, 38344, 38345, 38347, 38352, - 38353, 38354, 38355, 38361, 38362, 38365, 38366, 38367, 38368, 38372, - 38374, 38429, 38430, 38434, 38436, 38437, 38438, 38444, 38449, 38451, - 38455, 38456, 38457, 38458, 38460, 38461, 38465, 38482, 38484, 38486, - 38487, 38488, 38497, 38510, 38516, 38523, 38524, 38526, 38527, 38529, - 38530, 38531, 38532, 38537, 38545, 38550, 38554, 38557, 38559, 38564, - 38565, 38566, 38569, 38574, 38575, 38579, 38586, 38602, 38610, 23986, - 38616, 38618, 38621, 38622, 38623, 38633, 38639, 38641, 38650, 38658, - 38659, 38661, 38665, 38682, 38683, 38685, 38689, 38690, 38691, 38696, - 38705, 38707, 38721, 38723, 38730, 38734, 38735, 38741, 38743, 38744, - 38746, 38747, 38755, 38759, 38762, 38766, 38771, 38774, 38775, 38776, - 38779, 38781, 38783, 38784, 38793, 38805, 38806, 38807, 38809, 38810, - 38814, 38815, 38818, 38828, 38830, 38833, 38834, 38837, 38838, 38840, - 38841, 38842, 38844, 38846, 38847, 38849, 38852, 38853, 38855, 38857, - 38858, 38860, 38861, 38862, 38864, 38865, 38868, 38871, 38872, 38873, - 38877, 38878, 38880, 38875, 38881, 38884, 38895, 38897, 38900, 38903, - 38904, 38906, 38919, 38922, 38937, 38925, 38926, 38932, 38934, 38940, - 38942, 38944, 38947, 38950, 38955, 38958, 38959, 38960, 38962, 38963, - 38965, 38949, 38974, 38980, 38983, 38986, 38993, 38994, 38995, 38998, - 38999, 39001, 39002, 39010, 39011, 39013, 39014, 39018, 39020, 39083, - 39085, 39086, 39088, 39092, 39095, 39096, 39098, 39099, 39103, 39106, - 39109, 39112, 39116, 39137, 39139, 39141, 39142, 39143, 39146, 39155, - 39158, 39170, 39175, 39176, 39185, 39189, 39190, 39191, 39194, 39195, - 39196, 39199, 39202, 39206, 39207, 39211, 39217, 39218, 39219, 39220, - 39221, 39225, 39226, 39227, 39228, 39232, 39233, 39238, 39239, 39240, - 39245, 39246, 39252, 39256, 39257, 39259, 39260, 39262, 39263, 39264, - 39323, 39325, 39327, 39334, 39344, 39345, 39346, 39349, 39353, 39354, - 39357, 39359, 39363, 39369, 39379, 39380, 39385, 39386, 39388, 39390, - 39399, 39402, 39403, 39404, 39408, 39412, 39413, 39417, 39421, 39422, - 39426, 39427, 39428, 39435, 39436, 39440, 39441, 39446, 39454, 39456, - 39458, 39459, 39460, 39463, 39469, 39470, 39475, 39477, 39478, 39480, - 39495, 39489, 39492, 39498, 39499, 39500, 39502, 39505, 39508, 39510, - 39517, 39594, 39596, 39598, 39599, 39602, 39604, 39605, 39606, 39609, - 39611, 39614, 39615, 39617, 39619, 39622, 39624, 39630, 39632, 39634, - 39637, 39638, 39639, 39643, 39644, 39648, 39652, 39653, 39655, 39657, - 39660, 39666, 39667, 39669, 39673, 39674, 39677, 39679, 39680, 39681, - 39682, 39683, 39684, 39685, 39688, 39689, 39691, 39692, 39693, 39694, - 39696, 39698, 39702, 39705, 39707, 39708, 39712, 39718, 39723, 39725, - 39731, 39732, 39733, 39735, 39737, 39738, 39741, 39752, 39755, 39756, - 39765, 39766, 39767, 39771, 39774, 39777, 39779, 39781, 39782, 39784, - 39786, 39787, 39788, 39789, 39790, 39795, 39797, 39799, 39800, 39801, - 39807, 39808, 39812, 39813, 39814, 39815, 39817, 39818, 39819, 39821, - 39823, 39824, 39828, 39834, 39837, 39838, 39846, 39847, 39849, 39852, - 39856, 39857, 39858, 39863, 39864, 39867, 39868, 39870, 39871, 39873, - 39879, 39880, 39886, 39888, 39895, 39896, 39901, 39903, 39909, 39911, - 39914, 39915, 39919, 39923, 39927, 39928, 39929, 39930, 39933, 39935, - 39936, 39938, 39947, 39951, 39953, 39958, 39960, 39961, 39962, 39964, - 39966, 39970, 39971, 39974, 39975, 39976, 39977, 39978, 39985, 39989, - 39990, 39991, 39997, 40001, 40003, 40004, 40005, 40009, 40010, 40014, - 40015, 40016, 40019, 40020, 40022, 40024, 40027, 40029, 40030, 40031, - 40035, 40041, 40042, 40028, 40043, 40040, 40046, 40048, 40050, 40053, - 40055, 40059, 40166, 40178, 40183, 40185, 40203, 40194, 40209, 40215, - 40216, 40220, 40221, 40222, 40239, 40240, 40242, 40243, 40244, 40250, - 40252, 40261, 40253, 40258, 40259, 40263, 40266, 40275, 40276, 40287, - 40291, 40290, 40293, 40297, 40298, 40299, 40304, 40310, 40311, 40315, - 40316, 40318, 40323, 40324, 40326, 40330, 40333, 40334, 40338, 40339, - 40341, 40342, 40343, 40344, 40353, 40362, 40364, 40366, 40369, 40373, - 40377, 40380, 40383, 40387, 40391, 40393, 40394, 40404, 40405, 40406, - 40407, 40410, 40414, 40415, 40416, 40421, 40423, 40425, 40427, 40430, - 40432, 40435, 40436, 40446, 40458, 40450, 40455, 40462, 40464, 40465, - 40466, 40469, 40470, 40473, 40476, 40477, 40570, 40571, 40572, 40576, - 40578, 40579, 40580, 40581, 40583, 40590, 40591, 40598, 40600, 40603, - 40606, 40612, 40616, 40620, 40622, 40623, 40624, 40627, 40628, 40629, - 40646, 40648, 40651, 40661, 40671, 40676, 40679, 40684, 40685, 40686, - 40688, 40689, 40690, 40693, 40696, 40703, 40706, 40707, 40713, 40719, - 40720, 40721, 40722, 40724, 40726, 40727, 40729, 40730, 40731, 40735, - 40738, 40742, 40746, 40747, 40751, 40753, 40754, 40756, 40759, 40761, - 40762, 40764, 40765, 40767, 40769, 40771, 40772, 40773, 40774, 40775, - 40787, 40789, 40790, 40791, 40792, 40794, 40797, 40798, 40808, 40809, - 40813, 40814, 40815, 40816, 40817, 40819, 40821, 40826, 40829, 40847, - 40848, 40849, 40850, 40852, 40854, 40855, 40862, 40865, 40866, 40867, - 40869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_koi8_r[] = { - 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, - 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, - 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, - 183, 247, 9552, 9553, 9554, 1105, 9555, 9556, 9557, 9558, - 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, - 9569, 1025, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, - 9578, 9579, 9580, 169, 1102, 1072, 1073, 1094, 1076, 1077, - 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, - 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, - 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, - 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, - 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, -}; - -static const unsigned long myhtml_encoding_map_koi8_u[] = { - 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, - 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, - 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, - 183, 247, 9552, 9553, 9554, 1105, 1108, 9556, 1110, 1111, - 9559, 9560, 9561, 9562, 9563, 1169, 1118, 9566, 9567, 9568, - 9569, 1025, 1028, 9571, 1030, 1031, 9574, 9575, 9576, 9577, - 9578, 1168, 1038, 169, 1102, 1072, 1073, 1094, 1076, 1077, - 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, - 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, - 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, - 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, - 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, - 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, -}; - -static const unsigned long myhtml_encoding_map_macintosh[] = { - 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, - 228, 227, 229, 231, 233, 232, 234, 235, 237, 236, - 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, - 251, 252, 8224, 176, 162, 163, 167, 8226, 182, 223, - 174, 169, 8482, 180, 168, 8800, 198, 216, 8734, 177, - 8804, 8805, 165, 181, 8706, 8721, 8719, 960, 8747, 170, - 186, 937, 230, 248, 191, 161, 172, 8730, 402, 8776, - 8710, 171, 187, 8230, 160, 192, 195, 213, 338, 339, - 8211, 8212, 8220, 8221, 8216, 8217, 247, 9674, 255, 376, - 8260, 8364, 8249, 8250, 64257, 64258, 8225, 183, 8218, 8222, - 8240, 194, 202, 193, 203, 200, 205, 206, 207, 204, - 211, 212, 63743, 210, 218, 219, 217, 305, 710, 732, - 175, 728, 729, 730, 184, 733, 731, 711, -}; - -static const unsigned long myhtml_encoding_map_windows_1250[] = { - 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, - 352, 8249, 346, 356, 381, 377, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 152, 8482, 353, 8250, 347, 357, - 382, 378, 160, 711, 728, 321, 164, 260, 166, 167, - 168, 169, 350, 171, 172, 173, 174, 379, 176, 177, - 731, 322, 180, 181, 182, 183, 184, 261, 351, 187, - 317, 733, 318, 380, 340, 193, 194, 258, 196, 313, - 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, - 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, - 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, - 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, - 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, - 345, 367, 250, 369, 252, 253, 355, 729, -}; - -static const unsigned long myhtml_encoding_map_windows_1251[] = { - 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, - 1033, 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, - 1115, 1119, 160, 1038, 1118, 1032, 164, 1168, 166, 167, - 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, - 1030, 1110, 1169, 181, 182, 183, 1105, 8470, 1108, 187, - 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, - 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, - 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, - 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, - 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, - 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, -}; - -static const unsigned long myhtml_encoding_map_windows_1252[] = { - 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, - 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, - 382, 376, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, -}; - -static const unsigned long myhtml_encoding_map_windows_1253[] = { - 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 136, 8240, - 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 157, - 158, 159, 160, 901, 902, 163, 164, 165, 166, 167, - 168, 169, 0x0000, 171, 172, 173, 174, 8213, 176, 177, - 178, 179, 900, 181, 182, 183, 904, 905, 906, 187, - 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, - 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, - 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, - 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 972, 973, 974, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_windows_1254[] = { - 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, - 352, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, - 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, - 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 305, 351, 255, -}; - -static const unsigned long myhtml_encoding_map_windows_1255[] = { - 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, - 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 156, 157, - 158, 159, 160, 161, 162, 163, 8362, 165, 166, 167, - 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, - 188, 189, 190, 191, 1456, 1457, 1458, 1459, 1460, 1461, - 1462, 1463, 1464, 1465, 0x0000, 1467, 1468, 1469, 1470, 1471, - 1472, 1473, 1474, 1475, 1520, 1521, 1522, 1523, 1524, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1488, 1489, 1490, 1491, - 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, - 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, - 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_windows_1256[] = { - 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, - 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, - 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, - 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, - 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, - 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, - 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, - 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, - 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, - 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, - 1617, 249, 1618, 251, 252, 8206, 8207, 1746, -}; - -static const unsigned long myhtml_encoding_map_windows_1257[] = { - 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, - 138, 8249, 140, 168, 711, 184, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 175, - 731, 159, 160, 0x0000, 162, 163, 164, 0x0000, 166, 167, - 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, - 178, 179, 180, 181, 182, 183, 248, 185, 343, 187, - 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, - 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, - 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, - 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, - 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, - 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, - 371, 322, 347, 363, 252, 380, 382, 729, -}; - -static const unsigned long myhtml_encoding_map_windows_1258[] = { - 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, - 138, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 339, 157, - 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 258, 196, 197, - 198, 199, 200, 201, 202, 203, 768, 205, 206, 207, - 272, 209, 777, 211, 212, 416, 214, 215, 216, 217, - 218, 219, 220, 431, 771, 223, 224, 225, 226, 259, - 228, 229, 230, 231, 232, 233, 234, 235, 769, 237, - 238, 239, 273, 241, 803, 243, 244, 417, 246, 247, - 248, 249, 250, 251, 252, 432, 8363, 255, -}; - -static const unsigned long myhtml_encoding_map_windows_874[] = { - 8364, 129, 130, 131, 132, 8230, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 8216, 8217, 8220, - 8221, 8226, 8211, 8212, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 3585, 3586, 3587, 3588, 3589, 3590, 3591, - 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, - 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, - 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, - 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, - 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, - 3642, 0x0000, 0x0000, 0x0000, 0x0000, 3647, 3648, 3649, 3650, 3651, - 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, - 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, - 3672, 3673, 3674, 3675, 0x0000, 0x0000, 0x0000, 0x0000, -}; - -static const unsigned long myhtml_encoding_map_x_mac_cyrillic[] = { - 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, - 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, - 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, - 1070, 1071, 8224, 176, 1168, 163, 167, 8226, 182, 1030, - 174, 169, 8482, 1026, 1106, 8800, 1027, 1107, 8734, 177, - 8804, 8805, 1110, 181, 1169, 1032, 1028, 1108, 1031, 1111, - 1033, 1113, 1034, 1114, 1112, 1029, 172, 8730, 402, 8776, - 8710, 171, 187, 8230, 160, 1035, 1115, 1036, 1116, 1109, - 8211, 8212, 8220, 8221, 8216, 8217, 247, 8222, 1038, 1118, - 1039, 1119, 8470, 1025, 1105, 1103, 1072, 1073, 1074, 1075, - 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, - 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 8364, -}; - -static const myhtml_encoding_custom_f myhtml_encoding_function_index[] = { - myhtml_encoding_decode_utf_8, NULL, NULL, myhtml_encoding_decode_utf_8, myhtml_encoding_decode_utf_16le, - myhtml_encoding_decode_utf_16be, myhtml_encoding_decode_x_user_defined, - myhtml_encoding_decode_big5, myhtml_encoding_decode_euc_kr, myhtml_encoding_decode_gb18030, - myhtml_encoding_decode_ibm866, myhtml_encoding_decode_iso_8859_10, myhtml_encoding_decode_iso_8859_13, - myhtml_encoding_decode_iso_8859_14, myhtml_encoding_decode_iso_8859_15, myhtml_encoding_decode_iso_8859_16, - myhtml_encoding_decode_iso_8859_2, myhtml_encoding_decode_iso_8859_3, myhtml_encoding_decode_iso_8859_4, - myhtml_encoding_decode_iso_8859_5, myhtml_encoding_decode_iso_8859_6, myhtml_encoding_decode_iso_8859_7, - myhtml_encoding_decode_iso_8859_8, myhtml_encoding_decode_koi8_r, myhtml_encoding_decode_koi8_u, - myhtml_encoding_decode_macintosh, myhtml_encoding_decode_windows_1250, myhtml_encoding_decode_windows_1251, - myhtml_encoding_decode_windows_1252, myhtml_encoding_decode_windows_1253, myhtml_encoding_decode_windows_1254, - myhtml_encoding_decode_windows_1255, myhtml_encoding_decode_windows_1256, myhtml_encoding_decode_windows_1257, - myhtml_encoding_decode_windows_1258, myhtml_encoding_decode_windows_874, myhtml_encoding_decode_x_mac_cyrillic, - myhtml_encoding_decode_iso_2022_jp, myhtml_encoding_decode_gbk, myhtml_encoding_decode_shift_jis, - myhtml_encoding_decode_euc_jp, myhtml_encoding_decode_iso_8859_8_i -}; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_ENCODING_RESOURCE_H */ - - - - diff --git a/include/myhtml/incoming.h b/include/myhtml/incoming.h deleted file mode 100644 index 6755d4e..0000000 --- a/include/myhtml/incoming.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_INCOMING_H -#define MyHTML_INCOMING_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -struct myhtml_incoming_buffer { - const char* data; - size_t length; // use of data - size_t size; // size of data - size_t offset; // begin global offset - - struct myhtml_incoming_buffer* prev; - struct myhtml_incoming_buffer* next; -}; - - -// incoming buffer -myhtml_incoming_buffer_t * myhtml_incoming_buffer_add(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, const char *html, size_t html_size); -void myhtml_incoming_buffer_clean(myhtml_incoming_buffer_t *current); -myhtml_incoming_buffer_t * myhtml_incoming_buffer_split(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, size_t global_pos); - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); - -const char * myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); -size_t myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); -myhtml_incoming_buffer_t * myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); - -size_t myhtml_incoming_buffer_convert_one_escaped_to_code_point(myhtml_incoming_buffer_t **inc_buf, size_t *relative_pos); -size_t myhtml_incoming_buffer_escaped_case_cmp(myhtml_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_INCOMING_H */ diff --git a/include/myhtml/myhtml.h b/include/myhtml/myhtml.h index d214e6a..d111add 100644 --- a/include/myhtml/myhtml.h +++ b/include/myhtml/myhtml.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,19 +28,19 @@ extern "C" { #include -#include -#include +#include +#include +#include +#include +#include #include #include #include #include #include -#include #include #include #include -#include -#include #include #define mh_queue_current() tree->queue @@ -65,8 +65,10 @@ extern "C" { (onechar < 'A' || onechar > 'Z')) struct myhtml { - mythread_t *thread; - //mchar_async_t *mchar; // for all + mythread_t* thread_stream; + mythread_t* thread_batch; + mythread_t* thread_list[3]; + size_t thread_total; myhtml_tokenizer_state_f* parse_state_func; myhtml_insertion_f* insertion_func; @@ -83,68 +85,68 @@ struct myhtml_collection { myhtml_t * myhtml_create(void); -myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); +mystatus_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); void myhtml_clean(myhtml_t* myhtml); myhtml_t* myhtml_destroy(myhtml_t* myhtml); -myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); +mystatus_t myhtml_parse_fragment(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); +mystatus_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_chunk_end(myhtml_tree_t* tree); +mystatus_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); +mystatus_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); +mystatus_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse_chunk_end(myhtml_tree_t* tree); // encoding -void myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); -myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree); +void myhtml_encoding_set(myhtml_tree_t* tree, myencoding_t encoding); +myencoding_t myhtml_encoding_get(myhtml_tree_t* tree); -myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status); -myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, myhtml_status_t *status); -myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, myhtml_status_t* status); +myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, mystatus_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, mystatus_t *status); +myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, mystatus_t* status); /* like a [some=value] or #id */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some~=value] or .class */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some^=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some$=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some*=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some|=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); -myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, myhtml_status_t *status); -myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, mystatus_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, mystatus_t *status); myhtml_tree_node_t * myhtml_node_first(myhtml_tree_t* tree); myhtml_tree_node_t * myhtml_node_next(myhtml_tree_node_t *node); @@ -174,7 +176,7 @@ bool myhtml_node_is_close_self(myhtml_tree_node_t *node); myhtml_tree_attr_t * myhtml_node_attribute_first(myhtml_tree_node_t *node); myhtml_tree_attr_t * myhtml_node_attribute_last(myhtml_tree_node_t *node); const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length); -myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node); +mycore_string_t * myhtml_node_string(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); void myhtml_node_set_data(myhtml_tree_node_t *node, void* data); @@ -188,10 +190,10 @@ void myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t const char * myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length); const char * myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); -myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr); -myhtml_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr); +mycore_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr); +mycore_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr); myhtml_tree_attr_t * myhtml_attribute_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); -myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding); +myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myencoding_t encoding); myhtml_tree_attr_t * myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); myhtml_tree_attr_t * myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); void myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); @@ -200,35 +202,20 @@ myhtml_position_t myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr); myhtml_position_t myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr); /* collection */ -myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *status); +myhtml_collection_t * myhtml_collection_create(size_t size, mystatus_t *status); void myhtml_collection_clean(myhtml_collection_t *collection); myhtml_collection_t * myhtml_collection_destroy(myhtml_collection_t *collection); -myhtml_status_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); +mystatus_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); // strings -myhtml_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); -myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); +mycore_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, myencoding_t encoding); +mycore_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, myencoding_t encoding); bool myhtml_utils_strcmp(const char* ab, const char* to_lowercase, size_t size); bool myhtml_is_html_node(myhtml_tree_node_t *node, myhtml_tag_id_t tag_id); // queue -myhtml_status_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token); - -/** - * Platform-specific hdef performance clock queries. - * Implemented in perf.c - */ - -/** Get clock resolution */ -uint64_t myhtml_hperf_res(myhtml_status_t *status); - -/** Get current value in clock ticks */ -uint64_t myhtml_hperf_clock(myhtml_status_t *status); - -/** Print an hperf measure */ -myhtml_status_t myhtml_hperf_print(const char *name, uint64_t x, uint64_t y, FILE *fh); -myhtml_status_t myhtml_hperf_print_by_val(const char *name, uint64_t x, FILE *fh); +mystatus_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token); /* version */ myhtml_version_t myhtml_version(void); diff --git a/include/myhtml/mynamespace.h b/include/myhtml/mynamespace.h index 8046291..6ebf0ab 100644 --- a/include/myhtml/mynamespace.h +++ b/include/myhtml/mynamespace.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,7 +31,7 @@ extern "C" { #include #include -#include +#include struct myhtml_namespace_detect_name_entry { const char* name; diff --git a/include/myhtml/mynamespace_resource.h b/include/myhtml/mynamespace_resource.h index e584cb7..be20f0b 100644 --- a/include/myhtml/mynamespace_resource.h +++ b/include/myhtml/mynamespace_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/myosi.h b/include/myhtml/myosi.h index 3901fae..cbacbe7 100644 --- a/include/myhtml/myosi.h +++ b/include/myhtml/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,181 +22,23 @@ #define MyHTML_MYOSI_H #pragma once -#include -#include -#include -#include -#include -#include +#include -#define MyHTML_VERSION_MAJOR 3 +#define MyHTML_VERSION_MAJOR 4 #define MyHTML_VERSION_MINOR 0 #define MyHTML_VERSION_PATCH 0 -#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WINPTHREADS_VERSION) -#define IS_OS_WINDOWS -#include -#endif - -#if defined(_MSC_VER) -# define MyHTML_DEPRECATED(func) __declspec(deprecated) func -#elif defined(__GNUC__) || defined(__INTEL_COMPILER) -# define MyHTML_DEPRECATED(func) func __attribute__((deprecated)) -#else -# define MyHTML_DEPRECATED(func) func -#endif +#define MyHTML_VERSION_STRING MyCORE_STR(MyHTML_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_PATCH) #ifdef __cplusplus extern "C" { #endif -/* Mem */ -#ifdef MyHTML_EXTERN_MALLOC - extern void * MyHTML_EXTERN_MALLOC(size_t size); - #define myhtml_malloc MyHTML_EXTERN_MALLOC -#else - #define myhtml_malloc myhtml_mem_malloc -#endif - -#ifdef MyHTML_EXTERN_REALLOC - extern void * MyHTML_EXTERN_REALLOC(void* dst, size_t size); - #define myhtml_realloc MyHTML_EXTERN_REALLOC -#else - #define myhtml_realloc myhtml_mem_realloc -#endif - -#ifdef MyHTML_EXTERN_CALLOC - extern void * MyHTML_EXTERN_CALLOC(size_t num, size_t size); - #define myhtml_calloc MyHTML_EXTERN_CALLOC -#else - #define myhtml_calloc myhtml_mem_calloc -#endif - -#ifdef MyHTML_EXTERN_FREE - extern void MyHTML_EXTERN_FREE(void* dst); - #define myhtml_free MyHTML_EXTERN_FREE -#else - #define myhtml_free myhtml_mem_free -#endif - -/* Debug */ -#ifdef DEBUG_MODE - #define MyHTML_DEBUG(format, ...) \ - myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) -#else - #define MyHTML_DEBUG(format, ...) -#endif - -#ifdef DEBUG_MODE - #define MyHTML_DEBUG_ERROR(format, ...) \ - myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) -#else - #define MyHTML_DEBUG_ERROR(format, ...) -#endif - -#define myhtml_base_add(myhtml, point, lenn, sizen, strcn, size) \ - myhtml->Lenn++; \ - if(myhtml->lenn == myhtml->sizen) { \ - myhtml->sizen += size; \ - myhtml->point = (strcn*)myhtml_realloc(myhtml->point, \ - sizeof(strcn) * myhtml->sizen); \ - } - #define MyHTML_FAILED(_status_) ((_status_) != MyHTML_STATUS_OK) -// encoding -// https://encoding.spec.whatwg.org/#the-encoding -// https://encoding.spec.whatwg.org/#legacy-single-byte-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(simplified)-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(traditional)-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-japanese-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-korean-encodings -// https://encoding.spec.whatwg.org/#legacy-miscellaneous-encodings - -enum myhtml_encoding_list { - MyHTML_ENCODING_DEFAULT = 0x00, -// MyHTML_ENCODING_AUTO = 0x01, // future - MyHTML_ENCODING_NOT_DETERMINED = 0x02, - MyHTML_ENCODING_UTF_8 = 0x00, // default encoding - MyHTML_ENCODING_UTF_16LE = 0x04, - MyHTML_ENCODING_UTF_16BE = 0x05, - MyHTML_ENCODING_X_USER_DEFINED = 0x06, - MyHTML_ENCODING_BIG5 = 0x07, - MyHTML_ENCODING_EUC_JP = 0x08, - MyHTML_ENCODING_EUC_KR = 0x09, - MyHTML_ENCODING_GB18030 = 0x0a, - MyHTML_ENCODING_GBK = 0x0b, - MyHTML_ENCODING_IBM866 = 0x0c, - MyHTML_ENCODING_ISO_2022_JP = 0x0d, - MyHTML_ENCODING_ISO_8859_10 = 0x0e, - MyHTML_ENCODING_ISO_8859_13 = 0x0f, - MyHTML_ENCODING_ISO_8859_14 = 0x10, - MyHTML_ENCODING_ISO_8859_15 = 0x11, - MyHTML_ENCODING_ISO_8859_16 = 0x12, - MyHTML_ENCODING_ISO_8859_2 = 0x13, - MyHTML_ENCODING_ISO_8859_3 = 0x14, - MyHTML_ENCODING_ISO_8859_4 = 0x15, - MyHTML_ENCODING_ISO_8859_5 = 0x16, - MyHTML_ENCODING_ISO_8859_6 = 0x17, - MyHTML_ENCODING_ISO_8859_7 = 0x18, - MyHTML_ENCODING_ISO_8859_8 = 0x19, - MyHTML_ENCODING_ISO_8859_8_I = 0x1a, - MyHTML_ENCODING_KOI8_R = 0x1b, - MyHTML_ENCODING_KOI8_U = 0x1c, - MyHTML_ENCODING_MACINTOSH = 0x1d, - MyHTML_ENCODING_SHIFT_JIS = 0x1e, - MyHTML_ENCODING_WINDOWS_1250 = 0x1f, - MyHTML_ENCODING_WINDOWS_1251 = 0x20, - MyHTML_ENCODING_WINDOWS_1252 = 0x21, - MyHTML_ENCODING_WINDOWS_1253 = 0x22, - MyHTML_ENCODING_WINDOWS_1254 = 0x23, - MyHTML_ENCODING_WINDOWS_1255 = 0x24, - MyHTML_ENCODING_WINDOWS_1256 = 0x25, - MyHTML_ENCODING_WINDOWS_1257 = 0x26, - MyHTML_ENCODING_WINDOWS_1258 = 0x27, - MyHTML_ENCODING_WINDOWS_874 = 0x28, - MyHTML_ENCODING_X_MAC_CYRILLIC = 0x29, - MyHTML_ENCODING_LAST_ENTRY = 0x2a -} -typedef myhtml_encoding_t; - -typedef struct myhtml_encoding_result myhtml_encoding_result_t; -typedef struct myhtml_encoding_trigram myhtml_encoding_trigram_t; -typedef struct myhtml_encoding_trigram_result myhtml_encoding_trigram_result_t; -typedef struct myhtml_encoding_unicode_result myhtml_encoding_unicode_result_t; -typedef struct myhtml_encoding_detect_name_entry myhtml_encoding_detect_name_entry_t; -typedef struct myhtml_encoding_detect_attr myhtml_encoding_detect_attr_t; -typedef struct myhtml_encoding_entry_name_index myhtml_encoding_entry_name_index_t; - // char references typedef struct myhtml_data_process_entry myhtml_data_process_entry_t; -// strings -typedef struct myhtml_string_raw myhtml_string_raw_t; -typedef struct myhtml_string myhtml_string_t; - -// thread -enum mythread_thread_opt { - MyTHREAD_OPT_UNDEF = 0x00, - MyTHREAD_OPT_WAIT = 0x01, - MyTHREAD_OPT_QUIT = 0x02, - MyTHREAD_OPT_STOP = 0x04, - MyTHREAD_OPT_DONE = 0x08 -} -typedef mythread_thread_opt_t; - -typedef struct mythread_queue_list_entry mythread_queue_list_entry_t; -typedef struct mythread_queue_thread_param mythread_queue_thread_param_t; -typedef struct mythread_queue_list mythread_queue_list_t; -typedef struct mythread_queue_node mythread_queue_node_t; -typedef struct mythread_queue mythread_queue_t; - -typedef size_t mythread_id_t; -typedef struct mythread_workers_list mythread_workers_list_t; -typedef struct mythread_context mythread_context_t; -typedef struct mythread_list mythread_list_t; -typedef struct mythread mythread_t; - // tree enum myhtml_tree_flags { MyHTML_TREE_FLAGS_CLEAN = 0x000, @@ -386,68 +228,33 @@ enum myhtml_insertion_mode { // base /* Very important!!! - - for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 - for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 - for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 - for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 - for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 - for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 - for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 - not occupied 070000.. + See mycore/myosi.h:mystatus_t */ enum myhtml_status { MyHTML_STATUS_OK = 0x0000, MyHTML_STATUS_ERROR = 0x0001, MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0002, - MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, - MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, - MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, - MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, - MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, - MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, - MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, - MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, - MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, - MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, - MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, - MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, - MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, - MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, - MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, - MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, - MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, - MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, - MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, - MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, - MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, - MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, - MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, - MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, - MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, - MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, - MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, - MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, - MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, - MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, - MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, - MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, - MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, - MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x9064, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x912c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x912d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x9190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x9191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x9192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x9193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x9194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x9195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x91f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x91f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x91f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x91f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x91f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x9258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x9259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x9300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x9301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x9302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x9303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x9304 } typedef myhtml_status_t; @@ -486,7 +293,6 @@ struct myhtml_version { } typedef myhtml_version_t; -typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; typedef myhtml_token_attr_t myhtml_tree_attr_t; typedef struct myhtml_collection myhtml_collection_t; typedef struct myhtml myhtml_t; @@ -498,24 +304,14 @@ typedef size_t (*myhtml_tokenizer_state_f)(myhtml_tree_t* tree, myhtml_token_nod typedef bool (*myhtml_insertion_f)(myhtml_tree_t* tree, myhtml_token_node_t* token); // char references state -typedef size_t (*myhtml_data_process_state_f)(myhtml_data_process_entry_t* charef, myhtml_string_t* str, const char* data, size_t offset, size_t size); +typedef size_t (*myhtml_data_process_state_f)(myhtml_data_process_entry_t* charef, mycore_string_t* str, const char* data, size_t offset, size_t size); // callback functions typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); // find attribute value functions -typedef bool (*myhtml_attribute_value_find_f)(myhtml_string_t* str_key, const char* value, size_t value_len); - -// callback to be implemented by the user -typedef void (*myhtml_callback_serialize_f)(const char* buffer, size_t size, void* ctx); - -void * myhtml_mem_malloc(size_t size); -void * myhtml_mem_realloc(void* dst, size_t size); -void * myhtml_mem_calloc(size_t num, size_t size); -void myhtml_mem_free(void* dst); - -void myhtml_print(FILE* out, const char* format, ...); +typedef bool (*myhtml_attribute_value_find_f)(mycore_string_t* str_key, const char* value, size_t value_len); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myhtml/mystring.h b/include/myhtml/mystring.h index ff4be9f..caa8eb9 100644 --- a/include/myhtml/mystring.h +++ b/include/myhtml/mystring.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,129 +25,31 @@ #ifdef __cplusplus extern "C" { #endif - + #include -#include -#include + +#include +#include + +#include +#include #define myhtml_string_get(str, attr) str->attr #define myhtml_string_set(str, attr) myhtml_string_get(str, attr) #define myhtml_string_len(str) myhtml_string_get(str, length) -#define MyHTML_STRING_PREPROCESSOR_CHECK_BUFFER_SIZE(str, unsigned_data) \ - if(str->length >= str->size) { \ - myhtml_string_realloc(str, (str->length + 5)); \ - \ - unsigned_data = (unsigned char*)str->data; \ - } - -#define MyHTML_STRING_REALLOC_IF_NEED(str, need_length, upto) \ - if((str->length + need_length) >= str->size) { \ - myhtml_string_realloc(str, (str->length + need_length + upto)); \ - } \ - -#define MyHTML_STRING_APPEND_BYTE_WITHOUT_REALLOC(onechar, str) \ - str->data[str->length] = onechar; \ - str->length++ - -#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto) \ - if(str->length >= str->size) { \ - myhtml_string_realloc(str, (str->length + upto)); \ - } \ - str->data[str->length] = onechar - -#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC(onechar, str) \ - str->data[str->length] = onechar - -#define MyHTML_STRING_APPEND_BYTE(onechar, str, upto) \ - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto); \ - str->length++ - -#define myhtml_mystring_whitespace(onechar, action, logic) \ - (onechar action ' ' logic \ - onechar action '\t' logic \ - onechar action '\n' logic \ - onechar action '\f' logic \ - onechar action '\r') - -struct myhtml_string { - char* data; - size_t size; - size_t length; - - mchar_async_t *mchar; - size_t node_idx; -}; - -struct myhtml_string_raw { - char* data; - size_t size; - size_t length; -}; - -typedef size_t myhtml_string_index_t; - -char * myhtml_string_init(mchar_async_t *mchar, size_t node_idx, myhtml_string_t* str, size_t size); -char * myhtml_string_realloc(myhtml_string_t *str, size_t new_size); - -void myhtml_string_clean(myhtml_string_t* str); -void myhtml_string_clean_all(myhtml_string_t* str); -myhtml_string_t * myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); - -void myhtml_string_raw_clean(myhtml_string_raw_t* str_raw); -void myhtml_string_raw_clean_all(myhtml_string_raw_t* str_raw); -myhtml_string_raw_t * myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj); - -/* basic api */ -char * myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); -char * myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); -void myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); - -char * myhtml_string_data(myhtml_string_t *str); -size_t myhtml_string_length(myhtml_string_t *str); -size_t myhtml_string_size(myhtml_string_t *str); -char * myhtml_string_data_set(myhtml_string_t *str, char *data); -size_t myhtml_string_size_set(myhtml_string_t *str, size_t size); -size_t myhtml_string_length_set(myhtml_string_t *str, size_t length); - -/* append */ -void myhtml_string_append(myhtml_string_t* str, const char* data, size_t length); -void myhtml_string_append_one(myhtml_string_t* str, const char data); -void myhtml_string_append_lowercase(myhtml_string_t* str, const char* data, size_t length); -void myhtml_string_append_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); - -/* append with convert encoding */ -void myhtml_string_append_chunk_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); -void myhtml_string_append_one_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char data, myhtml_encoding_t encoding); - -/* append with convert encoding lowercase */ -void myhtml_string_append_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); -void myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); - -/* Oh, long long long name */ - /* append with convert encoding with preprocessing */ -size_t myhtml_string_append_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); -size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_with_convert_encoding_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); /* append with convert encoding lowercase with preprocessing */ -size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); -size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); - -void myhtml_string_append_with_replacement_null_characters_only(myhtml_string_t* str, const char* buff, size_t length); +size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); /* append with preprocessing */ -size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const char* buff, size_t length, size_t last_position); -size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); -size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); -size_t myhtml_string_raw_set_replacement_character(myhtml_string_t* target, size_t position); - -/* other functions */ -void myhtml_string_copy(myhtml_string_t* dest, myhtml_string_t* target); -size_t myhtml_string_raw_copy(char* str1, const char* str2, size_t size); -void myhtml_string_stay_only_whitespace(myhtml_string_t* target); -size_t myhtml_string_crop_whitespace_from_begin(myhtml_string_t* target); -size_t myhtml_string_whitespace_from_begin(myhtml_string_t* target); +size_t myhtml_string_before_append_any_preprocessing(mycore_string_t* str, const char* buff, size_t length, size_t last_position); +size_t myhtml_string_append_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, bool emit_null_chars); +size_t myhtml_string_append_lowercase_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, bool emit_null_chars); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myhtml/parser.h b/include/myhtml/parser.h index 8e3c3de..9d91d10 100644 --- a/include/myhtml/parser.h +++ b/include/myhtml/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -37,9 +37,9 @@ void myhtml_parser_stream(mythread_id_t thread_id, void* ctx); void myhtml_parser_worker(mythread_id_t thread_id, void* ctx); void myhtml_parser_worker_stream(mythread_id_t thread_id, void* ctx); -size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); -size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); -size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myhtml/rules.h b/include/myhtml/rules.h index 636cba4..6dbf79f 100644 --- a/include/myhtml/rules.h +++ b/include/myhtml/rules.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,8 +30,7 @@ extern "C" { #include #include - -myhtml_status_t myhtml_rules_init(myhtml_t* myhtml); +mystatus_t myhtml_rules_init(myhtml_t* myhtml); void myhtml_rules_stop_parsing(myhtml_tree_t* tree); bool myhtml_rules_tree_dispatcher(myhtml_tree_t* tree, myhtml_token_node_t* token); @@ -39,7 +38,6 @@ bool myhtml_insertion_mode_in_body_other_end_tag(myhtml_tree_t* tree, myhtml_tok bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* token); bool myhtml_insertion_mode_in_template(myhtml_tree_t* tree, myhtml_token_node_t* token); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/myhtml/serialization.h b/include/myhtml/serialization.h index 5c70946..353e5b6 100644 --- a/include/myhtml/serialization.h +++ b/include/myhtml/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,15 +31,15 @@ extern "C" { #endif // the serialization functions -bool myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); -bool myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* str); -bool myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, myhtml_callback_serialize_f callback, void* ptr); -bool myhtml_serialization_node_callback(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void* ptr); +mystatus_t myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); +mystatus_t myhtml_serialization_node_buffer(myhtml_tree_node_t* node, mycore_string_raw_t* str); +mystatus_t myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, mycore_callback_serialize_f callback, void* ptr); +mystatus_t myhtml_serialization_node_callback(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void* ptr); // in versuon 1.0.3 this is in public api. // Need to set deprecated? -bool myhtml_serialization(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); -bool myhtml_serialization_node(myhtml_tree_node_t* node, myhtml_string_raw_t* str); +mystatus_t myhtml_serialization(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); +mystatus_t myhtml_serialization_node(myhtml_tree_node_t* node, mycore_string_raw_t* str); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/myhtml/stream.h b/include/myhtml/stream.h index 14dd31c..4ea1017 100644 --- a/include/myhtml/stream.h +++ b/include/myhtml/stream.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -41,17 +41,17 @@ struct myhtml_stream_buffer { size_t length; size_t size; - myhtml_encoding_result_t res; + myencoding_result_t res; }; myhtml_stream_buffer_t * myhtml_stream_buffer_create(void); -myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size); +mystatus_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size); void myhtml_stream_buffer_clean(myhtml_stream_buffer_t* stream_buffer); myhtml_stream_buffer_t * myhtml_stream_buffer_destroy(myhtml_stream_buffer_t* stream_buffer, bool self_destroy); myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buffer_t* stream_buffer, size_t entry_data_size); myhtml_stream_buffer_entry_t * myhtml_stream_buffer_current_entry(myhtml_stream_buffer_t* stream_buffer); -myhtml_status_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size); +mystatus_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size); void myhtml_stream_buffer_entry_clean(myhtml_stream_buffer_entry_t* stream_buffer_entry); myhtml_stream_buffer_entry_t * myhtml_stream_buffer_entry_destroy(myhtml_stream_buffer_entry_t* stream_buffer_entry, bool self_destroy); diff --git a/include/myhtml/tag.h b/include/myhtml/tag.h index 384b841..4fc1da8 100644 --- a/include/myhtml/tag.h +++ b/include/myhtml/tag.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,12 +31,12 @@ extern "C" { #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define myhtml_tag_get(tags, idx, attr) tags->context[idx].attr @@ -52,7 +52,7 @@ extern "C" { tags->context_length++; \ if(tags->context_length == tags->context_size) { \ tags->context_size += 4096; \ - tags->context = (myhtml_tag_context_t*)myhtml_realloc(tags->context, \ + tags->context = (myhtml_tag_context_t*)mycore_realloc(tags->context, \ sizeof(myhtml_tag_context_t) * tags->context_size); \ } \ myhtml_tag_context_clean(tags, tags->context_length) @@ -89,7 +89,7 @@ struct myhtml_tag { }; myhtml_tag_t * myhtml_tag_create(void); -myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags); +mystatus_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags); void myhtml_tag_clean(myhtml_tag_t* tags); myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags); @@ -105,8 +105,6 @@ const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const ch const myhtml_tag_context_t * myhtml_tag_static_get_by_id(size_t idx); const myhtml_tag_context_t * myhtml_tag_static_search(const char* name, size_t length); -void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/myhtml/tag_const.h b/include/myhtml/tag_const.h index 0f5b389..1b29934 100644 --- a/include/myhtml/tag_const.h +++ b/include/myhtml/tag_const.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/thread.h b/include/myhtml/thread.h deleted file mode 100644 index 47b6629..0000000 --- a/include/myhtml/thread.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_THREAD_H -#define MyHTML_THREAD_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -#if !defined(IS_OS_WINDOWS) -# include -# include -#endif - -#include -#include - -#include -#include - -#include -#include -#include - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -#define MyTHREAD_SEM_NAME "myhtml" - -/* functions */ -typedef void (*mythread_callback_before_join_f)(mythread_t* mythread); -typedef void (*mythread_process_f)(void* arg); -typedef void (*mythread_work_f)(mythread_id_t thread_id, void* arg); - -#ifdef MyHTML_BUILD_WITHOUT_THREADS - -struct mythread { - int sys_last_error; -}; - -#else /* MyHTML_BUILD_WITHOUT_THREADS */ - -void mythread_function_queue_stream(void *arg); -void mythread_function_queue_batch(void *arg); -void mythread_function(void *arg); - -// thread -struct mythread_context { - mythread_id_t id; - -#if defined(IS_OS_WINDOWS) - HANDLE mutex; -#else - pthread_mutex_t *mutex; -#endif - - size_t sem_name_size; - - mythread_work_f func; - - volatile size_t t_count; - volatile mythread_thread_opt_t opt; - - mythread_t *mythread; - unsigned int status; -}; - -struct mythread_list { -#if defined(IS_OS_WINDOWS) - HANDLE pth; -#else - pthread_t pth; -#endif - mythread_context_t data; - mythread_process_f process_func; -}; - -struct mythread_workers_list { - mythread_list_t *list; - size_t count; -}; - -struct mythread { - mythread_list_t *pth_list; - size_t pth_list_length; - size_t pth_list_size; - size_t pth_list_root; - - void *context; - - char *sem_prefix; - size_t sem_prefix_length; - -#if !defined(IS_OS_WINDOWS) - pthread_attr_t *attr; -#endif - - int sys_last_error; - - mythread_id_t batch_first_id; - mythread_id_t batch_count; - - volatile mythread_thread_opt_t stream_opt; - volatile mythread_thread_opt_t batch_opt; -}; - -mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status); -mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t count); - -void myhtml_thread_nanosleep(const struct timespec *tomeout); - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -mythread_t * mythread_create(void); -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count); -void mythread_clean(mythread_t *mythread); -mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_join_f before_join, bool self_destroy); - -void mythread_stream_quit_all(mythread_t *mythread); -void mythread_batch_quit_all(mythread_t *mythread); - -void mythread_stream_stop_all(mythread_t *mythread); -void mythread_batch_stop_all(mythread_t *mythread); - -void mythread_stop_all(mythread_t *mythread); -void mythread_queue_wait_all_for_done(mythread_t *mythread); -void mythread_resume_all(mythread_t *mythread); -void mythread_suspend_all(mythread_t *mythread); -unsigned int mythread_check_status(mythread_t *mythread); - -// queue -struct mythread_queue_node { - mythread_queue_node_t *prev; - myhtml_token_node_t *token; - myhtml_tree_t *tree; -}; - -struct mythread_queue_thread_param { - volatile size_t use; -}; - -struct mythread_queue_list_entry { - mythread_queue_list_entry_t *next; - mythread_queue_list_entry_t *prev; - mythread_queue_t *queue; - mythread_queue_thread_param_t *thread_param; -}; - -struct mythread_queue_list { - mythread_queue_list_entry_t *first; - mythread_queue_list_entry_t *last; - - volatile size_t count; -}; - -struct mythread_queue { - mythread_queue_node_t **nodes; - - size_t nodes_pos; - size_t nodes_pos_size; - size_t nodes_length; - - volatile size_t nodes_uses; - volatile size_t nodes_size; - volatile size_t nodes_root; -}; - -mythread_queue_t * mythread_queue_create(size_t size, myhtml_status_t *status); -void mythread_queue_clean(mythread_queue_t* queue); -mythread_queue_t * mythread_queue_destroy(mythread_queue_t* token); - -void mythread_queue_node_clean(mythread_queue_node_t* qnode); - -size_t mythread_queue_count_used_node(mythread_queue_t* queue); -mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue); -mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode); -mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue); -mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status); -mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, myhtml_status_t *status); - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -mythread_queue_list_t * mythread_queue_list_create(myhtml_status_t *status); -void mythread_queue_list_destroy(mythread_queue_list_t* queue_list); - -size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list); - -mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status); -mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue); -void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry); -void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry); - -mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, myhtml_status_t *status); - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined(__myhtml__myhtml_thread__) */ - diff --git a/include/myhtml/token.h b/include/myhtml/token.h index 2a8206a..bf40736 100644 --- a/include/myhtml/token.h +++ b/include/myhtml/token.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,13 +29,13 @@ extern "C" { #include #include -#include +#include #include #include #include -#include -#include -#include +#include +#include +#include #define myhtml_token_node_set_done(token_node) token_node->type |= MyHTML_TOKEN_TYPE_DONE @@ -61,8 +61,8 @@ struct myhtml_token_attr { myhtml_token_attr_t* next; myhtml_token_attr_t* prev; - myhtml_string_t key; - myhtml_string_t value; + mycore_string_t key; + mycore_string_t value; size_t raw_key_begin; size_t raw_key_length; @@ -75,7 +75,7 @@ struct myhtml_token_attr { struct myhtml_token_node { myhtml_tag_id_t tag_id; - myhtml_string_t str; + mycore_string_t str; size_t raw_begin; size_t raw_length; @@ -115,7 +115,7 @@ myhtml_tree_attr_t * myhtml_token_node_attribute_first(myhtml_token_node_t *toke myhtml_tree_attr_t * myhtml_token_node_attribute_last(myhtml_token_node_t *token_node); const char * myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); -myhtml_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node); +mycore_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node); bool myhtml_token_node_is_close(myhtml_token_node_t *token_node); bool myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); @@ -130,7 +130,7 @@ myhtml_token_attr_t * myhtml_token_attr_remove_by_name(myhtml_token_node_t* node void myhtml_token_attr_delete_all(myhtml_token_t* token, myhtml_token_node_t* node); void myhtml_token_delete(myhtml_token_t* token, myhtml_token_node_t* node); -void myhtml_token_node_wait_for_done(myhtml_token_node_t* node); +void myhtml_token_node_wait_for_done(myhtml_token_t* token, myhtml_token_node_t* node); void myhtml_token_set_done(myhtml_token_node_t* node); myhtml_token_attr_t * myhtml_token_attr_match(myhtml_token_t* token, myhtml_token_node_t* target, const char* key, size_t key_size, const char* value, size_t value_size); @@ -143,7 +143,7 @@ void myhtml_token_adjust_svg_attributes(myhtml_token_node_t* target); void myhtml_token_adjust_foreign_attributes(myhtml_token_node_t* target); myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx); -myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx, myhtml_encoding_t encoding); +myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx, myencoding_t encoding); void myhtml_token_node_text_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* text, size_t text_len); void myhtml_token_node_attr_copy(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); void myhtml_token_node_attr_copy_with_check(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); @@ -154,10 +154,6 @@ bool myhtml_token_attr_compare(myhtml_token_node_t* target, myhtml_token_node_t* myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, myhtml_token_node_t* token_to, myhtml_token_node_t* token_from, bool cp_reverse); void myhtml_token_set_replacement_character_for_null_token(myhtml_tree_t* tree, myhtml_token_node_t* node); -void myhtml_token_print_param_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); -void myhtml_token_print_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); -void myhtml_token_print_attr(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/myhtml/tokenizer.h b/include/myhtml/tokenizer.h index 4b09881..5e65fe8 100644 --- a/include/myhtml/tokenizer.h +++ b/include/myhtml/tokenizer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,23 +27,23 @@ extern "C" { #endif #include -#include +#include +#include #include #include -#include #include #include #include - + #define myhtml_tokenizer_inc_html_offset(offset, size) \ offset++; \ if(offset >= size) \ return offset -myhtml_status_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length); -myhtml_status_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length); -myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length); -myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree); +mystatus_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length); +mystatus_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length); +mystatus_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length); +mystatus_t myhtml_tokenizer_end(myhtml_tree_t* tree); void myhtml_tokenizer_set_state(myhtml_tree_t* tree, myhtml_token_node_t* token_node); void myhtml_tokenizer_calc_current_namespace(myhtml_tree_t* tree, myhtml_token_node_t* token_node); @@ -54,7 +54,7 @@ void myhtml_tokenizer_wait(myhtml_tree_t* tree); void myhtml_tokenizer_post(myhtml_tree_t* tree); void myhtml_tokenizer_pause(myhtml_tree_t* tree); -myhtml_status_t myhtml_tokenizer_state_init(myhtml_t* myhtml); +mystatus_t myhtml_tokenizer_state_init(myhtml_t* myhtml); void myhtml_tokenizer_state_destroy(myhtml_t* myhtml); myhtml_token_node_t * myhtml_tokenizer_queue_create_text_node_if_need(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t absolute_html_offset, enum myhtml_token_type type); diff --git a/include/myhtml/tokenizer_doctype.h b/include/myhtml/tokenizer_doctype.h index 6e36004..0c353c8 100644 --- a/include/myhtml/tokenizer_doctype.h +++ b/include/myhtml/tokenizer_doctype.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ extern "C" { #endif #include -#include +#include #include size_t myhtml_tokenizer_state_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); diff --git a/include/myhtml/tokenizer_end.h b/include/myhtml/tokenizer_end.h index 4087ecc..adf16d7 100644 --- a/include/myhtml/tokenizer_end.h +++ b/include/myhtml/tokenizer_end.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/include/myhtml/tokenizer_script.h b/include/myhtml/tokenizer_script.h index b1d61b3..3ae7faa 100644 --- a/include/myhtml/tokenizer_script.h +++ b/include/myhtml/tokenizer_script.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ extern "C" { #endif #include -#include +#include #include #include diff --git a/include/myhtml/tree.h b/include/myhtml/tree.h index d6b75ec..6b2ffa7 100644 --- a/include/myhtml/tree.h +++ b/include/myhtml/tree.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,10 +31,11 @@ extern "C" { #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include #define myhtml_tree_get(tree, attr) tree->attr #define myhtml_tree_set(tree, attr) tree->attr @@ -164,7 +165,7 @@ struct myhtml_tree_temp_stream { size_t length; size_t size; - myhtml_encoding_result_t res; + myencoding_result_t res; struct myhtml_tree_temp_tag_name* current; }; @@ -185,6 +186,11 @@ struct myhtml_tree { size_t mcasync_rules_token_id; size_t mcasync_rules_attr_id; size_t mcasync_tree_id; + /* + * mchar_node_id + * for rules, or if single mode, + * or for main thread only after parsing + */ size_t mchar_node_id; myhtml_token_attr_t* attr_current; myhtml_tag_id_t tmp_tag_id; @@ -192,8 +198,8 @@ struct myhtml_tree { mythread_queue_node_t* current_qnode; mcobject_t* mcobject_incoming_buf; - myhtml_incoming_buffer_t* incoming_buf; - myhtml_incoming_buffer_t* incoming_buf_first; + mycore_incoming_buffer_t* incoming_buf; + mycore_incoming_buffer_t* incoming_buf_first; // ref for nodes myhtml_tree_node_t* document; @@ -227,10 +233,10 @@ struct myhtml_tree { volatile myhtml_tree_parse_flags_t parse_flags; bool foster_parenting; size_t global_offset; - myhtml_status_t tokenizer_status; + mystatus_t tokenizer_status; - myhtml_encoding_t encoding; - myhtml_encoding_t encoding_usereq; + myencoding_t encoding; + myencoding_t encoding_usereq; myhtml_tree_temp_tag_name_t temp_tag_name; /* callback */ @@ -249,7 +255,7 @@ struct myhtml_tree { // base myhtml_tree_t * myhtml_tree_create(void); -myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); +mystatus_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); void myhtml_tree_clean(myhtml_tree_t* tree); void myhtml_tree_clean_all(myhtml_tree_t* tree); myhtml_tree_t * myhtml_tree_destroy(myhtml_tree_t* tree); @@ -355,10 +361,6 @@ void myhtml_tree_node_clean(myhtml_tree_node_t* tree_node); void myhtml_tree_node_free(myhtml_tree_node_t* node); myhtml_tree_node_t * myhtml_tree_node_clone(myhtml_tree_node_t* node); -void myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); -void myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc); -void myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc); - void myhtml_tree_node_add_child(myhtml_tree_node_t* root, myhtml_tree_node_t* node); void myhtml_tree_node_insert_before(myhtml_tree_node_t* root, myhtml_tree_node_t* node); void myhtml_tree_node_insert_after(myhtml_tree_node_t* root, myhtml_tree_node_t* node); @@ -390,21 +392,21 @@ bool myhtml_tree_is_mathml_integration_point(myhtml_tree_t* tree, myhtml_tree_no bool myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node); // temp tag name -myhtml_status_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name); +mystatus_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name); void myhtml_tree_temp_tag_name_clean(myhtml_tree_temp_tag_name_t* temp_tag_name); myhtml_tree_temp_tag_name_t * myhtml_tree_temp_tag_name_destroy(myhtml_tree_temp_tag_name_t* temp_tag_name, bool self_destroy); -myhtml_status_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len); -myhtml_status_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name); +mystatus_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len); +mystatus_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name); /* special tonek list */ -myhtml_status_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special); -myhtml_status_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns); +mystatus_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special); +mystatus_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns); size_t myhtml_tree_special_list_length(myhtml_tree_special_token_list_t* special); myhtml_tree_special_token_t * myhtml_tree_special_list_get_last(myhtml_tree_special_token_list_t* special); size_t myhtml_tree_special_list_pop(myhtml_tree_special_token_list_t* special); /* incoming buffer */ -myhtml_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); +mycore_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); const char * myhtml_tree_incomming_buffer_make_data(myhtml_tree_t *tree, size_t begin, size_t length); #ifdef __cplusplus diff --git a/include/myhtml/utils.h b/include/myhtml/utils.h deleted file mode 100644 index 1b12b2e..0000000 --- a/include/myhtml/utils.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_H -#define MyHTML_UTILS_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#define myhtml_utils_whithspace(onechar, action, logic) \ - (onechar action ' ' logic \ - onechar action '\t' logic \ - onechar action '\n' logic \ - onechar action '\f' logic \ - onechar action '\r') - -size_t myhtml_strncasecmp(const char* str1, const char* str2, size_t size); -size_t myhtml_strcasecmp(const char* str1, const char* str2); -size_t myhtml_strncmp(const char* str1, const char* str2, size_t size); -size_t myhtml_strcmp(const char* str1, const char* str2); -size_t myhtml_strcmp_ws(const char* str1, const char* str2); -bool myhtml_ustrcasecmp_without_checks_by_secondary(const unsigned char* ustr1, const unsigned char* ustr2); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* utils_h */ diff --git a/include/myhtml/utils/avl_tree.h b/include/myhtml/utils/avl_tree.h deleted file mode 100644 index 10851b1..0000000 --- a/include/myhtml/utils/avl_tree.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_AVL_TREE_H -#define MyHTML_UTILS_AVL_TREE_H -#pragma once - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct myhtml_utils_avl_tree_node myhtml_utils_avl_tree_node_t; -typedef void (*myhtml_utils_avl_tree_node_callback_f)(myhtml_utils_avl_tree_node_t* avl_tree_node, void* ctx); - -struct myhtml_utils_avl_tree_node { - void *value; - size_t type; - - myhtml_utils_avl_tree_node_t* left; - myhtml_utils_avl_tree_node_t* right; - myhtml_utils_avl_tree_node_t* parent; - - short height; -}; - -struct myhtml_utils_avl_tree { - mcobject_t* mc_nodes; -} -typedef myhtml_utils_avl_tree_t; - -myhtml_utils_avl_tree_t * myhtml_utils_avl_tree_create(void); -myhtml_status_t myhtml_utils_avl_tree_init(myhtml_utils_avl_tree_t* avl_tree); -void myhtml_utils_avl_tree_clean(myhtml_utils_avl_tree_t* avl_tree); -myhtml_utils_avl_tree_t * myhtml_utils_avl_tree_destroy(myhtml_utils_avl_tree_t* avl_tree, bool self_destroy); - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_node_create_root(myhtml_utils_avl_tree_t* avl_tree, size_t type, void* value); - -void myhtml_utils_avl_tree_add(myhtml_utils_avl_tree_t* avl_tree, myhtml_utils_avl_tree_node_t** root, size_t type, void* value); -void * myhtml_utils_avl_tree_delete(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t** root, size_t type); -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_search_by_type(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t* node, size_t type); - -void myhtml_utils_avl_tree_list_all_nodes(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t* root, myhtml_utils_avl_tree_node_callback_f callback, void* ctx); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_UTILS_AVL_TREE_H */ diff --git a/include/myhtml/utils/mchar_async.h b/include/myhtml/utils/mchar_async.h deleted file mode 100644 index 11057a2..0000000 --- a/include/myhtml/utils/mchar_async.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCHAR_ASYNC_H -#define MyHTML_UTILS_MCHAR_ASYNC_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -#define mchar_async_cache_has_nodes(cache) cache.count - -typedef struct mchar_async_node mchar_async_node_t; - -struct mchar_async_cache_node { - void *value; - size_t size; - - size_t left; - size_t right; - size_t parent; -} -typedef mchar_async_cache_node_t; - -struct mchar_async_chunk { - char *begin; - size_t length; - size_t size; - - struct mchar_async_chunk *next; - struct mchar_async_chunk *prev; -} -typedef mchar_async_chunk_t; - -struct mchar_async_cache { - mchar_async_cache_node_t *nodes; - size_t nodes_size; - size_t nodes_length; - size_t nodes_root; - - size_t count; - - size_t *index; - size_t index_length; - size_t index_size; -} -typedef mchar_async_cache_t; - -struct mchar_async_node { - mchar_async_chunk_t *chunk; - mchar_async_cache_t cache; -}; - -struct mchar_async { - size_t origin_size; - - mchar_async_chunk_t **chunks; - size_t chunks_pos_size; - size_t chunks_pos_length; - size_t chunks_size; - size_t chunks_length; - - mchar_async_cache_t chunk_cache; - - mchar_async_node_t *nodes; - size_t nodes_length; - size_t nodes_size; - - size_t *nodes_cache; - size_t nodes_cache_length; - size_t nodes_cache_size; - - mcsync_t *mcsync; -} -typedef mchar_async_t; - - -mchar_async_t * mchar_async_create(size_t pos_size, size_t size); -void mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size); -void mchar_async_clean(mchar_async_t *mchar_async); -mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self); - -char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size); -char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size); -void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry); - -size_t mchar_async_node_add(mchar_async_t *mchar_async); -void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx); -void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx); - -mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length); -char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len); -char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len); - -size_t mchar_async_get_size_by_data(const char *data); - -// cache -void mchar_async_cache_init(mchar_async_cache_t *cache); -mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy); -void mchar_async_cache_clean(mchar_async_cache_t *cache); - -void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size); -size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* mchar_async_h */ - diff --git a/include/myhtml/utils/mcobject.h b/include/myhtml/utils/mcobject.h deleted file mode 100644 index b641327..0000000 --- a/include/myhtml/utils/mcobject.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCOBJECT_H -#define MyHTML_UTILS_MCOBJECT_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -struct mcobject_chunk { - unsigned char *begin; - size_t length; - size_t size; - - struct mcobject_chunk *next; - struct mcobject_chunk *prev; -} -typedef mcobject_chunk_t; - -struct mcobject { - mcobject_chunk_t *chunk; - - void **cache; - size_t cache_size; - size_t cache_length; - - size_t struct_size; - size_t chunk_size; -} -typedef mcobject_t; - - -mcobject_t * mcobject_create(void); -myhtml_status_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size); -void mcobject_clean(mcobject_t *mcobject); -mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self); - -void mcobject_chunk_malloc(mcobject_t* mcobject, myhtml_status_t* status); - -void * mcobject_malloc(mcobject_t *mcobject, myhtml_status_t* status); -myhtml_status_t mcobject_free(mcobject_t *mcobject, void *entry); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_UTILS_MCOBJECT_H */ - diff --git a/include/myhtml/utils/mcobject_async.h b/include/myhtml/utils/mcobject_async.h deleted file mode 100644 index 4d632c2..0000000 --- a/include/myhtml/utils/mcobject_async.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCOBJECT_ASYNC_H -#define MyHTML_UTILS_MCOBJECT_ASYNC_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -enum mcobject_async_status { - MCOBJECT_ASYNC_STATUS_OK = 0, - MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION = 1, - MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION = 2, - MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION = 3, - MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION = 4, - MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID = 5, - MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC = 6 -} -typedef mcobject_async_status_t; - -struct mcobject_async_chunk { - unsigned char *begin; - size_t length; - size_t size; - - struct mcobject_async_chunk *next; - struct mcobject_async_chunk *prev; -} -typedef mcobject_async_chunk_t; - -struct mcobject_async_node { - mcobject_async_chunk_t *chunk; - - void **cache; - size_t cache_size; - size_t cache_length; -} -typedef mcobject_async_node_t; - -struct mcobject_async { - size_t origin_size; - size_t struct_size; - size_t struct_size_sn; - - mcobject_async_chunk_t **chunk_cache; - size_t chunk_cache_size; - size_t chunk_cache_length; - - mcobject_async_chunk_t **chunks; - size_t chunks_pos_size; - size_t chunks_pos_length; - size_t chunks_size; - size_t chunks_length; - - mcobject_async_node_t *nodes; - size_t nodes_length; - size_t nodes_size; - - size_t *nodes_cache; - size_t nodes_cache_length; - size_t nodes_cache_size; - - mcsync_t *mcsync; -} -typedef mcobject_async_t; - -mcobject_async_t * mcobject_async_create(void); -mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size); - -void mcobject_async_clean(mcobject_async_t *mcobj_async); -mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self); - -size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status); -void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx); -void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async); -void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx); - -void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status); -mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry); - -mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); -mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* mcobject_async_h */ - - - - diff --git a/include/myhtml/utils/mcsimple.h b/include/myhtml/utils/mcsimple.h deleted file mode 100644 index 76a0294..0000000 --- a/include/myhtml/utils/mcsimple.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCSIMPLE_H -#define MyHTML_UTILS_MCSIMPLE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -struct mcsimple { - size_t struct_size; - - uint8_t **list; - - size_t list_pos_size; - size_t list_pos_length; - size_t list_pos_length_used; - size_t list_size; - size_t list_length; -} -typedef mcsimple_t; - - -mcsimple_t * mcsimple_create(void); -void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size); -void mcsimple_clean(mcsimple_t *mcsimple); -mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self); - -uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos); - -void * mcsimple_malloc(mcsimple_t *mcsimple); -void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_UTILS_MCSIMPLE_H */ - diff --git a/include/myhtml/utils/mcsync.h b/include/myhtml/utils/mcsync.h deleted file mode 100644 index b9e268b..0000000 --- a/include/myhtml/utils/mcsync.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCSYNC_H -#define MyHTML_UTILS_MCSYNC_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#include - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) -#if defined(IS_OS_WINDOWS) - typedef CRITICAL_SECTION pthread_mutex_t; - typedef unsigned long pthread_mutexattr_t; -#else -# include -#endif -#endif - -enum mcsync_status { - MCSYNC_STATUS_OK = 0, - MCSYNC_STATUS_NOT_OK = 1, - MCSYNC_STATUS_ERROR_MEM_ALLOCATE = 2 -} -typedef mcsync_status_t; - -struct mcsync { - int spinlock; -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) - pthread_mutex_t *mutex; -#endif -} -typedef mcsync_t; - -mcsync_t * mcsync_create(void); -mcsync_status_t mcsync_init(mcsync_t* mcsync); -void mcsync_clean(mcsync_t* mcsync); -mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self); - -mcsync_status_t mcsync_lock(mcsync_t* mclock); -mcsync_status_t mcsync_unlock(mcsync_t* mclock); - -mcsync_status_t mcsync_mutex_lock(mcsync_t* mclock); -mcsync_status_t mcsync_mutex_unlock(mcsync_t* mclock); - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && defined(IS_OS_WINDOWS) - static int pthread_mutex_lock(pthread_mutex_t *mutex); - static int pthread_mutex_unlock(pthread_mutex_t *mutex); - static int pthread_mutex_init(pthread_mutex_t *m, pthread_mutexattr_t *a); - static int pthread_mutex_destroy(pthread_mutex_t *m); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* mcsync_h */ diff --git a/include/myhtml/utils/mctree.h b/include/myhtml/utils/mctree.h deleted file mode 100644 index aaf79c0..0000000 --- a/include/myhtml/utils/mctree.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCTREE_H -#define MyHTML_UTILS_MCTREE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include - -#include -#include -#include - -#define mctree_node_get_free_id(mctree) mctree->nodes_length - -#define mctree_node_clean(mctree, idx) \ - mctree->nodes[idx].str = NULL; \ - mctree->nodes[idx].value = NULL; \ - mctree->nodes[idx].child_count = 0; \ - mctree->nodes[idx].prev = 0; \ - mctree->nodes[idx].next = 0; \ - mctree->nodes[idx].child = 0 - -#define mctree_node_add(mctree) \ - mctree->nodes_length++; \ - if(mctree->nodes_length >= mctree->nodes_size) { \ - mctree->nodes_size = mctree->nodes_length + 4096; \ - mctree->nodes = (mctree_node_t*)myhtml_realloc(mctree->nodes, \ - sizeof(mctree_node_t) * mctree->nodes_size); \ - } \ - mctree_node_clean(mctree, mctree->nodes_length) - -#define mctree_make_first_idx(mctree, key, size) \ - ((myhtml_string_chars_lowercase_map[ (const unsigned char)(key[0]) ] + myhtml_string_chars_lowercase_map[ (const unsigned char)(key[size - 1]) ]) % mctree->start_size) + 1 - - -typedef size_t mctree_index_t; - -struct mctree_node { - const char* str; - size_t str_size; - void* value; - - size_t child_count; - mctree_index_t prev; - mctree_index_t next; - mctree_index_t child; -} -typedef mctree_node_t; - -struct mctree_tree { - mctree_node_t* nodes; - size_t nodes_length; - size_t nodes_size; - - size_t start_size; -} -typedef mctree_t; - -typedef void (*mctree_before_insert_f)(const char* key, size_t key_size, void **value); - - -mctree_t * mctree_create(size_t start_size); -void mctree_clean(mctree_t* mctree); -mctree_t * mctree_destroy(mctree_t* mctree); - -mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert); -mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size); -mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined(__mhtml__mtree__) */ diff --git a/include/myhtml/utils/mhash.h b/include/myhtml/utils/mhash.h deleted file mode 100644 index bbf3738..0000000 --- a/include/myhtml/utils/mhash.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2017 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef html_mhash_h -#define html_mhash_h - -#include -#include - -typedef struct myhtml_utils_mhash_entry myhtml_utils_mhash_entry_t; - -struct myhtml_utils_mhash_entry { - char* key; - size_t key_length; - - void *value; - - myhtml_utils_mhash_entry_t* next; -}; - -struct myhtml_utils_mhash { - mchar_async_t* mchar_obj; - size_t mchar_node; - - myhtml_utils_mhash_entry_t** table; - size_t table_size; - size_t table_length; - - size_t table_max_depth; -} -typedef myhtml_utils_mhash_t; - -myhtml_utils_mhash_t * myhtml_utils_mhash_create(void); -myhtml_status_t myhtml_utils_mhash_init(myhtml_utils_mhash_t* mhash, size_t table_size, size_t depth); -void myhtml_utils_mhash_clean(myhtml_utils_mhash_t* mhash); -myhtml_utils_mhash_t * myhtml_utils_mhash_destroy(myhtml_utils_mhash_t* mhash, bool self_destroy); -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_create_entry(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_add(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_search(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_add_with_choice(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size); - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_entry_by_id(myhtml_utils_mhash_t* mhash, size_t id); -size_t myhtml_utils_mhash_get_table_size(myhtml_utils_mhash_t* mhash); - -myhtml_utils_mhash_entry_t ** myhtml_utils_mhash_rebuld(myhtml_utils_mhash_t* mhash); - -#endif diff --git a/include/myhtml/utils/resources.h b/include/myhtml/utils/resources.h deleted file mode 100644 index beee061..0000000 --- a/include/myhtml/utils/resources.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_RESOURCES_H -#define MyHTML_UTILS_RESOURCES_H -#pragma once - -#include - -#define MyHTML_TOKENIZER_CHAR_OTHER '\000' -#define MyHTML_TOKENIZER_CHAR_A_Z_a_z '\001' -#define MyHTML_TOKENIZER_CHAR_WHITESPACE '\002' - -static const unsigned char myhtml_string_chars_num_map[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -static const unsigned char myhtml_string_chars_hex_map[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -static const unsigned char myhtml_string_chars_lowercase_map[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, - 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, - 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, - 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, - 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, - 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, - 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, - 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, - 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, - 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, - 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, - 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, - 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, - 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, - 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, - 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xff -}; - -static const size_t replacement_character[] = { - 65533, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 8364, 129, 8218, 402, 8222, 8230, 8224, - 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, - 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, - 8482, 353, 8250, 339, 157, 382, 376 -}; - -static const size_t myhtml_string_alphanumeric_character[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, - 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -static const unsigned char myhtml_tokenizer_chars_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char myhtml_string_hex_to_char_map[] = { - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00 -}; - -#endif /* MyHTML_UTILS_RESOURCES_H */ diff --git a/include/myunicode/myosi.h b/include/myunicode/myosi.h new file mode 100644 index 0000000..e411130 --- /dev/null +++ b/include/myunicode/myosi.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyUNICODE_MYOSI_H +#define MyUNICODE_MYOSI_H +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyUNICODE_MYOSI_H */ diff --git a/include/myurl/host.h b/include/myurl/host.h new file mode 100644 index 0000000..96d64b6 --- /dev/null +++ b/include/myurl/host.h @@ -0,0 +1,105 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_HOST_H +#define MyURL_HOST_H +#pragma once + +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum myurl_host_type { + MyURL_HOST_TYPE_UNDEF = 0x00, + MyURL_HOST_TYPE_DOMAIN = 0x01, + MyURL_HOST_TYPE_IPv4 = 0x02, + MyURL_HOST_TYPE_IPv6 = 0x03, + MyURL_HOST_TYPE_OPAQUE = 0x04, +} +typedef myurl_host_type_t; + +enum myurl_host_ipv_type { + MyURL_HOST_TYPE_IP_UNDEF = 0x00, + MyURL_HOST_TYPE_IP_v4 = 0x01, + MyURL_HOST_TYPE_IP_v6 = 0x02, +} +typedef myurl_host_ipv_type_t; + +enum myurl_host_idna_processing_option { + MyURL_HOST_IDNA_PROCESSING_OPTION_UNDEF = 0x00, + MyURL_HOST_IDNA_PROCESSING_OPTION_TRANSITIONAL = 0x01, + MyURL_HOST_IDNA_PROCESSING_OPTION_NONTRANSITIONAL = 0x02, +} +typedef myurl_host_idna_processing_option_t; + +struct myurl_host_ipv { + unsigned int pieces[9]; + myurl_host_ipv_type_t type; +} +typedef myurl_host_ipv_t; + +struct myurl_host_opaque { + char* value; + size_t length; +} +typedef myurl_host_opaque_t; + +struct myurl_host_domain { + char* value; + size_t length; +} +typedef myurl_host_domain_t; + +struct myurl_host { + union { + myurl_host_ipv_t ipv; + myurl_host_opaque_t opaque; + myurl_host_domain_t domain; + } value; + + myurl_host_type_t type; +} +typedef myurl_host_t; + +myurl_host_t * myurl_host_create(myurl_t* url); +mystatus_t myurl_host_init(myurl_t* url); +void myurl_host_clean(myurl_t* url, myurl_host_t* host); + +myurl_host_t * myurl_host_destroy(myurl_t* url, myurl_host_t* host, bool destroy_self); +mystatus_t myurl_host_copy(myurl_t* url, myurl_host_t* host_from, myurl_host_t* host_to); + +mystatus_t myurl_host_parser(myurl_t* url, myurl_host_t* host, const char* data, size_t data_size, bool is_special); +mystatus_t myurl_host_ipv4_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size, bool* failure); +mystatus_t myurl_host_ipv6_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size); +mystatus_t myurl_host_ipv6_ipv4_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size, unsigned int** piece_pointer); +mystatus_t myurl_host_opaque_host_parser(myurl_t* url, myurl_host_opaque_t* opaque, const char* data, size_t data_size); +mystatus_t myurl_host_domain_to_ascii(myurl_t* url, char** return_domain, size_t* return_domain_size, char* domain, size_t domain_size, bool UseSTD3ASCIIRules, bool VerifyDnsLength, myurl_host_idna_processing_option_t opt); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_HOST_H */ diff --git a/include/myurl/myosi.h b/include/myurl/myosi.h new file mode 100644 index 0000000..dcd3934 --- /dev/null +++ b/include/myurl/myosi.h @@ -0,0 +1,83 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_MYOSI_H +#define MyURL_MYOSI_H +#pragma once + +#include + +#define MyURL_VERSION_MAJOR 0 +#define MyURL_VERSION_MINOR 1 +#define MyURL_VERSION_PATCH 0 + +#define MyURL_VERSION_STRING MyCORE_STR(MyURL_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyURL_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyURL_VERSION_PATCH) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct myhtml_url myurl_t; +typedef struct myurl_entry myurl_entry_t; + +typedef size_t (*myurl_state_f)(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +typedef void (*myurl_callback_serialization_func_f)(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); + +typedef void * (*myurl_callback_malloc_f)(size_t size, void *ctx); +typedef void * (*myurl_callback_realloc_f)(void* value, size_t size, void *ctx); +typedef void * (*myurl_callback_free_f)(void* value, void *ctx); + +enum myurl_flags { + MyURL_FLAGS_UNDEF = 0x00, + MyURL_FLAGS_AT = 0x01, + MyURL_FLAGS_BRACKET = 0x02, + MyURL_FLAGS_CANNOT_BE_BASE_URL = 0x04 +} +typedef myurl_flags_t; + +/* + See all senments of statuses in modest/myosi.h + for myurl 038888..0388ff; MyURL_STATUS_OK == 0x000000 +*/ +enum myurl_status { + MyURL_STATUS_OK = 0x000000, + MyURL_STATUS_ERROR = 0x038888, + MyURL_STATUS_ERROR_MEMORY_ALLOCATION = 0x038889, + MyURL_STATUS_FAILURE_SCHEME_START = 0x03888a, + MyURL_STATUS_FAILURE_SCHEME_STATE = 0x03888b, + MyURL_STATUS_FAILURE_NO_SCHEME_BASE_NULL_OR_NOT_HASH = 0x03888c, + MyURL_STATUS_FAILURE_AUTHORITY_HOST_AFTER_AUTH = 0x03888d, + MyURL_STATUS_FAILURE_UNEXPECTED_ENDING = 0x03888e, + MyURL_STATUS_FAILURE_BAD_HOSTNAME = 0x03888f, + MyURL_STATUS_FAILURE_BAD_PORT = 0x038890, + MyURL_STATUS_LAST_SEGMENT_ENTRY = 0x0388ff +} +typedef myurl_status_t; + +void * myurl_callback_malloc(size_t size, void* ctx); +void * myurl_callback_realloc(void* value, size_t size, void* ctx); +void * myurl_callback_free(void* value, void* ctx); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_MYOSI_H */ diff --git a/include/myurl/parser.h b/include/myurl/parser.h new file mode 100644 index 0000000..2e0b52b --- /dev/null +++ b/include/myurl/parser.h @@ -0,0 +1,103 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_PARSER_H +#define MyURL_PARSER_H +#pragma once + +#include +#include + +#define myurl_parser_digit(onechar) (onechar >= 0x30 && onechar <= 0x39) +#define myurl_parser_alpha_upper(onechar) (onechar >= 0x41 && onechar <= 0x5A) +#define myurl_parser_alpha_lower(onechar) (onechar >= 0x61 && onechar <= 0x7A) +#define myurl_parser_alpha(onechar) (myurl_parser_alpha_upper(onechar) || myurl_parser_alpha_lower(onechar)) + +#define myurl_parser_alphanumeric(onechar) (myurl_parser_digit(onechar) || myurl_parser_alpha(onechar)) + +#define myurl_parser_swap_path(url, base) \ + if(url->path) \ + myurl_utils_data_list_destroy(url->path, true); \ + url->path = base->path + +#define myurl_parser_copy_scheme(parser, to, from) \ + to->scheme.scheme = from->scheme.scheme; \ + myurl_utils_data_copy(parser, &to->scheme.origin, &from->scheme.origin) + +#define myurl_parser_copy_path(parser, to, from) \ + myurl_utils_data_list_copy(parser, to->path, from->path) + +#define myurl_parser_copy_attr(url, from, to, attr) \ + myurl_utils_data_copy_set(url, from->attr, from->attr ## _length, &to->attr, &to->attr ## _length) + +#define myurl_parser_copy_buffer(url, data, data_length, to) \ + myurl_utils_data_copy_set(url, &data[ url->begin ], (data_length - url->begin), &to, &to ## _length) + +#define myurl_parser_append_buffer(url, data, begin, data_length, to) \ + myurl_utils_data_copy_append(url, &data[ begin ], (data_length - begin), &to, &to ## _length) + +#define myurl_parser_is_includes_credentials(url_entry) (url_entry->username_length || url_entry->password_length) + +#ifdef __cplusplus +extern "C" { +#endif + +size_t myurl_parser_begin(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_size); + +size_t myurl_parser_state_undef(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_scheme_start(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_scheme(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_no_scheme(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_special_relative_or_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_or_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_relative(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_relative_slash(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_special_authority_slashes(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_special_authority_ignore_slashes(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_host_hostname(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_port(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_slash(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_host(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_start(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_cannot_be_a_base_URL_path(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_query(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_fragment(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); + +/* ends */ +size_t myurl_parser_state_relative_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_authority_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_host_hostname_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_port_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_host_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_start_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_cannot_be_a_base_URL_path_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_query_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_PARSER_H */ diff --git a/include/myurl/path.h b/include/myurl/path.h new file mode 100644 index 0000000..e18abf3 --- /dev/null +++ b/include/myurl/path.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include +#include +#include + +#ifndef MyURL_PATH_H +#define MyURL_PATH_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +struct myurl_path_entry { + char* data; + size_t length; +} +typedef myurl_path_entry_t; + +struct myurl_path_t { + myurl_path_entry_t* list; + size_t length; + size_t size; +} +typedef myurl_path_t; + +myurl_path_t * myurl_path_create(myurl_t* url); +mystatus_t myurl_path_init(myurl_t* url, myurl_path_t* path, size_t begin_size); +void myurl_path_clean(myurl_t* url, myurl_path_t* path); +myurl_path_t * myurl_path_destroy(myurl_t* url, myurl_path_t* path, bool destroy_self); + +myurl_path_entry_t * myurl_path_append(myurl_t* url, myurl_path_t* path, const char* data, size_t length); +myurl_path_entry_t * myurl_path_push(myurl_t* url, myurl_path_t* path, char* data, size_t length); +myurl_path_entry_t * myurl_path_push_to_index(myurl_t* url, myurl_path_t* path, size_t index, char* data, size_t length); +myurl_path_entry_t * myurl_path_current(myurl_path_t* path); +myurl_path_entry_t * myurl_path_pop(myurl_path_t* path); +mystatus_t myurl_path_copy(myurl_t* url, myurl_path_t* path_from, myurl_path_t* path_to); + +void myurl_path_remove_by_index(myurl_t* url, myurl_path_t* path, size_t index); + +void myurl_path_shorten(myurl_path_t* path, myurl_scheme_id_t scheme_id); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_PATH_H */ diff --git a/include/myurl/punycode.h b/include/myurl/punycode.h new file mode 100644 index 0000000..3c3a313 --- /dev/null +++ b/include/myurl/punycode.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_PUNYCODE_H +#define MyURL_PUNYCODE_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum myurl_punycode_const { + MyURL_PUNYCODE_CONST_BASE = 36, + MyURL_PUNYCODE_CONST_TMIN = 1, + MyURL_PUNYCODE_CONST_TMAX = 26, + MyURL_PUNYCODE_CONST_SKEW = 38, + MyURL_PUNYCODE_CONST_DAMP = 700, + MyURL_PUNYCODE_CONST_INITIAL_BIAS = 72, + MyURL_PUNYCODE_CONST_INITIAL_N = 0x80, + MyURL_PUNYCODE_CONST_DELIMITER = 0x2D +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_PUNYCODE_H */ diff --git a/include/myurl/resources.h b/include/myurl/resources.h new file mode 100644 index 0000000..ea71527 --- /dev/null +++ b/include/myurl/resources.h @@ -0,0 +1,180 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_RESOURCES_H +#define MyURL_RESOURCES_H +#pragma once + +static const unsigned char myurl_resources_static_map_query_charset[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x00, 0x3d, 0x00, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char myurl_resources_static_map_forbidden_host_code_point[] = +{ + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xff, 0x22, 0x23, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0x3e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +/* A C0 control is a code point in the range U+0000 to U+001F, inclusive. The C0 control percent-encode set are C0 controls and all code points greater than U+007E. */ +static const unsigned char myurl_resources_static_map_C0[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* The path percent-encode set is the myurl_resources_static_map_path and code points U+0020, '"', "#", "<", ">", "?", "`", "{", and "}". */ +static const unsigned char myurl_resources_static_map_path[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x00, 0x3d, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x00, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x00, 0x7c, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* The userinfo percent-encode set is the myurl_resources_static_map_path and code points "/", ":", ";", "=", "@", "[", "\", "]", "^", and "|". */ +static const unsigned char myurl_resources_static_map_userinfo[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x00, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const char *myurl_resources_static_map_digits = "0123456789abcdefghijklmnopqrstuvwxyz"; + +#endif /* MyURL_RESOURCES_H */ diff --git a/include/myurl/scheme.h b/include/myurl/scheme.h new file mode 100644 index 0000000..f315372 --- /dev/null +++ b/include/myurl/scheme.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SCHEME_H +#define MyURL_SCHEME_H +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum myurl_scheme_type { + MyURL_SCHEME_TYPE_UNDEF = 0x00, + MyURL_SCHEME_TYPE_SPECIAL = 0x01, + MyURL_SCHEME_TYPE_LOCAL = 0x02, + MyURL_SCHEME_TYPE_HTTP_S = 0x04, + MyURL_SCHEME_TYPE_NETWORK = 0x08, + MyURL_SCHEME_TYPE_FETCH = 0x10 +} +typedef myurl_scheme_type_t; + +struct myurl_scheme { + char* name; + size_t length; + size_t port; + + myurl_scheme_id_t sid; + myurl_scheme_type_t type; +} +typedef myurl_scheme_t; + +struct myurl_scheme_entry { + const char* name; + size_t name_length; + + myurl_scheme_id_t m_id; + size_t port; + myurl_scheme_type_t type; + + size_t next; + size_t curr; +} +typedef myurl_scheme_entry_t; + +void myurl_scheme_clean(myurl_t* url, myurl_scheme_t* scheme); +myurl_scheme_t * myurl_scheme_destroy(myurl_t* url, myurl_scheme_t* scheme, bool self_destroy); + +const myurl_scheme_entry_t * myurl_scheme_find_entry(const char* name, size_t length); +myurl_scheme_id_t myurl_scheme_id_by_name(const char *name, size_t length); + +mystatus_t myurl_scheme_copy(myurl_t* url, myurl_scheme_t* from, myurl_scheme_t* to); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_SCHEME_H */ diff --git a/include/myurl/scheme_const.h b/include/myurl/scheme_const.h new file mode 100644 index 0000000..508c1a5 --- /dev/null +++ b/include/myurl/scheme_const.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SCHEME_CONST_H +#define MyURL_SCHEME_CONST_H +#pragma once + +enum myurl_scheme_id { + MyURL_SCHEME_ID_UNDEF = 0x0000, + MyURL_SCHEME_ID_ABOUT = 0x0001, + MyURL_SCHEME_ID_BLOB = 0x0002, + MyURL_SCHEME_ID_DATA = 0x0003, + MyURL_SCHEME_ID_FILE = 0x0004, + MyURL_SCHEME_ID_FILESYSTEM = 0x0005, + MyURL_SCHEME_ID_FTP = 0x0006, + MyURL_SCHEME_ID_GOPHER = 0x0007, + MyURL_SCHEME_ID_HTTP = 0x0008, + MyURL_SCHEME_ID_HTTPS = 0x0009, + MyURL_SCHEME_ID_WS = 0x000a, + MyURL_SCHEME_ID_WSS = 0x000b, + MyURL_SCHEME_ID_LAST_ENTRY = 0x000c +} +typedef myurl_scheme_id_t; + + +#endif /* MyURL_SCHEME_CONST_H */ diff --git a/include/myurl/scheme_resources.h b/include/myurl/scheme_resources.h new file mode 100644 index 0000000..d408479 --- /dev/null +++ b/include/myurl/scheme_resources.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SCHEME_RESOURCES_H +#define MyURL_SCHEME_RESOURCES_H +#pragma once + +#define MyURL_SCHEME_STATIC_INDEX_LENGTH 31 + +static const myurl_scheme_entry_t myurl_scheme_entry_static_index[] = +{ + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"https", 5, MyURL_SCHEME_ID_HTTPS, 443, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_HTTP_S, 0, 2}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"blob", 4, MyURL_SCHEME_ID_BLOB, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 8}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"file", 4, MyURL_SCHEME_ID_FILE, 0, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_FETCH, 0, 10}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"wss", 3, MyURL_SCHEME_ID_WSS, 443, MyURL_SCHEME_TYPE_SPECIAL, 0, 12}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"filesystem", 10, MyURL_SCHEME_ID_FILESYSTEM, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 15}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"ftp", 3, MyURL_SCHEME_ID_FTP, 21, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_NETWORK, 0, 18}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"data", 4, MyURL_SCHEME_ID_DATA, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 20}, + {"gopher", 6, MyURL_SCHEME_ID_GOPHER, 70, MyURL_SCHEME_TYPE_SPECIAL, 0, 21}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"about", 5, MyURL_SCHEME_ID_ABOUT, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 27}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"ws", 2, MyURL_SCHEME_ID_WS, 80, MyURL_SCHEME_TYPE_SPECIAL, 0, 29}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"http", 4, MyURL_SCHEME_ID_HTTP, 80, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_HTTP_S, 0, 31}, +}; + + +#endif /* MyURL_SCHEME_RESOURCES_H */ diff --git a/include/myurl/serialization.h b/include/myurl/serialization.h new file mode 100644 index 0000000..fd70d7a --- /dev/null +++ b/include/myurl/serialization.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SERIALIZATION_H +#define MyURL_SERIALIZATION_H +#pragma once + +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void myurl_serialization_authority(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_host(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_auth_host_port(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_path(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_with_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_without_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization(myurl_entry_t* url_entry, bool exclude_fragment_flag, mycore_callback_serialize_f callback, void* ctx); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_SERIALIZATION_H */ diff --git a/include/myurl/url.h b/include/myurl/url.h new file mode 100644 index 0000000..3a194ae --- /dev/null +++ b/include/myurl/url.h @@ -0,0 +1,195 @@ +/* + Copyright (C) 2016-2107 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_H +#define MyURL_H +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct myurl_entry { + myurl_scheme_t scheme; + myurl_host_t host; + myurl_path_t path; + + char* username; + size_t username_length; + + char* password; + size_t password_length; + + unsigned int port; + bool port_is_set; + + char* query; + size_t query_length; + + char* fragment; + size_t fragment_length; + + myurl_flags_t flags; + mystatus_t status; + + myurl_t* url_ref; +}; + +struct myhtml_url { + /* parser */ + myurl_state_f state; + myurl_state_f state_override; + myencoding_t encoding; + + /* memory */ + myurl_callback_malloc_f callback_malloc; + myurl_callback_realloc_f callback_realloc; + myurl_callback_free_f callback_free; + void* callback_ctx; + + /* work variables */ + size_t begin; + /* if URL include '\t' or '\n', + then buffer copied removing all '\t' and '\n' */ + char *copy; +}; + +myurl_t * myurl_create(void); +mystatus_t myurl_init(myurl_t* url); +void myurl_clean(myurl_t* url); +myurl_t * myurl_destroy(myurl_t* url, bool self_destroy); + +myurl_entry_t * myurl_parse(myurl_t* url, const char* data_url, size_t data_url_size, myurl_entry_t* base_url, mystatus_t* status); + +myurl_entry_t * myurl_entry_create_and_init(myurl_t* url); +void myurl_entry_clean(myurl_entry_t* url_entry); +myurl_entry_t * myurl_entry_destroy(myurl_entry_t* url_entry, bool self_destroy); + +/* api */ +/* callback */ +void myurl_callback_memory_set(myurl_t* url, myurl_callback_malloc_f callback_malloc, myurl_callback_realloc_f callback_realloc, myurl_callback_free_f callback_free, void* ctx); +void * myurl_callback_memory_context(myurl_t* url); + +/* api entry */ +/* for read */ +mystatus_t myurl_entry_status(myurl_entry_t* url_entry); +myurl_flags_t myurl_entry_flags(myurl_entry_t* url_entry); +myurl_t * myurl_entry_url(myurl_entry_t* url_entry); + +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_as_string(myurl_entry_t* url_entry, size_t *length); + +/* scheme */ +myurl_scheme_t * myurl_entry_scheme(myurl_entry_t* url_entry); +const char * myurl_entry_scheme_name(myurl_entry_t* url_entry, size_t* length); +unsigned int myurl_entry_scheme_port(myurl_entry_t* url_entry); +myurl_scheme_id_t myurl_entry_scheme_id(myurl_entry_t* url_entry); +myurl_scheme_type_t myurl_entry_scheme_type(myurl_entry_t* url_entry); + +/* authority */ +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_authority_as_string(myurl_entry_t* url_entry, size_t* length); + +const char * myurl_entry_username(myurl_entry_t* url_entry, size_t* length); +const char * myurl_entry_password(myurl_entry_t* url_entry, size_t* length); + +/* host */ +myurl_host_t * myurl_entry_host(myurl_entry_t* url_entry); + +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_host_as_string(myurl_entry_t* url_entry, size_t *length); + +myurl_host_type_t myurl_entry_host_type(myurl_entry_t* url_entry); +const char * myurl_entry_host_domain(myurl_entry_t* url_entry, size_t* length); +const char * myurl_entry_host_opaque(myurl_entry_t* url_entry, size_t* length); +unsigned int myurl_entry_host_ipv4(myurl_entry_t* url_entry); +unsigned int * myurl_entry_host_ipv6(myurl_entry_t* url_entry); + +/* port */ +bool myurl_entry_port_is_defined(myurl_entry_t* url_entry); +unsigned int myurl_entry_port(myurl_entry_t* url_entry); + +/* path */ +myurl_path_t * myurl_entry_path(myurl_entry_t* url_entry); + +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_path_as_string(myurl_entry_t* url_entry, size_t* length); + +size_t myurl_entry_path_length(myurl_entry_t* url_entry); +const char * myurl_entry_path_entry(myurl_entry_t* url_entry, size_t index, size_t* length); + +/* query */ +const char * myurl_entry_query(myurl_entry_t* url_entry, size_t* length); + +/* fragment */ +const char * myurl_entry_fragment(myurl_entry_t* url_entry, size_t* length); + +/* + For changes +*/ +/* scheme */ +const char * myurl_entry_scheme_name_set(myurl_entry_t* url_entry, const char* name, size_t length); +void myurl_entry_scheme_port_set(myurl_entry_t* url_entry, unsigned int port); +void myurl_entry_scheme_id_set(myurl_entry_t* url_entry, myurl_scheme_id_t sid); +void myurl_entry_scheme_type_set(myurl_entry_t* url_entry, myurl_scheme_type_t type); +void myurl_entry_scheme_clean(myurl_entry_t* url_entry); + +/* authority */ +const char * myurl_entry_username_set(myurl_entry_t* url_entry, const char* username, size_t length); +const char * myurl_entry_password_set(myurl_entry_t* url_entry, const char* password, size_t length); + +/* host */ +mystatus_t myurl_entry_host_set(myurl_entry_t* url_entry, const char* host, size_t length); + +/* port */ +void myurl_entry_port_set(myurl_entry_t* url_entry, unsigned int port); + +/* path */ +mystatus_t myurl_entry_path_set(myurl_entry_t* url_entry, const char* path, size_t length); +mystatus_t myurl_entry_path_append_entry(myurl_entry_t* url_entry, const char* entry, size_t length); +void myurl_entry_path_pop_entry(myurl_entry_t* url_entry); +mystatus_t myurl_entry_path_replace_entry(myurl_entry_t* url_entry, size_t index, const char* entry, size_t length); +void myurl_entry_path_remove_entry(myurl_entry_t* url_entry, size_t index); +void myurl_entry_path_clean(myurl_entry_t* url_entry); + +/* query */ +const char * myurl_entry_query_set(myurl_entry_t* url_entry, const char* query, size_t length); + +/* fragment */ +const char * myurl_entry_fragment_set(myurl_entry_t* url_entry, const char* fragment, size_t length); + +/* for free resources for char* */ +void myurl_entry_free_string(myurl_entry_t* url_entry, char* string); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_H */ + + diff --git a/include/myurl/utils.h b/include/myurl/utils.h new file mode 100644 index 0000000..6e244c5 --- /dev/null +++ b/include/myurl/utils.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_UTILS_H +#define MyURL_UTILS_H +#pragma once + +typedef struct myurl_utils_data_list myurl_utils_data_list_t; + +#include +#include +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct myurl_utils_serialization_ctx { + char* data; + size_t size; + size_t length; + + myurl_t* url; + bool error; +} +typedef myurl_utils_serialization_ctx_t; + +char * myurl_utils_data_copy(myurl_t* url, const char* data, size_t size); +mystatus_t myurl_utils_data_copy_set(myurl_t* url, const char* data, size_t size, char** to, size_t* to_length); +mystatus_t myurl_utils_data_copy_append(myurl_t* url, const char* data, size_t size, char** to, size_t* to_length); +void myurl_utils_data_set_null(myurl_t* url, char** to, size_t* length); +void myurl_utils_data_set_empty(myurl_t* url, char** to, size_t* length); +char * myurl_utils_percent_encode(myurl_t* url, const char* data, size_t size, const unsigned char* encode_set, size_t* return_length); +size_t myurl_utils_percent_decode_bytes_in_data(char* data, size_t size); + +bool myurl_utils_is_windows_drive_letter(const char* data, size_t length, size_t size); +bool myurl_utils_is_double_dot_path_segment(const char* data, size_t length); +bool myurl_utils_is_single_dot_path_segment(const char* data, size_t length); + +size_t myurl_convert_integer_to_data_without_check_buffer(long digit, char* return_str); +size_t myurl_convert_integer_to_hex_data_without_check_buffer(long digit, char* return_str); + +//void myurl_utils_data_set(myurl_parser_t* parser, myurl_parser_data_t* parse_data, const unsigned char* data, size_t length); +//void myurl_utils_data_append(myurl_parser_t* parser, myurl_parser_data_t* parse_data, const unsigned char* data, size_t length); +//void myurl_utils_data_copy(myurl_parser_t* parser, myurl_parser_data_t* to, const myurl_parser_data_t* from); +//void myurl_utils_data_destroy(myurl_parser_t* parser, myurl_parser_data_t* parse_data, bool self_destroy); + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_UTILS_H */ diff --git a/modest.pc.in b/modest.pc.in new file mode 100644 index 0000000..85b0276 --- /dev/null +++ b/modest.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +includedir=${prefix}/@includedir@ +libdir=${prefix}/@libdir@ + +Name: @libname@ +Description: @description@ +Version: @version@ +Cflags: @cflags@ +Libs: -L${libdir} -l@libname@ diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt deleted file mode 100644 index e9add12..0000000 --- a/projects/CMakeLists.txt +++ /dev/null @@ -1,205 +0,0 @@ -cmake_minimum_required( VERSION 2.8.8 ) - -################ -## version and path -######################### -set(MODEST_PROJECT_NAME "modest") -set(MODEST_PROJECT_DIR_ROOT "..") -set(MODEST_PROJECT_DIR_LIB "${MODEST_PROJECT_DIR_ROOT}/lib") -set(MODEST_PROJECT_API_HEADER "${MODEST_PROJECT_DIR_ROOT}/include/") -set(MODEST_PROJECT_SOURCE "${MODEST_PROJECT_DIR_ROOT}/source") - -set(MODEST_VERSION_MAJOR 0) -set(MODEST_VERSION_MINOR 0) -set(MODEST_VERSION_PATCH 5) -set(MODEST_VERSION_STRING "${MODEST_VERSION_MAJOR}.${MODEST_VERSION_MINOR}.${MODEST_VERSION_PATCH}") - -project(${MODEST_PROJECT_NAME}) - -################ -## Detect OS -######################### -set(MODEST_PLATFORM "UNDEF") - -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - if(EXISTS "/etc/debian_version") - set(MODEST_PLATFORM "Debian") - endif(EXISTS "/etc/debian_version") - - if(EXISTS "/etc/redhat-release") - set(MODEST_PLATFORM "Redhat") - endif(EXISTS "/etc/redhat-release") - - if(EXISTS "/etc/fedora-release") - set(MODEST_PLATFORM "Redhat") - endif(EXISTS "/etc/fedora-release") - - if(EXISTS "/etc/SuSE-release") - set(MODEST_PLATFORM "SuSe") - endif(EXISTS "/etc/SuSE-release") - - if(EXISTS "/etc/gentoo-release") - set(MODEST_PLATFORM "Gentoo") - endif(EXISTS "/etc/gentoo-release") -endif() - -################ -## lib param -######################### -if(POLICY CMP0042) - cmake_policy(SET CMP0042 OLD) -endif() - -set(MODEST_PROJECT_LIB_NAME "${MODEST_PROJECT_NAME}") -set(MODEST_PROJECT_LIB_NAME_STATIC "${MODEST_PROJECT_NAME}_static") - -if(NOT DEFINED CMAKE_INSTALL_LIBDIR) - set(CMAKE_INSTALL_LIBDIR "lib") -endif() - -if(NOT DEFINED MODEST_OPTIMIZATION_LEVEL) - set(MODEST_OPTIMIZATION_LEVEL "-O2") -endif() - -if(NOT DEFINED MODEST_BUILD_WITHOUT_THREADS) - set(MODEST_BUILD_WITHOUT_THREADS "NO") -endif() - -################ -## extern mem functions -######################### -if(DEFINED MODEST_EXTERN_MALLOC) - add_definitions(-DMODEST_EXTERN_MALLOC=${MODEST_EXTERN_MALLOC}) - add_definitions(-DMyHTML_EXTERN_MALLOC=${MODEST_EXTERN_MALLOC}) -endif() - -if(DEFINED MODEST_EXTERN_REALLOC) - add_definitions(-DMODEST_EXTERN_REALLOC=${MODEST_EXTERN_REALLOC}) - add_definitions(-DMyHTML_EXTERN_REALLOC=${MODEST_EXTERN_REALLOC}) -endif() - -if(DEFINED MODEST_EXTERN_CALLOC) - add_definitions(-DMODEST_EXTERN_CALLOC=${MODEST_EXTERN_CALLOC}) - add_definitions(-DMyHTML_EXTERN_CALLOC=${MODEST_EXTERN_CALLOC}) -endif() - -if(DEFINED MODEST_EXTERN_FREE) - add_definitions(-DMODEST_EXTERN_FREE=${MODEST_EXTERN_FREE}) - add_definitions(-DMyHTML_EXTERN_FREE=${MODEST_EXTERN_FREE}) -endif() - -################ -## ARGS -######################### -set(INSTALL_DLL_EXE_DIR "bin") - -option(MODEST_BUILD_SHARED "Build shared library" ON) -option(MODEST_BUILD_STATIC "Build static library" ON) -option(MODEST_INSTALL_HEADER "Install header files" OFF) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MODEST_OPTIMIZATION_LEVEL}") - -include_directories(${MODEST_PROJECT_SOURCE}) -FILE(GLOB_RECURSE ALL_SOURCE_LIST "${MODEST_PROJECT_SOURCE}/*.c") - -if (!UNIX AND WIN32) - if(${CMAKE_CL_64}) - add_definitions(-D_WIN64) - else() - add_definitions(-D_WIN32) - endif() -endif() - -if(${CMAKE_C_COMPILER_ID} STREQUAL MSVC) - add_definitions(/wd4100 /wd4255 /wd4820 /wd4668) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - - message(STATUS "Windows set definitions") -else() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall --std=c99 -fPIC") - - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - add_definitions(-D_POSIX_C_SOURCE=199309L) - endif() - - if(MODEST_BUILD_WITHOUT_THREADS STREQUAL "NO") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") - endif() -endif() - -if(MODEST_BUILD_WITHOUT_THREADS STREQUAL "YES") - message(STATUS "Build without POSIX Threads") - add_definitions(-DMODEST_BUILD_WITHOUT_THREADS) - add_definitions(-DMyHTML_BUILD_WITHOUT_THREADS) -else() - message(STATUS "Build with POSIX Threads") -endif() - -################ -## build -######################### -if(MODEST_BUILD_SHARED) - add_library(${MODEST_PROJECT_NAME} SHARED ${ALL_SOURCE_LIST}) - set_target_properties(${MODEST_PROJECT_NAME} PROPERTIES OUTPUT_NAME ${MODEST_PROJECT_NAME}) - set_target_properties(${MODEST_PROJECT_NAME} PROPERTIES VERSION ${MODEST_VERSION_STRING} SOVERSION ${MODEST_VERSION_MAJOR}) -endif() - -if(MODEST_BUILD_STATIC) - add_library(${MODEST_PROJECT_LIB_NAME_STATIC} STATIC ${ALL_SOURCE_LIST}) - set_target_properties(${MODEST_PROJECT_LIB_NAME_STATIC} PROPERTIES OUTPUT_NAME ${MODEST_PROJECT_LIB_NAME_STATIC}) - set_target_properties(${MODEST_PROJECT_LIB_NAME_STATIC} PROPERTIES VERSION ${MODEST_VERSION_STRING} SOVERSION ${MODEST_VERSION_MAJOR}) -endif() - -################ -## install -######################### -if(MODEST_INSTALL_HEADER) - install(DIRECTORY "${MODEST_PROJECT_API_HEADER}" DESTINATION "include" FILES_MATCHING PATTERN "*.h") -endif() - -if(MODEST_BUILD_SHARED) - install(TARGETS ${MODEST_PROJECT_LIB_NAME} - RUNTIME DESTINATION "${INSTALL_DLL_EXE_DIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") -endif() - -if(MODEST_BUILD_STATIC) - install(TARGETS ${MODEST_PROJECT_LIB_NAME_STATIC} - RUNTIME DESTINATION "${INSTALL_DLL_EXE_DIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") -endif() - -################ -## Build an RPM. -######################### -set(CPACK_PACKAGE_VERSION ${MODEST_VERSION_STRING}) - -if(MODEST_PLATFORM STREQUAL "Debian") - set(CPACK_GENERATOR "DEB") -elseif(MODEST_PLATFORM STREQUAL "Redhat") - set(CPACK_GENERATOR "RPM") -elseif(MODEST_PLATFORM STREQUAL "SuSe") - set(CPACK_GENERATOR "RPM") -else() - set(CPACK_GENERATOR "TGZ") -endif() - -set(CPACK_PACKAGE_NAME "modest") -set(CPACK_PACKAGE_RELEASE 1) -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Modest is a fast HTML Render implemented as a pure C99 library with no outside dependencies.") -set(CPACK_PACKAGE_CONTACT "Alexander Borisov") -set(CPACK_PACKAGE_VENDOR "Alexander Borisov") - -if(32BIT) - set(CPACK_RPM_PACKAGE_ARCHITECTURE i686) -else() - set(CPACK_RPM_PACKAGE_ARCHITECTURE x86_64) -endif() - -if(MODEST_BUILD_WITHOUT_THREADS STREQUAL "YES") - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}-without-threads.${CPACK_RPM_PACKAGE_ARCHITECTURE}") -else() - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_PACKAGE_RELEASE}.${CPACK_RPM_PACKAGE_ARCHITECTURE}") -endif() - -include(CPack) diff --git a/source/modest/Makefile.mk b/source/modest/Makefile.mk index 812bf35..0ab2e7f 100644 --- a/source/modest/Makefile.mk +++ b/source/modest/Makefile.mk @@ -1,14 +1,13 @@ -find_files_h = $(wildcard $(SRCDIR)/modest/$(dir)/*.h) -find_files_c = $(wildcard $(SRCDIR)/modest/$(dir)/*.c) +modest_dirs := . finder style node layer render utils +modest_objs := $(call MODEST_UTILS_OBJS,modest,$(modest_dirs)) -SUBDIRS := . finder style node layer render utils -HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) -SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) +modest_description := calculating, compare, renderer +modest_dependencies := mycore mycss myencoding myfont myhtml myport myunicode myurl -modest_clone: MODEST_DIR_$(SUBDIRS) - mkdir -p $(INCLUDE_TMP)/modest - cp $(SRCDIR)/modest/*.h $(INCLUDE_TMP)/modest +modest_all: $(modest_objs) -MODEST_DIR_$(SUBDIRS): - mkdir -p $(INCLUDE_TMP)/modest/$(patsubst MODEST_DIR_%,%,$@) - cp $(SRCDIR)/modest/$(patsubst MODEST_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/modest/$(patsubst MODEST_DIR_%,%,$@)/ +modest_clean: + rm -f $(modest_objs) + +modest_clone: + $(call MODEST_UTILS_HDRS_CLONE,modest,$(modest_dirs)) diff --git a/source/modest/declaration.c b/source/modest/declaration.c index 158dded..7e3d298 100644 --- a/source/modest/declaration.c +++ b/source/modest/declaration.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/declaration.h b/source/modest/declaration.h index ab43889..f1688d6 100644 --- a/source/modest/declaration.h +++ b/source/modest/declaration.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/finder/finder.c b/source/modest/finder/finder.c index 57b7e7b..bf52435 100644 --- a/source/modest/finder/finder.c +++ b/source/modest/finder/finder.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,10 +23,10 @@ modest_finder_t * modest_finder_create(void) { - return (modest_finder_t*)myhtml_calloc(1, sizeof(modest_finder_t)); + return (modest_finder_t*)mycore_calloc(1, sizeof(modest_finder_t)); } -modest_status_t modest_finder_init(modest_finder_t* finder) +mystatus_t modest_finder_init(modest_finder_t* finder) { return MODEST_STATUS_OK; } @@ -42,7 +42,7 @@ modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destr return NULL; if(self_destroy) { - myhtml_free(finder); + mycore_free(finder); return NULL; } @@ -114,7 +114,7 @@ modest_finder_t * modest_finder_by_stylesheet(mycss_stylesheet_t *stylesheet, my if(finder == NULL) return NULL; - modest_status_t status = modest_finder_init(finder); + mystatus_t status = modest_finder_init(finder); if(status != MODEST_STATUS_OK) { modest_finder_destroy(finder, true); @@ -122,7 +122,7 @@ modest_finder_t * modest_finder_by_stylesheet(mycss_stylesheet_t *stylesheet, my } if(*collection == NULL) { - myhtml_status_t status; + mystatus_t status; *collection = myhtml_collection_create(4096, &status); if(status) { @@ -148,14 +148,14 @@ modest_finder_t * modest_finder_by_stylesheet(mycss_stylesheet_t *stylesheet, my return finder; } -modest_status_t modest_finder_by_selectors_list(modest_finder_t* finder, myhtml_tree_node_t* scope_node, +mystatus_t modest_finder_by_selectors_list(modest_finder_t* finder, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list, myhtml_collection_t** collection) { if(finder == NULL || selector_list == NULL || scope_node == NULL || collection == NULL) return MODEST_STATUS_ERROR; if(*collection == NULL) { - myhtml_status_t status; + mystatus_t status; *collection = myhtml_collection_create(4096, &status); if(status) diff --git a/source/modest/finder/finder.h b/source/modest/finder/finder.h index dd29d87..d3cdeff 100644 --- a/source/modest/finder/finder.h +++ b/source/modest/finder/finder.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -38,7 +38,7 @@ typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finde /* init */ modest_finder_t * modest_finder_create(void); -modest_status_t modest_finder_init(modest_finder_t* finder); +mystatus_t modest_finder_init(modest_finder_t* finder); void modest_finder_clean(modest_finder_t* finder); modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destroy); @@ -59,7 +59,7 @@ void modest_finder_specificity_inc(mycss_selectors_entry_t* selector, mycss_sele /* base api */ modest_finder_t * modest_finder_by_stylesheet(mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node); -modest_status_t modest_finder_by_selectors_list(modest_finder_t* finder, myhtml_tree_node_t* scope_node, +mystatus_t modest_finder_by_selectors_list(modest_finder_t* finder, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list, myhtml_collection_t** collection); /* process */ diff --git a/source/modest/finder/match.c b/source/modest/finder/match.c index 97d5f9d..e75c524 100644 --- a/source/modest/finder/match.c +++ b/source/modest/finder/match.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,7 +28,7 @@ bool modest_finder_match_attribute_only_key(myhtml_token_attr_t* attr, const cha while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) return true; } @@ -46,7 +46,7 @@ bool modest_finder_match_attribute_eq(myhtml_token_attr_t* attr, const char* key while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) { if(attr->value.length == value_len) { if(case_sensitive) { @@ -55,7 +55,7 @@ bool modest_finder_match_attribute_eq(myhtml_token_attr_t* attr, const char* key } } else { - if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) { + if(mycore_strncasecmp(value, attr->value.data, value_len) == 0) { return true; } } @@ -79,46 +79,37 @@ bool modest_finder_match_attribute_ws(myhtml_token_attr_t* attr, const char* key while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) { size_t i = 0; + size_t begin; if(attr->value.length >= value_len) { if(case_sensitive) { while(i < attr->value.length) { - size_t end = i + value_len; + begin = i; + while(i < attr->value.length && mycore_utils_whithspace(attr->value.data[i], !=, &&)) {i++;} - if(end > attr->value.length) - return false; - - if( - (myhtml_strncmp(value, &attr->value.data[i], value_len) == 0) && - (myhtml_utils_whithspace(attr->value.data[end], ==, ||) || end == attr->value.length)) - { + if((i - begin) == value_len && (mycore_strncmp(value, &attr->value.data[begin], value_len) == 0)) { return true; } - - i++; + /* skip all ws */ + while(i < attr->value.length && mycore_utils_whithspace(attr->value.data[i], ==, ||)) {i++;} } } else { while(i < attr->value.length) { - size_t end = i + value_len; + begin = i; + while(i < attr->value.length && mycore_utils_whithspace(attr->value.data[i], !=, &&)) {i++;} - if(end > attr->value.length) - return false; - - if( - (myhtml_strncasecmp(value, &attr->value.data[i], value_len) == 0) && - (myhtml_utils_whithspace(attr->value.data[end], ==, ||) || end == attr->value.length)) - { + if((i - begin) == value_len && (mycore_strncasecmp(value, &attr->value.data[begin], value_len) == 0)) { return true; } - - i++; + /* skip all ws */ + while(i < attr->value.length && mycore_utils_whithspace(attr->value.data[i], ==, ||)) {i++;} } } } @@ -141,15 +132,15 @@ bool modest_finder_match_attribute_begin(myhtml_token_attr_t* attr, const char* while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) { if(attr->value.length >= value_len) { if(case_sensitive) { - if(myhtml_strncmp(value, attr->value.data, value_len) == 0) + if(mycore_strncmp(value, attr->value.data, value_len) == 0) return true; } else { - if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) + if(mycore_strncasecmp(value, attr->value.data, value_len) == 0) return true; } } @@ -172,15 +163,15 @@ bool modest_finder_match_attribute_end(myhtml_token_attr_t* attr, const char* ke while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) { if(attr->value.length >= value_len) { if(case_sensitive) { - if(myhtml_strncmp(value, &attr->value.data[ (attr->value.length - value_len) ], value_len) == 0) + if(mycore_strncmp(value, &attr->value.data[ (attr->value.length - value_len) ], value_len) == 0) return true; } else { - if(myhtml_strncasecmp(value, &attr->value.data[ (attr->value.length - value_len) ], value_len) == 0) + if(mycore_strncasecmp(value, &attr->value.data[ (attr->value.length - value_len) ], value_len) == 0) return true; } } @@ -203,7 +194,7 @@ bool modest_finder_match_attribute_sub(myhtml_token_attr_t* attr, const char* ke while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) { if(attr->value.length >= value_len) { size_t i = 0; @@ -212,7 +203,7 @@ bool modest_finder_match_attribute_sub(myhtml_token_attr_t* attr, const char* ke { while ((i + value_len) <= attr->value.length) { - if(myhtml_strncmp(value, &attr->value.data[i], value_len) == 0) + if(mycore_strncmp(value, &attr->value.data[i], value_len) == 0) return true; i++; @@ -221,7 +212,7 @@ bool modest_finder_match_attribute_sub(myhtml_token_attr_t* attr, const char* ke else { while ((i + value_len) <= attr->value.length) { - if(myhtml_strncasecmp(value, &attr->value.data[i], value_len) == 0) + if(mycore_strncasecmp(value, &attr->value.data[i], value_len) == 0) return true; i++; @@ -247,27 +238,27 @@ bool modest_finder_match_attribute_hsp(myhtml_token_attr_t* attr, const char* ke while (attr) { if(attr->key.length == key_len) { - if(myhtml_strncasecmp(key, attr->key.data, key_len) == 0) + if(mycore_strncasecmp(key, attr->key.data, key_len) == 0) { if(attr->value.length == value_len) { if(case_sensitive) { - if(myhtml_strncmp(value, attr->value.data, value_len) == 0) + if(mycore_strncmp(value, attr->value.data, value_len) == 0) return true; } else { - if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) + if(mycore_strncasecmp(value, attr->value.data, value_len) == 0) return true; } } else if(attr->value.length > value_len) { if(case_sensitive) { - if(myhtml_strncmp(value, attr->value.data, value_len) == 0) { + if(mycore_strncmp(value, attr->value.data, value_len) == 0) { if(attr->value.data[value_len] == '-') return true; } } else { - if(myhtml_strncasecmp(value, attr->value.data, value_len) == 0) { + if(mycore_strncasecmp(value, attr->value.data, value_len) == 0) { if(attr->value.data[value_len] == '-') return true; } diff --git a/source/modest/finder/match.h b/source/modest/finder/match.h index adcf493..df76258 100644 --- a/source/modest/finder/match.h +++ b/source/modest/finder/match.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/finder/myosi.h b/source/modest/finder/myosi.h index eaf769d..97232da 100644 --- a/source/modest/finder/myosi.h +++ b/source/modest/finder/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/finder/pseudo_class.c b/source/modest/finder/pseudo_class.c index 807996e..f26ac69 100644 --- a/source/modest/finder/pseudo_class.c +++ b/source/modest/finder/pseudo_class.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -159,7 +159,7 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_child_check_selec bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) - return NULL; + return false; mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); @@ -226,7 +226,7 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_fin bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) - return NULL; + return false; mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); @@ -290,7 +290,7 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modes bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) - return NULL; + return false; mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); @@ -322,7 +322,7 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(mode bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) - return NULL; + return false; mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); @@ -420,15 +420,15 @@ bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finde while (attr) { if(attr->key.length == 4) { - if(myhtml_strncasecmp("type", attr->key.data, 4) == 0) + if(mycore_strncasecmp("type", attr->key.data, 4) == 0) { if(attr->value.length == 8) { - if(myhtml_strncasecmp("checkbox", attr->value.data, 8) == 0) { + if(mycore_strncasecmp("checkbox", attr->value.data, 8) == 0) { return modest_finder_match_attribute_only_key(base_node->token->attr_first, "checked", 7); } } else if(attr->value.length == 5) { - if(myhtml_strncasecmp("radio", attr->value.data, 5) == 0) { + if(mycore_strncasecmp("radio", attr->value.data, 5) == 0) { return modest_finder_match_attribute_only_key(base_node->token->attr_first, "checked", 7); } } diff --git a/source/modest/finder/pseudo_class.h b/source/modest/finder/pseudo_class.h index 17c682a..c9c1c07 100644 --- a/source/modest/finder/pseudo_class.h +++ b/source/modest/finder/pseudo_class.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/finder/resource.h b/source/modest/finder/resource.h index 839914a..0d312ba 100644 --- a/source/modest/finder/resource.h +++ b/source/modest/finder/resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/finder/thread.c b/source/modest/finder/thread.c index 1d03b09..a6f5d86 100644 --- a/source/modest/finder/thread.c +++ b/source/modest/finder/thread.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,12 @@ #include "modest/finder/thread.h" /* private functions */ +#ifndef MyCORE_BUILD_WITHOUT_THREADS static void modest_finder_thread_stream(mythread_id_t thread_id, void* arg); +#else +static void modest_finder_thread_stream_single(modest_finder_thread_t* finder_thread, mycss_selectors_list_t* selector_list); +#endif + static modest_finder_thread_context_t * modest_finder_thread_create_context(modest_finder_thread_t* finder_thread, size_t count); //static void modest_finder_thread_callback_found(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, // mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx); @@ -29,11 +34,15 @@ static modest_finder_thread_context_t * modest_finder_thread_create_context(mode /* basic functions */ modest_finder_thread_t * modest_finder_thread_create(void) { - return (modest_finder_thread_t*)myhtml_calloc(1, sizeof(modest_finder_thread_t)); + return (modest_finder_thread_t*)mycore_calloc(1, sizeof(modest_finder_thread_t)); } -modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count) +mystatus_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count) { +#ifdef MyCORE_BUILD_WITHOUT_THREADS + thread_count = 1; +#endif + finder_thread->finder = finder; /* objects for nodes */ @@ -59,23 +68,27 @@ modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder return MODEST_STATUS_OK; /* create and init threads */ +#ifdef MyCORE_BUILD_WITHOUT_THREADS + finder_thread->thread = NULL; +#else finder_thread->thread = mythread_create(); if(finder_thread->thread == NULL) return MODEST_STATUS_OK; - myhtml_status_t status = mythread_init(finder_thread->thread, "lastmac", thread_count); + mystatus_t status = mythread_init(finder_thread->thread, MyTHREAD_TYPE_STREAM, thread_count, 0); if(status) { - mythread_destroy(finder_thread->thread, NULL, true); + mythread_destroy(finder_thread->thread, NULL, NULL, true); return MODEST_STATUS_OK; } finder_thread->thread->context = finder_thread; /* create threads */ - for(size_t i = finder_thread->thread->pth_list_root; i < finder_thread->thread->pth_list_size; i++) { - myhread_create_stream(finder_thread->thread, mythread_function, modest_finder_thread_stream, MyTHREAD_OPT_UNDEF, &status); + for(size_t i = 0; i < finder_thread->thread->entries_size; i++) { + myhread_entry_create(finder_thread->thread, mythread_function, modest_finder_thread_stream, MyTHREAD_OPT_STOP); } +#endif return MODEST_STATUS_OK; } @@ -93,28 +106,24 @@ modest_finder_thread_t * modest_finder_thread_destroy(modest_finder_thread_t* fi if(finder_thread == NULL) return NULL; - finder_thread->entry_obj = mcobject_async_destroy(finder_thread->entry_obj, true); - finder_thread->declaration_obj = mcobject_async_destroy(finder_thread->declaration_obj, true); - +#ifndef MyCORE_BUILD_WITHOUT_THREADS if(finder_thread->thread) { - finder_thread->thread->stream_opt = MyTHREAD_OPT_QUIT; - - for(size_t i = finder_thread->thread->pth_list_root; i < finder_thread->thread->pth_list_size; i++) { - finder_thread->thread->pth_list[i].data.opt = MyTHREAD_OPT_QUIT; - } - - finder_thread->thread = mythread_destroy(finder_thread->thread, NULL, true); + finder_thread->thread = mythread_destroy(finder_thread->thread, mythread_callback_quit, NULL, true); } +#endif + + finder_thread->entry_obj = mcobject_async_destroy(finder_thread->entry_obj, true); + finder_thread->declaration_obj = mcobject_async_destroy(finder_thread->declaration_obj, true); if(finder_thread->context_list) { - myhtml_free(finder_thread->context_list); + mycore_free(finder_thread->context_list); finder_thread->context_list = NULL; finder_thread->context_list_size = 0; } if(self_destroy) { - myhtml_free(finder_thread); + mycore_free(finder_thread); return NULL; } @@ -133,8 +142,64 @@ void modest_finder_thread_collate_node(modest_t* modest, myhtml_tree_node_t* nod } } -modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, - myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list) +#ifdef MyCORE_BUILD_WITHOUT_THREADS +mystatus_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, + myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list) +{ + finder_thread->base_node = scope_node; + finder_thread->selector_list = selector_list; + + if(finder_thread->finder == NULL) + return MODEST_STATUS_ERROR; + + modest_finder_thread_stream_single(finder_thread, selector_list); + + /* calc result */ + modest_finder_thread_context_t* context = finder_thread->context_list; + myhtml_tree_node_t* node = scope_node; + + /* compare results */ + while(node) { + modest_finder_thread_entry_t* entry = context->entry; + + while(entry) { + if(entry->node == node) + { + if(entry->next) + entry->next->prev = entry->prev; + else + context->entry_last = entry->prev; + + if(entry->prev) + entry->prev->next = entry->next; + else + context->entry = entry->next; + + modest_finder_thread_collate_node(modest, node, entry); + } + + entry = entry->next; + } + + if(node->child) + node = node->child; + else { + while(node != scope_node && node->next == NULL) + node = node->parent; + + if(node == scope_node) + break; + + node = node->next; + } + } + + return MyCORE_STATUS_OK; +} + +#else /* end def MyCORE_BUILD_WITHOUT_THREADS */ +mystatus_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, + myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list) { finder_thread->base_node = scope_node; finder_thread->selector_list = selector_list; @@ -142,7 +207,7 @@ modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thr if(finder_thread->finder == NULL) return MODEST_STATUS_ERROR; - mythread_resume_all(finder_thread->thread); + mythread_resume(finder_thread->thread, MyTHREAD_OPT_UNDEF); modest_finder_thread_wait_for_all_done(finder_thread); /* calc result */ @@ -151,7 +216,7 @@ modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thr /* compare results */ while(node) { - for(size_t i = finder_thread->thread->pth_list_root; i < finder_thread->thread->pth_list_size; i++) + for(size_t i = 0; i < finder_thread->thread->entries_length; i++) { modest_finder_thread_context_t* context = &context_list[i]; modest_finder_thread_entry_t* entry = context->entry; @@ -194,29 +259,26 @@ modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thr void modest_finder_thread_wait_for_all_done(modest_finder_thread_t* finder_thread) { - const struct timespec tomeout = {0, 0}; - - for (size_t idx = finder_thread->thread->pth_list_root; idx < finder_thread->thread->pth_list_size; idx++) { - while((finder_thread->thread->pth_list[idx].data.opt & MyTHREAD_OPT_DONE) == 0) { - myhtml_thread_nanosleep(&tomeout); + for (size_t idx = 0; idx < finder_thread->thread->entries_length; idx++) { + while((finder_thread->thread->entries[idx].context.opt & MyTHREAD_OPT_DONE) == 0) { + mythread_nanosleep_sleep(finder_thread->thread->timespec); } } } +#endif /* if undef MyCORE_BUILD_WITHOUT_THREADS */ modest_finder_thread_context_t * modest_finder_thread_create_context(modest_finder_thread_t* finder_thread, size_t count) { - /* +1 because threads ids begin 1 */ - count++; finder_thread->context_list_size = count; - modest_finder_thread_context_t *ctx = myhtml_calloc(count, sizeof(modest_finder_thread_context_t)); + modest_finder_thread_context_t *ctx = mycore_calloc(count, sizeof(modest_finder_thread_context_t)); if(ctx == NULL) return NULL; mcobject_async_status_t mcstatus; - for(size_t i = 1; i < count; i++) { + for(size_t i = 0; i < count; i++) { ctx[i].entry_node_id = mcobject_async_node_add(finder_thread->entry_obj, &mcstatus); if(mcstatus) { @@ -225,12 +287,12 @@ modest_finder_thread_context_t * modest_finder_thread_create_context(modest_find mcobject_async_node_delete(finder_thread->entry_obj, ctx[i].entry_node_id); } - myhtml_free(ctx); + mycore_free(ctx); return NULL; } } - for(size_t i = 1; i < count; i++) { + for(size_t i = 0; i < count; i++) { ctx[i].declaration_node_id = mcobject_async_node_add(finder_thread->declaration_obj, &mcstatus); if(mcstatus) { @@ -245,7 +307,7 @@ modest_finder_thread_context_t * modest_finder_thread_create_context(modest_find mcobject_async_node_delete(finder_thread->declaration_obj, ctx[i].declaration_node_id); } - myhtml_free(ctx); + mycore_free(ctx); return NULL; } } @@ -371,6 +433,25 @@ void modest_finder_thread_callback_found(modest_finder_t* finder, myhtml_tree_no } } +void modest_finder_thread_stream_single(modest_finder_thread_t* finder_thread, mycss_selectors_list_t* selector_list) +{ + modest_finder_thread_found_context_t found_ctx = {finder_thread, finder_thread->context_list}; + + while(selector_list) + { + for(size_t i = 0; i < selector_list->entries_list_length; i++) { + mycss_selectors_entries_list_t *entries = &selector_list->entries_list[i]; + mycss_selectors_specificity_t spec = entries->specificity; + + modest_finder_node_combinator_begin(finder_thread->finder, finder_thread->base_node, selector_list, + entries->entry, &spec, modest_finder_thread_callback_found, &found_ctx); + } + + selector_list = selector_list->next; + } +} + +#ifndef MyCORE_BUILD_WITHOUT_THREADS void modest_finder_thread_stream(mythread_id_t thread_id, void* arg) { mythread_context_t* ctx = (mythread_context_t*)arg; @@ -380,7 +461,7 @@ void modest_finder_thread_stream(mythread_id_t thread_id, void* arg) modest_finder_thread_found_context_t found_ctx = {finder_thread, &finder_thread->context_list[ctx->id]}; size_t count = 0, counnt_done = ctx->id - 1; - size_t offset = (ctx->mythread->pth_list_size - 1); + size_t offset = (ctx->mythread->entries_size - 1); while(selector_list) { for(size_t i = 0; i < selector_list->entries_list_length; i++) { @@ -400,8 +481,6 @@ void modest_finder_thread_stream(mythread_id_t thread_id, void* arg) selector_list = selector_list->next; } - - ctx->opt = MyTHREAD_OPT_STOP|MyTHREAD_OPT_DONE; } - +#endif diff --git a/source/modest/finder/thread.h b/source/modest/finder/thread.h index 7db18fb..7bb6959 100644 --- a/source/modest/finder/thread.h +++ b/source/modest/finder/thread.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,8 @@ #include "modest/finder/myosi.h" #include "modest/finder/finder.h" -#include "myhtml/thread.h" -#include "myhtml/utils/mcobject_async.h" +#include "mycore/mythread.h" +#include "mycore/utils/mcobject_async.h" #include "mycss/declaration/myosi.h" @@ -85,13 +85,16 @@ struct modest_finder_thread_found_context { modest_finder_thread_t * modest_finder_thread_create(void); -modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count); +mystatus_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count); void modest_finder_thread_clean(modest_finder_thread_t* finder_thread, bool self_destroy); modest_finder_thread_t * modest_finder_thread_destroy(modest_finder_thread_t* finder_thread, bool self_destroy); -modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list); +mystatus_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list); +#ifndef MyCORE_BUILD_WITHOUT_THREADS void modest_finder_thread_wait_for_all_done(modest_finder_thread_t* finder_thread); +#endif + bool modest_finder_thread_spec_is_up(modest_style_raw_specificity_t* spec_f, modest_style_raw_specificity_t* spec_t); #ifdef __cplusplus diff --git a/source/modest/finder/type.c b/source/modest/finder/type.c index 0de5ad5..6db405e 100644 --- a/source/modest/finder/type.c +++ b/source/modest/finder/type.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -35,7 +35,7 @@ bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_no } /* tag match */ - myhtml_string_t *str = selector->key; + mycore_string_t *str = selector->key; if(str->length == 1 && *str->data == '*') return true; diff --git a/source/modest/finder/type.h b/source/modest/finder/type.h index 9156b47..a62a460 100644 --- a/source/modest/finder/type.h +++ b/source/modest/finder/type.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ #include "modest/finder/pseudo_class.h" #include "modest/finder/match.h" #include "myhtml/tree.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #include "mycss/selectors/value.h" #ifdef __cplusplus diff --git a/source/modest/glue.c b/source/modest/glue.c index 1c95643..2d54f37 100644 --- a/source/modest/glue.c +++ b/source/modest/glue.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/glue.h b/source/modest/glue.h index 138fa46..6dcb6d2 100644 --- a/source/modest/glue.h +++ b/source/modest/glue.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/layer/layer.c b/source/modest/layer/layer.c index 8d41f18..47aedce 100644 --- a/source/modest/layer/layer.c +++ b/source/modest/layer/layer.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/layer/layer.h b/source/modest/layer/layer.h index 6f501ff..3e19af6 100644 --- a/source/modest/layer/layer.h +++ b/source/modest/layer/layer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ #pragma once #include "modest/myosi.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mcobject.h" #ifdef __cplusplus extern "C" { @@ -47,7 +47,7 @@ struct modest_layout { }; modest_layout_t * modest_layers_create(void); -modest_status_t modest_layers_init(modest_layout_t* layout); +mystatus_t modest_layers_init(modest_layout_t* layout); void modest_layers_clean_all(modest_layout_t* layout); modest_layout_t * modest_layers_destroy(modest_layout_t* layout, bool self_destroy); diff --git a/source/modest/modest.c b/source/modest/modest.c index 680869f..7cf40db 100644 --- a/source/modest/modest.c +++ b/source/modest/modest.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,11 +25,13 @@ modest_t * modest_create(void) { - return (modest_t*)myhtml_calloc(1, sizeof(modest_t)); + return (modest_t*)mycore_calloc(1, sizeof(modest_t)); } -modest_status_t modest_init(modest_t* modest) +mystatus_t modest_init(modest_t* modest) { + mystatus_t status; + /* Modest nodes */ modest->mnode_obj = mcobject_async_create(); if(modest->mnode_obj == NULL) @@ -61,29 +63,33 @@ modest_status_t modest_init(modest_t* modest) /* Modest style type */ - modest->mstyle_type_obj = mchar_async_create(12, (4096 * 5)); + modest->mstyle_type_obj = mchar_async_create(); if(modest->mstyle_type_obj == NULL) return MODEST_STATUS_ERROR_STYLE_TYPE_CREATE; - modest->mstyle_type_node_id = mchar_async_node_add(modest->mstyle_type_obj); + if((status = mchar_async_init(modest->mstyle_type_obj, 12, (4096 * 5)))) + return status; + modest->mstyle_type_node_id = mchar_async_node_add(modest->mstyle_type_obj, &status); + if(status) + return status; /* for raw declaration style */ modest->mraw_style_declaration_obj = mcobject_create(); if(modest->mraw_style_declaration_obj == NULL) return MODEST_STATUS_ERROR_STYLE_DECLARATION_CREATE; - myhtml_status_t myhtml_status = mcobject_init(modest->mraw_style_declaration_obj, 256, sizeof(modest_style_raw_declaration_t)); + mystatus_t myhtml_status = mcobject_init(modest->mraw_style_declaration_obj, 256, sizeof(modest_style_raw_declaration_t)); if(myhtml_status) return MODEST_STATUS_ERROR_STYLE_DECLARATION_INIT; /* styles tree */ - modest->style_avl_tree = myhtml_utils_avl_tree_create(); + modest->style_avl_tree = mycore_utils_avl_tree_create(); if(modest->style_avl_tree == NULL) return MODEST_STATUS_ERROR_AVL_TREE_CREATE; - myhtml_status = myhtml_utils_avl_tree_init(modest->style_avl_tree); + myhtml_status = mycore_utils_avl_tree_init(modest->style_avl_tree); if(myhtml_status) return MODEST_STATUS_ERROR_AVL_TREE_INIT; @@ -94,7 +100,7 @@ void modest_clean(modest_t* modest) { mcobject_async_clean(modest->mnode_obj); mcobject_async_clean(modest->mstylesheet_obj); - myhtml_utils_avl_tree_clean(modest->style_avl_tree); + mycore_utils_avl_tree_clean(modest->style_avl_tree); } modest_t * modest_destroy(modest_t* modest, bool self_destroy) @@ -104,10 +110,10 @@ modest_t * modest_destroy(modest_t* modest, bool self_destroy) modest->mnode_obj = mcobject_async_destroy(modest->mnode_obj, true); modest->mstylesheet_obj = mcobject_async_destroy(modest->mstylesheet_obj, true); - modest->style_avl_tree = myhtml_utils_avl_tree_destroy(modest->style_avl_tree, true); + modest->style_avl_tree = mycore_utils_avl_tree_destroy(modest->style_avl_tree, true); if(self_destroy) { - myhtml_free(modest); + mycore_free(modest); return NULL; } diff --git a/source/modest/modest.h b/source/modest/modest.h index fabe717..0848ad9 100644 --- a/source/modest/modest.h +++ b/source/modest/modest.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,10 +24,10 @@ #include "modest/myosi.h" #include "modest/layer/layer.h" -#include "myhtml/utils/mcobject.h" -#include "myhtml/utils/mcobject_async.h" -#include "myhtml/utils/mchar_async.h" -#include "myhtml/utils/avl_tree.h" +#include "mycore/utils/mcobject.h" +#include "mycore/utils/mcobject_async.h" +#include "mycore/utils/mchar_async.h" +#include "mycore/utils/avl_tree.h" #ifdef __cplusplus extern "C" { @@ -47,7 +47,7 @@ struct modest { modest_layout_t* layout; - myhtml_utils_avl_tree_t* style_avl_tree; + mycore_utils_avl_tree_t* style_avl_tree; /* refs */ myhtml_tree_t* myhtml_tree; @@ -56,7 +56,7 @@ struct modest { modest_t * modest_create(void); -modest_status_t modest_init(modest_t* modest); +mystatus_t modest_init(modest_t* modest); void modest_clean(modest_t* modest); modest_t * modest_destroy(modest_t* modest, bool self_destroy); diff --git a/source/modest/myosi.h b/source/modest/myosi.h index e1239e3..4434f89 100644 --- a/source/modest/myosi.h +++ b/source/modest/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,9 +22,16 @@ #define MODEST_MYOSI_H #pragma once +#include "mycore/myosi.h" #include "myhtml/myhtml.h" #include "mycss/mycss.h" +#define MODEST_VERSION_MAJOR 0 +#define MODEST_VERSION_MINOR 0 +#define MODEST_VERSION_PATCH 6 + +#define MODEST_VERSION_STRING MyCORE_STR(MODEST_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MODEST_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MODEST_VERSION_PATCH) + #ifdef __cplusplus extern "C" { #endif @@ -36,12 +43,14 @@ extern "C" { for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 - for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 + for myrender 030000..037777; MyRENDER_STATUS_OK == 0x000000 + for myurl 038888..0388ff; MyURL_STATUS_OK == 0x000000 + for myunicode 038900..038bff; MyUNICODE_STATUS_OK == 0x000000 + not occupied 038c00..03ffff; for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 - for myfont 070000..07ffff; MyFONT_STATUS_OK == 0x000000 - not occupied 080000.. + not occupied 070000.. */ enum modest_status { MODEST_STATUS_OK = 0x000000, diff --git a/source/modest/node/node.c b/source/modest/node/node.c index c9cb748..ce32709 100644 --- a/source/modest/node/node.c +++ b/source/modest/node/node.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -33,13 +33,13 @@ modest_node_t * modest_node_create(modest_t* modest) return mnode; } -modest_status_t modest_node_init(modest_t* modest, modest_node_t *mnode) +mystatus_t modest_node_init(modest_t* modest, modest_node_t *mnode) { mnode->stylesheet = modest_style_sheet_create(modest); if(mnode->stylesheet == NULL) return MODEST_STATUS_ERROR_MEMORY_ALLOCATION; - modest_status_t status = modest_style_sheet_init(modest, mnode->stylesheet); + mystatus_t status = modest_style_sheet_init(modest, mnode->stylesheet); if(status) return MODEST_STATUS_ERROR; @@ -70,7 +70,7 @@ void modest_node_raw_declaration_set_by_type(modest_t* modest, modest_node_t *mn mycss_declaration_entry_t * modest_node_declaration_by_type(modest_t* modest, modest_node_t *mnode, mycss_property_type_t type) { - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(modest->style_avl_tree, mnode->avl_tree_node, type); + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(modest->style_avl_tree, mnode->avl_tree_node, type); if(find_node) return ((modest_style_raw_declaration_t*)find_node->value)->declaration; @@ -80,13 +80,13 @@ mycss_declaration_entry_t * modest_node_declaration_by_type(modest_t* modest, mo modest_style_raw_declaration_t * modest_node_raw_declaration_by_type(modest_t* modest, modest_node_t *mnode, mycss_property_type_t type) { - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(modest->style_avl_tree, mnode->avl_tree_node, type); + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(modest->style_avl_tree, mnode->avl_tree_node, type); return (find_node ? find_node->value : NULL); } void modest_node_raw_declaration_set_by_type(modest_t* modest, modest_node_t *mnode, mycss_property_type_t type, modest_style_raw_declaration_t *raw_declr) { - myhtml_utils_avl_tree_add(modest->style_avl_tree, &mnode->avl_tree_node, type, raw_declr); + mycore_utils_avl_tree_add(modest->style_avl_tree, &mnode->avl_tree_node, type, raw_declr); } #endif /* MODEST_NODE_FULL_RAW */ diff --git a/source/modest/node/node.h b/source/modest/node/node.h index 3de5b9c..5403c35 100644 --- a/source/modest/node/node.h +++ b/source/modest/node/node.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ #include "modest/modest.h" #include "modest/style/raw.h" #include "modest/render/tree_node.h" -#include "myhtml/utils/avl_tree.h" +#include "mycore/utils/avl_tree.h" #ifdef __cplusplus extern "C" { @@ -35,7 +35,7 @@ extern "C" { struct modest_node { modest_style_sheet_t* stylesheet; #ifndef MODEST_NODE_FULL_RAW - myhtml_utils_avl_tree_node_t *avl_tree_node; + mycore_utils_avl_tree_node_t *avl_tree_node; #else modest_style_raw_declaration_t * raw_declaration[MyCSS_PROPERTY_TYPE_LAST_ENTRY]; #endif /* MODEST_NODE_FULL_RAW */ @@ -44,7 +44,7 @@ struct modest_node { }; modest_node_t * modest_node_create(modest_t* modest); -modest_status_t modest_node_init(modest_t* modest, modest_node_t *mnode); +mystatus_t modest_node_init(modest_t* modest, modest_node_t *mnode); mycss_declaration_entry_t * modest_node_declaration_by_type(modest_t* modest, modest_node_t *mnode, mycss_property_type_t type); diff --git a/source/modest/node/property.c b/source/modest/node/property.c index 5e77a57..f59a232 100644 --- a/source/modest/node/property.c +++ b/source/modest/node/property.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/node/property.h b/source/modest/node/property.h index 27190c0..fd7dc17 100644 --- a/source/modest/node/property.h +++ b/source/modest/node/property.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/node/raw_property.c b/source/modest/node/raw_property.c index 8b0bb33..f72dbfb 100644 --- a/source/modest/node/raw_property.c +++ b/source/modest/node/raw_property.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/node/raw_property.h b/source/modest/node/raw_property.h index 237cb63..bb19b81 100644 --- a/source/modest/node/raw_property.h +++ b/source/modest/node/raw_property.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/node/serialization.c b/source/modest/node/serialization.c index 0b6a23a..af72d8c 100644 --- a/source/modest/node/serialization.c +++ b/source/modest/node/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "modest/node/serialization.h" -void modest_node_raw_serialization_declaration(mycss_entry_t* mycss_entry, mycss_declaration_entry_t* decl, mycss_property_type_t property_type, mycss_callback_serialization_f callback, void* context, bool* is_use) +void modest_node_raw_serialization_declaration(mycss_entry_t* mycss_entry, mycss_declaration_entry_t* decl, mycss_property_type_t property_type, mycore_callback_serialize_f callback, void* context, bool* is_use) { if(decl == NULL) return; @@ -36,7 +36,7 @@ void modest_node_raw_serialization_declaration(mycss_entry_t* mycss_entry, mycss } } -//bool modest_node_raw_serialization(mycss_entry_t* mycss_entry, modest_node_t* mnode, mycss_callback_serialization_f callback, void* context) +//bool modest_node_raw_serialization(mycss_entry_t* mycss_entry, modest_node_t* mnode, mycore_callback_serialize_f callback, void* context) //{ // bool is_use = false; // @@ -48,7 +48,7 @@ void modest_node_raw_serialization_declaration(mycss_entry_t* mycss_entry, mycss // return is_use; //} -void modest_node_raw_serialization_callback(myhtml_utils_avl_tree_node_t* node, void* context) +void modest_node_raw_serialization_callback(mycore_utils_avl_tree_node_t* node, void* context) { modest_node_serialization_context_t *ctx = context; @@ -56,11 +56,11 @@ void modest_node_raw_serialization_callback(myhtml_utils_avl_tree_node_t* node, modest_node_raw_serialization_declaration(ctx->modest->mycss_entry, raw_declr->declaration, (mycss_property_type_t)node->type, ctx->callback, ctx->context, &ctx->is_use); } -bool modest_node_raw_serialization(modest_t* modest, modest_node_t* mnode, mycss_callback_serialization_f callback, void* context) +bool modest_node_raw_serialization(modest_t* modest, modest_node_t* mnode, mycore_callback_serialize_f callback, void* context) { modest_node_serialization_context_t ctx = {modest, callback, context, 0}; - myhtml_utils_avl_tree_list_all_nodes(modest->style_avl_tree, mnode->avl_tree_node, modest_node_raw_serialization_callback, &ctx); + mycore_utils_avl_tree_list_all_nodes(modest->style_avl_tree, mnode->avl_tree_node, modest_node_raw_serialization_callback, &ctx); return ctx.is_use; } diff --git a/source/modest/node/serialization.h b/source/modest/node/serialization.h index 73f3828..df68ba6 100644 --- a/source/modest/node/serialization.h +++ b/source/modest/node/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -34,13 +34,13 @@ extern "C" { struct modest_node_serialization_context { modest_t* modest; - mycss_callback_serialization_f callback; + mycore_callback_serialize_f callback; void* context; bool is_use; } typedef modest_node_serialization_context_t; -bool modest_node_raw_serialization(modest_t* modest, modest_node_t* mnode, mycss_callback_serialization_f callback, void* context); +bool modest_node_raw_serialization(modest_t* modest, modest_node_t* mnode, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/render/begin.c b/source/modest/render/begin.c index 55784c7..6aff8bc 100644 --- a/source/modest/render/begin.c +++ b/source/modest/render/begin.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/render/begin.h b/source/modest/render/begin.h index 53a2b99..b772559 100644 --- a/source/modest/render/begin.h +++ b/source/modest/render/begin.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/render/binding.c b/source/modest/render/binding.c index d6486bc..6500c33 100644 --- a/source/modest/render/binding.c +++ b/source/modest/render/binding.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/render/binding.h b/source/modest/render/binding.h index 2f6ad5a..1b006da 100644 --- a/source/modest/render/binding.h +++ b/source/modest/render/binding.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/render/tree.c b/source/modest/render/tree.c index e7cc9d9..6c705dd 100644 --- a/source/modest/render/tree.c +++ b/source/modest/render/tree.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,16 +22,16 @@ modest_render_tree_t * modest_render_tree_create(void) { - return myhtml_calloc(1, sizeof(modest_render_tree_t)); + return mycore_calloc(1, sizeof(modest_render_tree_t)); } -modest_status_t modest_render_tree_init(modest_render_tree_t* render_tree) +mystatus_t modest_render_tree_init(modest_render_tree_t* render_tree) { render_tree->mc_nodes = mcobject_create(); if(render_tree->mc_nodes == NULL) return MODEST_STATUS_ERROR_MEMORY_ALLOCATION; - myhtml_status_t myhtml_status = mcobject_init(render_tree->mc_nodes, 1024, sizeof(modest_render_tree_node_t)); + mystatus_t myhtml_status = mcobject_init(render_tree->mc_nodes, 1024, sizeof(modest_render_tree_node_t)); if(myhtml_status) return MODEST_STATUS_ERROR; @@ -51,7 +51,7 @@ modest_render_tree_t * modest_render_tree_destroy(modest_render_tree_t* render_t render_tree->mc_nodes = mcobject_destroy(render_tree->mc_nodes, true); if(self_destroy) { - myhtml_free(render_tree); + mycore_free(render_tree); return NULL; } @@ -59,7 +59,7 @@ modest_render_tree_t * modest_render_tree_destroy(modest_render_tree_t* render_t } void modest_render_tree_serialization(myhtml_tree_t* html_tree, modest_render_tree_t* tree, - modest_render_tree_node_t* scope_node, mycss_callback_serialization_f callback, void* context) + modest_render_tree_node_t* scope_node, mycore_callback_serialize_f callback, void* context) { modest_render_tree_node_t* node = scope_node; size_t depth = 0; diff --git a/source/modest/render/tree.h b/source/modest/render/tree.h index 1c3966e..ea9deeb 100644 --- a/source/modest/render/tree.h +++ b/source/modest/render/tree.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,7 +25,7 @@ typedef struct modest_render_tree modest_render_tree_t; #include "modest/modest.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mcobject.h" #include "modest/render/tree_node.h" #ifdef __cplusplus @@ -37,12 +37,12 @@ struct modest_render_tree { }; modest_render_tree_t * modest_render_tree_create(void); -modest_status_t modest_render_tree_init(modest_render_tree_t* render_tree); +mystatus_t modest_render_tree_init(modest_render_tree_t* render_tree); void modest_render_tree_clean_all(modest_render_tree_t* render_tree); modest_render_tree_t * modest_render_tree_destroy(modest_render_tree_t* render_tree, bool self_destroy); void modest_render_tree_serialization(myhtml_tree_t* html_tree, modest_render_tree_t* tree, - modest_render_tree_node_t* scope_node, mycss_callback_serialization_f callback, void* context); + modest_render_tree_node_t* scope_node, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/render/tree_node.c b/source/modest/render/tree_node.c index 37eb736..fe2dc45 100644 --- a/source/modest/render/tree_node.c +++ b/source/modest/render/tree_node.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -122,7 +122,7 @@ void modest_render_tree_node_append_before(modest_render_tree_node_t* target, mo target->prev = node; } -void modest_render_tree_node_serialization(myhtml_tree_t* html_tree, modest_render_tree_node_t* node, mycss_callback_serialization_f callback, void* context) +void modest_render_tree_node_serialization(myhtml_tree_t* html_tree, modest_render_tree_node_t* node, mycore_callback_serialize_f callback, void* context) { callback("<", 1, context); diff --git a/source/modest/render/tree_node.h b/source/modest/render/tree_node.h index 15593df..ce98ee7 100644 --- a/source/modest/render/tree_node.h +++ b/source/modest/render/tree_node.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,7 +28,7 @@ typedef struct modest_render_tree_node modest_render_tree_node_t; #include "modest/render/tree.h" #include "myhtml/tree.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mcobject.h" #ifdef __cplusplus extern "C" { @@ -62,7 +62,7 @@ void modest_render_tree_node_remove(modest_render_tree_node_t* node); void modest_render_tree_node_append_after(modest_render_tree_node_t* target, modest_render_tree_node_t* node); void modest_render_tree_node_append_before(modest_render_tree_node_t* target, modest_render_tree_node_t* node); -void modest_render_tree_node_serialization(myhtml_tree_t* html_tree, modest_render_tree_node_t* node, mycss_callback_serialization_f callback, void* context); +void modest_render_tree_node_serialization(myhtml_tree_t* html_tree, modest_render_tree_node_t* node, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/style/default.c b/source/modest/style/default.c index 777db46..bd191de 100644 --- a/source/modest/style/default.c +++ b/source/modest/style/default.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/default.h b/source/modest/style/default.h index d4eadc3..2adc06a 100644 --- a/source/modest/style/default.h +++ b/source/modest/style/default.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/default_entries.h b/source/modest/style/default_entries.h index 0558e81..5545415 100644 --- a/source/modest/style/default_entries.h +++ b/source/modest/style/default_entries.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/default_resources.h b/source/modest/style/default_resources.h index 39d723d..a61abf4 100644 --- a/source/modest/style/default_resources.h +++ b/source/modest/style/default_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/map.c b/source/modest/style/map.c index 9ca57e0..5c2affc 100644 --- a/source/modest/style/map.c +++ b/source/modest/style/map.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/map.h b/source/modest/style/map.h index 28174bf..aad706c 100644 --- a/source/modest/style/map.h +++ b/source/modest/style/map.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/map_resource.h b/source/modest/style/map_resource.h index bb2eca2..9938dd8 100644 --- a/source/modest/style/map_resource.h +++ b/source/modest/style/map_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/raw.c b/source/modest/style/raw.c index 96cb01c..1b64e5d 100644 --- a/source/modest/style/raw.c +++ b/source/modest/style/raw.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/modest/style/raw.h b/source/modest/style/raw.h index 3567d47..c9155e5 100644 --- a/source/modest/style/raw.h +++ b/source/modest/style/raw.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,7 +24,7 @@ #include "modest/myosi.h" #include "modest/modest.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mcobject.h" #ifdef __cplusplus extern "C" { diff --git a/source/modest/style/sheet.c b/source/modest/style/sheet.c index 84ae158..9609d26 100644 --- a/source/modest/style/sheet.c +++ b/source/modest/style/sheet.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,7 +32,7 @@ modest_style_sheet_t * modest_style_sheet_create(modest_t* modest) return m_stylesheet; } -modest_status_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet) +mystatus_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet) { return MODEST_STATUS_OK; } diff --git a/source/modest/style/sheet.h b/source/modest/style/sheet.h index 5f8bea6..5dd12df 100644 --- a/source/modest/style/sheet.h +++ b/source/modest/style/sheet.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -53,7 +53,7 @@ struct modest_style_sheet { }; modest_style_sheet_t * modest_style_sheet_create(modest_t* modest); -modest_status_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet); +mystatus_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/style/type.c b/source/modest/style/type.c index fc81899..6750cb7 100644 --- a/source/modest/style/type.c +++ b/source/modest/style/type.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,7 +32,7 @@ void * modest_style_type_create(modest_t* modest, size_t size) return data; } -modest_status_t modest_style_type_init(modest_t* modest, void *data) +mystatus_t modest_style_type_init(modest_t* modest, void *data) { return MODEST_STATUS_OK; } diff --git a/source/modest/style/type.h b/source/modest/style/type.h index 366b0b4..a2b1e61 100644 --- a/source/modest/style/type.h +++ b/source/modest/style/type.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,7 +25,7 @@ #include "modest/myosi.h" #include "modest/modest.h" #include "mycss/declaration/myosi.h" -#include "myhtml/utils/mchar_async.h" +#include "mycore/utils/mchar_async.h" #ifdef __cplusplus extern "C" { @@ -44,7 +44,7 @@ struct modest_style_type_display { void * modest_style_type_create(modest_t* modest, size_t size); -modest_status_t modest_style_type_init(modest_t* modest, void *data); +mystatus_t modest_style_type_init(modest_t* modest, void *data); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycore/Makefile.mk b/source/mycore/Makefile.mk new file mode 100644 index 0000000..fbbd1c1 --- /dev/null +++ b/source/mycore/Makefile.mk @@ -0,0 +1,13 @@ +mycore_dirs := . utils +mycore_objs := $(call MODEST_UTILS_OBJS,mycore,$(mycore_dirs)) + +mycore_description := base module, it is used by all other modules +mycore_dependencies := + +mycore_all: $(mycore_objs) + +mycore_clean: + rm -f $(mycore_objs) + +mycore_clone: + $(call MODEST_UTILS_HDRS_CLONE,mycore,$(mycore_dirs)) diff --git a/source/mycore/incoming.c b/source/mycore/incoming.c new file mode 100644 index 0000000..4b83e11 --- /dev/null +++ b/source/mycore/incoming.c @@ -0,0 +1,228 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/incoming.h" +#include "mycore/utils/resources.h" + +mycore_incoming_buffer_t * mycore_incoming_buffer_add(mycore_incoming_buffer_t *current, mcobject_t *mcobject, + const char *html, size_t html_size) +{ + mycore_incoming_buffer_t *inc_buf = mcobject_malloc(mcobject, NULL); + + inc_buf->size = html_size; + inc_buf->length = 0; + inc_buf->data = html; + + if(current) { + inc_buf->offset = current->offset + current->size; + current->next = inc_buf; + } + else { + inc_buf->offset = 0; + } + + inc_buf->prev = current; + inc_buf->next = NULL; + + return inc_buf; +} + +void mycore_incoming_buffer_clean(mycore_incoming_buffer_t *current) +{ + memset(current, 0, sizeof(mycore_incoming_buffer_t)); +} + +mycore_incoming_buffer_t * mycore_incoming_buffer_split(mycore_incoming_buffer_t *current, mcobject_t *mcobject, size_t global_pos) +{ + size_t relative_pos = global_pos - current->offset; + mycore_incoming_buffer_t *inc_buf = mcobject_malloc(mcobject, NULL); + + inc_buf->size = current->size - relative_pos; + inc_buf->length = inc_buf->size; + inc_buf->data = ¤t->data[relative_pos]; + inc_buf->offset = current->offset + relative_pos; + inc_buf->next = NULL; + inc_buf->prev = current; + + current->next = inc_buf; + current->size = relative_pos; + current->length = relative_pos; + + return inc_buf; +} + +mycore_incoming_buffer_t * mycore_incoming_buffer_find_by_position(mycore_incoming_buffer_t *inc_buf, size_t begin) +{ + if(inc_buf->offset < begin) { + while(inc_buf && (inc_buf->offset + inc_buf->size) < begin) + inc_buf = inc_buf->next; + } + else { + while(inc_buf && inc_buf->offset > begin) + inc_buf = inc_buf->prev; + } + + return inc_buf; +} + +const char * mycore_incoming_buffer_data(mycore_incoming_buffer_t *inc_buf) +{ + return inc_buf->data; +} + +size_t mycore_incoming_buffer_length(mycore_incoming_buffer_t *inc_buf) +{ + return inc_buf->length; +} + +size_t mycore_incoming_buffer_size(mycore_incoming_buffer_t *inc_buf) +{ + return inc_buf->size; +} + +size_t mycore_incoming_buffer_offset(mycore_incoming_buffer_t *inc_buf) +{ + return inc_buf->offset; +} + +size_t mycore_incoming_buffer_relative_begin(mycore_incoming_buffer_t *inc_buf, size_t begin) +{ + return (begin - inc_buf->offset); +} + +size_t mycore_incoming_buffer_available_length(mycore_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length) +{ + if((relative_begin + length) > inc_buf->size) + return (inc_buf->size - relative_begin); + + return length; +} + +mycore_incoming_buffer_t * mycore_incoming_buffer_next(mycore_incoming_buffer_t *inc_buf) +{ + return inc_buf->next; +} + +mycore_incoming_buffer_t * mycore_incoming_buffer_prev(mycore_incoming_buffer_t *inc_buf) +{ + return inc_buf->prev; +} + +// // // +// convert only one 002345 (\002345) to code point +// +size_t mycore_incoming_buffer_convert_one_escaped_to_code_point(mycore_incoming_buffer_t **inc_buf, size_t *relative_pos) +{ + const unsigned char *u_data; + mycore_incoming_buffer_t *current = *inc_buf; + + if(*relative_pos >= current->size) { + *relative_pos = 0; + current = current->next; + } + + u_data = (const unsigned char*)current->data; + + unsigned int consume = 0; + size_t code_point = 0; + + while(current) + { + if(mycore_string_chars_num_map[ u_data[*relative_pos] ] != 0xff && consume < 6) { + code_point <<= 4; + code_point |= mycore_string_chars_hex_map[ u_data[*relative_pos] ]; + + ++consume; + } + else + break; + + *relative_pos += 1; + + if(*relative_pos >= current->size) + { + if(current->next == NULL) + break; + + *relative_pos = 0; + + u_data = (const unsigned char*)current->data; + current = current->next; + } + } + + *inc_buf = current; + + return code_point; +} + +size_t mycore_incoming_buffer_escaped_case_cmp(mycore_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos) +{ + mycore_incoming_buffer_t *current = *inc_buf; + + if(*relative_pos >= current->size) { + if(current->next == 0) + return to_size; + + *relative_pos = 0; + current = current->next; + } + + const unsigned char *u_to = (const unsigned char*)to; + const unsigned char *u_data = (const unsigned char*)current->data; + + size_t i = 0; + + while(i < to_size) + { + if(u_data[*relative_pos] == 0x5C) { + *relative_pos += 1; + + size_t code_point = mycore_incoming_buffer_convert_one_escaped_to_code_point(¤t, relative_pos); + + if(code_point > 255 || mycore_string_chars_lowercase_map[code_point] != mycore_string_chars_lowercase_map[ u_to[i] ]) { + break; + } + + u_data = (const unsigned char*)current->data; + } + else if(mycore_string_chars_lowercase_map[ u_data[*relative_pos] ] != mycore_string_chars_lowercase_map[ u_to[i] ]) { + break; + } + else { + ++(*relative_pos); + } + + i++; + + if(*relative_pos >= current->size) + { + if(current->next == NULL) + break; + + current = current->next; + u_data = (const unsigned char*)current->data; + *relative_pos = 0; + } + } + + *inc_buf = current; + return (to_size - i); +} diff --git a/source/mycore/incoming.h b/source/mycore/incoming.h new file mode 100644 index 0000000..6b7afd9 --- /dev/null +++ b/source/mycore/incoming.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_INCOMING_H +#define MyCORE_INCOMING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" +#include "mycore/utils/mcobject.h" + +struct mycore_incoming_buffer { + const char* data; + size_t length; // use of data + size_t size; // size of data + size_t offset; // begin global offset + + struct mycore_incoming_buffer* prev; + struct mycore_incoming_buffer* next; +}; + +mycore_incoming_buffer_t * mycore_incoming_buffer_add(mycore_incoming_buffer_t *current, mcobject_t *mcobject, const char *html, size_t html_size); +void mycore_incoming_buffer_clean(mycore_incoming_buffer_t *current); +mycore_incoming_buffer_t * mycore_incoming_buffer_split(mycore_incoming_buffer_t *current, mcobject_t *mcobject, size_t global_pos); + +mycore_incoming_buffer_t * mycore_incoming_buffer_find_by_position(mycore_incoming_buffer_t *inc_buf, size_t begin); + +const char * mycore_incoming_buffer_data(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_length(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_size(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_offset(mycore_incoming_buffer_t *inc_buf); +size_t mycore_incoming_buffer_relative_begin(mycore_incoming_buffer_t *inc_buf, size_t begin); +size_t mycore_incoming_buffer_available_length(mycore_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); + +mycore_incoming_buffer_t * mycore_incoming_buffer_next(mycore_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_t * mycore_incoming_buffer_prev(mycore_incoming_buffer_t *inc_buf); + +size_t mycore_incoming_buffer_convert_one_escaped_to_code_point(mycore_incoming_buffer_t **inc_buf, size_t *relative_pos); +size_t mycore_incoming_buffer_escaped_case_cmp(mycore_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_INCOMING_H */ diff --git a/source/mycore/myosi.c b/source/mycore/myosi.c new file mode 100644 index 0000000..f9758ed --- /dev/null +++ b/source/mycore/myosi.c @@ -0,0 +1,22 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" + diff --git a/source/mycore/myosi.h b/source/mycore/myosi.h new file mode 100644 index 0000000..563c44e --- /dev/null +++ b/source/mycore/myosi.h @@ -0,0 +1,169 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_MYOSI_H +#define MyCORE_MYOSI_H +#pragma once + +#include +#include +#include +#include +#include +#include + +#define MyCORE_STR_HELPER(x) #x +#define MyCORE_STR(x) MyCORE_STR_HELPER(x) + +#define MyCORE_VERSION_MAJOR 0 +#define MyCORE_VERSION_MINOR 1 +#define MyCORE_VERSION_PATCH 0 + +#define MyCORE_VERSION_STRING MyCORE_STR(MyCORE_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyCORE_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyCORE_VERSION_PATCH) + +#ifdef __cplusplus +extern "C" { +#endif + +/* Format */ +#ifdef MyCORE_OS_WINDOWS_NT +#define MyCORE_FORMAT_Z "%Iu" +#else +#define MyCORE_FORMAT_Z "%zu" +#endif + +#if defined(_MSC_VER) +# define MyCORE_DEPRECATED(func) __declspec(deprecated) func +#elif defined(__GNUC__) || defined(__INTEL_COMPILER) +# define MyCORE_DEPRECATED(func) func __attribute__((deprecated)) +#else +# define MyCORE_DEPRECATED(func) func +#endif + +/* Debug */ +#define MyCORE_DEBUG(...) do {} while(0) +#define MyCORE_DEBUG_ERROR(...) do {} while(0) + +#define MyCORE_FAILED(_status_) ((_status_) != MyCORE_STATUS_OK) + +// base +/* + Very important!!! + + for mycore 0..008fff; MyCORE_STATUS_OK == 0x000000 + for myhtml 009000..0093ff; MyHTML_STATUS_OK == 0x000000 + for myencoding 009400..00942f; MyENCODING_STATUS_OK == 0x000000 + not occupied 009430..00ffff; + for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 + for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 + for myrender 030000..037777; MyRENDER_STATUS_OK == 0x000000 + for myurl 038888..0388ff; MyURL_STATUS_OK == 0x000000 + for myunicode 038900..038bff; MyUNICODE_STATUS_OK == 0x000000 + not occupied 038c00..03ffff; + for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 + for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 + for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 + not occupied 070000.. +*/ +enum mycore_status { + MyCORE_STATUS_OK = 0x0000, + MyCORE_STATUS_ERROR = 0x0001, + MyCORE_STATUS_ERROR_MEMORY_ALLOCATION = 0x0002, + MyCORE_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, + MyCORE_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, + MyCORE_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, + MyCORE_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, + MyCORE_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, + MyCORE_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, + MyCORE_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, + MyCORE_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, + MyCORE_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, + MyCORE_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, + MyCORE_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, + MyCORE_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, + MyCORE_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, + MyCORE_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, + MyCORE_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, + MyCORE_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, + MyCORE_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, + MyCORE_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, + MyCORE_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, + MyCORE_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, + MyCORE_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, + MyCORE_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x0050, + MyCORE_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x0051, + MyCORE_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0055, + MyCORE_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0056, + MyCORE_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0057, + MyCORE_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0058, + MyCORE_STATUS_ASYNC_ERROR_LOCK = 0x0060, + MyCORE_STATUS_ASYNC_ERROR_UNLOCK = 0x0061, + MyCORE_STATUS_ERROR_NO_FREE_SLOT = 0x0062, +} +typedef mycore_status_t; + +typedef unsigned int mystatus_t; + +/* thread */ +typedef struct mythread_queue_list_entry mythread_queue_list_entry_t; +typedef struct mythread_queue_thread_param mythread_queue_thread_param_t; +typedef struct mythread_queue_list mythread_queue_list_t; +typedef struct mythread_queue_node mythread_queue_node_t; +typedef struct mythread_queue mythread_queue_t; + +typedef size_t mythread_id_t; +typedef struct mythread_context mythread_context_t; +typedef struct mythread_entry mythread_entry_t; +typedef struct mythread mythread_t; + +/* mystring */ +typedef struct mycore_string_raw mycore_string_raw_t; +typedef struct mycore_string mycore_string_t; + +/* incoming buffer */ +typedef struct mycore_incoming_buffer mycore_incoming_buffer_t; + +/* callbacks */ +typedef mystatus_t (*mycore_callback_serialize_f)(const char* buffer, size_t size, void* ctx); + +void * mycore_malloc(size_t size); +void * mycore_realloc(void* dst, size_t size); +void * mycore_calloc(size_t num, size_t size); +void * mycore_free(void* dst); + +/* io */ +FILE * mycore_fopen(const char *filename, const char *mode); +int mycore_fclose(FILE *stream); + +size_t mycore_fread(void *buffer, size_t size, size_t count, FILE *stream); +size_t mycore_fwrite(const void *buffer, size_t size, size_t count, FILE *stream); +int mycore_fflush(FILE *stream); +int mycore_fseek(FILE* stream, long offset, int origin); +long mycore_ftell(FILE* stream); +int mycore_ferror(FILE *stream); + +void mycore_setbuf(FILE *stream, char *buffer); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_MYOSI_H */ + diff --git a/source/mycore/mystring.c b/source/mycore/mystring.c new file mode 100644 index 0000000..67cd36a --- /dev/null +++ b/source/mycore/mystring.c @@ -0,0 +1,319 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/mystring.h" +#include "mycore/utils/resources.h" + +///////////////////////////////////////////////////////// +//// Init, Clean, Destroy +//// +///////////////////////////////////////////////////////// +char * mycore_string_init(mchar_async_t *mchar, size_t node_idx, mycore_string_t* str, size_t size) +{ + str->data = mchar_async_malloc(mchar, node_idx, size); + str->size = size; + str->node_idx = node_idx; + str->mchar = mchar; + + mycore_string_clean(str); + + return str->data; +} + +void mycore_string_clean(mycore_string_t* str) +{ + str->length = 0; +} + +void mycore_string_clean_all(mycore_string_t* str) +{ + memset(str, 0, sizeof(mycore_string_t)); +} + +mycore_string_t * mycore_string_destroy(mycore_string_t* str, bool destroy_obj) +{ + if(str == NULL) + return NULL; + + if(str->data && str->mchar) + mchar_async_free(str->mchar, str->node_idx, str->data); + + if(destroy_obj && str) { + mycore_free(str); + return NULL; + } + + return str; +} + +void mycore_string_raw_clean(mycore_string_raw_t* str_raw) +{ + str_raw->length = 0; +} + +void mycore_string_raw_clean_all(mycore_string_raw_t* str_raw) +{ + memset(str_raw, 0, sizeof(mycore_string_raw_t)); +} + +mycore_string_raw_t * mycore_string_raw_destroy(mycore_string_raw_t* str_raw, bool destroy_obj) +{ + if(str_raw == NULL) + return NULL; + + if(str_raw->data) { + mycore_free(str_raw->data); + str_raw->data = NULL; + } + + if(destroy_obj && str_raw) { + mycore_free(str_raw); + return NULL; + } + + return str_raw; +} + +char * mycore_string_realloc(mycore_string_t *str, size_t new_size) +{ + if(str == NULL) + return NULL; + + char *tmp = mchar_async_realloc(str->mchar, str->node_idx, str->data, str->length, new_size); + + if(tmp) { + str->size = new_size; + str->data = tmp; + } + else + return NULL; + + return tmp; +} + +///////////////////////////////////////////////////////// +//// Basic API +//// +///////////////////////////////////////////////////////// +char * mycore_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size) +{ + return mchar_async_malloc(mchar, node_id, size); +} + +char * mycore_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size) +{ + return mchar_async_realloc(mchar, node_id, data, len_to_copy, size); +} + +void mycore_string_data_free(mchar_async_t *mchar, size_t node_id, char *data) +{ + mchar_async_free(mchar, node_id, data); +} + +char * mycore_string_data(mycore_string_t *str) +{ + if(str == NULL) + return NULL; + + return str->data; +} + +size_t mycore_string_length(mycore_string_t *str) +{ + if(str == NULL) + return 0; + + return str->length; +} + +size_t mycore_string_size(mycore_string_t *str) +{ + if(str == NULL) + return 0; + + return str->size; +} + +char * mycore_string_data_set(mycore_string_t *str, char *data) +{ + if(str == NULL) + return NULL; + + str->data = data; + return str->data; +} + +size_t mycore_string_size_set(mycore_string_t *str, size_t size) +{ + if(str == NULL) + return 0; + + str->size = size; + return str->size; +} + +size_t mycore_string_length_set(mycore_string_t *str, size_t length) +{ + if(str == NULL) + return 0; + + str->length = length; + return str->length; +} + +///////////////////////////////////////////////////////// +//// Append API +//// +///////////////////////////////////////////////////////// +void mycore_string_append(mycore_string_t* str, const char* buff, size_t length) +{ + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + memcpy(&str->data[str->length], buff, (sizeof(char) * length)); + + str->length += length; + str->data[str->length] = '\0'; +} + +void mycore_string_append_one(mycore_string_t* str, const char data) +{ + MyCORE_STRING_REALLOC_IF_NEED(str, 2, 1); + MyCORE_STRING_APPEND_BYTE_WITHOUT_REALLOC(data, str); + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC('\0', str); +} + +void mycore_string_append_lowercase(mycore_string_t* str, const char* data, size_t length) +{ + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned char *ref = (unsigned char*)&str->data[str->length]; + const unsigned char *buf = (const unsigned char*)data; + + size_t i; + for(i = 0; i < length; i++) { + ref[i] = mycore_string_chars_lowercase_map[ buf[i] ]; + } + + ref[i] = '\0'; + str->length += length; +} + +void mycore_string_copy(mycore_string_t* dest, mycore_string_t* target) +{ + mycore_string_append(dest, target->data, target->length); +} + +size_t mycore_string_raw_copy(char* str1, const char* str2, size_t size) +{ + str1[size] = '\0'; + + while(size) { + size--; + str1[size] = str2[size]; + } + + return size; +} + +size_t mycore_string_raw_set_replacement_character(mycore_string_t* target, size_t position) +{ + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + target->data[(position)] = (char)0xEF; + target->data[(position + 1)] = (char)0xBF; + target->data[(position + 2)] = (char)0xBD; + + return 3; +} + +void mycore_string_append_with_replacement_null_characters(mycore_string_t* str, const char* buff, size_t length) +{ + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + + unsigned char *data = (unsigned char*)str->data; + const unsigned char *u_buff = (const unsigned char*)buff; + + for (size_t i = 0; i < length; i++) + { + if(u_buff[i] == 0x00) { + mycore_string_realloc(str, (str->size + 5)); + data = (unsigned char*)str->data; + + // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) + data[str->length] = 0xEF; str->length++; + data[str->length] = 0xBF; str->length++; + data[str->length] = 0xBD; + } + else + data[str->length] = u_buff[i]; + + str->length++; + } + + str->data[str->length] = '\0'; +} + +void mycore_string_stay_only_whitespace(mycore_string_t* target) +{ + char *data = target->data; + size_t pos = 0; + + for(size_t i = 0; i < target->length; i++) + { + if(mycore_utils_whithspace(data[i], ==, ||)) { + data[pos] = data[i]; + pos++; + } + } + + target->length = pos; +} + +size_t mycore_string_crop_whitespace_from_begin(mycore_string_t* target) +{ + char *data = target->data; + size_t i; + + for(i = 0; i < target->length; i++) { + if(mycore_utils_whithspace(data[i], !=, &&)) + break; + } + + if(i) + target->data = mchar_async_crop_first_chars_without_cache(target->data, i); + + target->length -= i; + + return i; +} + +size_t mycore_string_whitespace_from_begin(mycore_string_t* target) +{ + char *data = target->data; + size_t i; + + for(i = 0; i < target->length; i++) { + if(mycore_utils_whithspace(data[i], !=, &&)) + break; + } + + return i; +} + + diff --git a/source/mycore/mystring.h b/source/mycore/mystring.h new file mode 100644 index 0000000..30de718 --- /dev/null +++ b/source/mycore/mystring.h @@ -0,0 +1,125 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_MYSTRING_H +#define MyCORE_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" +#include "mycore/utils/mchar_async.h" +#include "mycore/utils.h" + +#define mycore_string_get(str, attr) str->attr +#define mycore_string_set(str, attr) mycore_string_get(str, attr) +#define mycore_string_len(str) mycore_string_get(str, length) + +#define MyCORE_STRING_PREPROCESSOR_CHECK_BUFFER_SIZE(str, unsigned_data) \ + if(str->length >= str->size) { \ + mycore_string_realloc(str, (str->length + 5)); \ + \ + unsigned_data = (unsigned char*)str->data; \ + } + +#define MyCORE_STRING_REALLOC_IF_NEED(str, need_length, upto) \ + if((str->length + need_length) >= str->size) { \ + mycore_string_realloc(str, (str->length + need_length + upto)); \ + } \ + +#define MyCORE_STRING_APPEND_BYTE_WITHOUT_REALLOC(onechar, str) \ + str->data[str->length] = onechar; \ + str->length++ + +#define MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto) \ + if(str->length >= str->size) { \ + mycore_string_realloc(str, (str->length + upto)); \ + } \ + str->data[str->length] = onechar + +#define MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC(onechar, str) \ + str->data[str->length] = onechar + +#define MyCORE_STRING_APPEND_BYTE(onechar, str, upto) \ + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto); \ + str->length++ + +struct mycore_string { + char* data; + size_t size; + size_t length; + + mchar_async_t *mchar; + size_t node_idx; +}; + +struct mycore_string_raw { + char* data; + size_t size; + size_t length; +}; + +typedef size_t mycore_string_index_t; + +char * mycore_string_init(mchar_async_t *mchar, size_t node_idx, mycore_string_t* str, size_t size); +char * mycore_string_realloc(mycore_string_t *str, size_t new_size); + +void mycore_string_clean(mycore_string_t* str); +void mycore_string_clean_all(mycore_string_t* str); +mycore_string_t * mycore_string_destroy(mycore_string_t* str, bool destroy_obj); + +void mycore_string_raw_clean(mycore_string_raw_t* str_raw); +void mycore_string_raw_clean_all(mycore_string_raw_t* str_raw); +mycore_string_raw_t * mycore_string_raw_destroy(mycore_string_raw_t* str_raw, bool destroy_obj); + +/* basic api */ +char * mycore_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); +char * mycore_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); +void mycore_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); + +char * mycore_string_data(mycore_string_t *str); +size_t mycore_string_length(mycore_string_t *str); +size_t mycore_string_size(mycore_string_t *str); +char * mycore_string_data_set(mycore_string_t *str, char *data); +size_t mycore_string_size_set(mycore_string_t *str, size_t size); +size_t mycore_string_length_set(mycore_string_t *str, size_t length); + +/* append */ +void mycore_string_append(mycore_string_t* str, const char* data, size_t length); +void mycore_string_append_one(mycore_string_t* str, const char data); +void mycore_string_append_lowercase(mycore_string_t* str, const char* data, size_t length); +void mycore_string_append_with_replacement_null_characters(mycore_string_t* str, const char* buff, size_t length); + +size_t mycore_string_raw_set_replacement_character(mycore_string_t* target, size_t position); + +/* other functions */ +void mycore_string_copy(mycore_string_t* dest, mycore_string_t* target); +size_t mycore_string_raw_copy(char* str1, const char* str2, size_t size); +void mycore_string_stay_only_whitespace(mycore_string_t* target); +size_t mycore_string_crop_whitespace_from_begin(mycore_string_t* target); +size_t mycore_string_whitespace_from_begin(mycore_string_t* target); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mycore_mystring_h */ diff --git a/source/mycore/mythread.c b/source/mycore/mythread.c new file mode 100644 index 0000000..822fc08 --- /dev/null +++ b/source/mycore/mythread.c @@ -0,0 +1,331 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/mythread.h" + +#ifndef MyCORE_BUILD_WITHOUT_THREADS + +mythread_t * mythread_create(void) +{ + return mycore_calloc(1, sizeof(mythread_t)); +} + +mystatus_t mythread_init(mythread_t *mythread, mythread_type_t type, size_t threads_count, size_t id_increase) +{ + if(threads_count == 0) + return MyCORE_STATUS_ERROR; + + mythread->entries_size = threads_count; + mythread->entries_length = 0; + mythread->id_increase = id_increase; + mythread->type = type; + + mythread->entries = (mythread_entry_t*)mycore_calloc(mythread->entries_size, sizeof(mythread_entry_t)); + if(mythread->entries == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + mythread->attr = mythread_thread_attr_init(mythread); + if(mythread->attr == NULL) + return MyCORE_STATUS_THREAD_ERROR_ATTR_INIT; + + mythread->timespec = mythread_nanosleep_create(mythread); + + return MyCORE_STATUS_OK; +} + +void mythread_clean(mythread_t *mythread) +{ + mythread_thread_attr_clean(mythread, mythread->attr); + mythread_nanosleep_clean(mythread->timespec); + + mythread->sys_last_error = 0; +} + +mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx, bool self_destroy) +{ + if(mythread == NULL) + return NULL; + + if(mythread->entries) { + mythread_resume(mythread, MyTHREAD_OPT_QUIT); + mythread_quit(mythread, before_join, ctx); + mycore_free(mythread->entries); + } + + mythread_thread_attr_destroy(mythread, mythread->attr); + mythread_nanosleep_destroy(mythread->timespec); + + if(self_destroy) { + mycore_free(mythread); + return NULL; + } + + return mythread; +} + +mystatus_t myhread_entry_create(mythread_t *mythread, mythread_process_f process_func, mythread_work_f work_func, mythread_thread_opt_t opt) +{ + mythread->sys_last_error = 0; + + if(mythread->entries_length >= mythread->entries_size) + return MyCORE_STATUS_THREAD_ERROR_NO_SLOTS; + + mythread_entry_t *entry = &mythread->entries[mythread->entries_length]; + + entry->context.mythread = mythread; + entry->context.func = work_func; + entry->context.id = mythread->entries_length; + entry->context.t_count = mythread->entries_size; + entry->context.opt = opt; + entry->context.status = 0; + + entry->context.timespec = mythread_nanosleep_create(mythread); + + entry->context.mutex = mythread_mutex_create(mythread); + if(entry->context.mutex == NULL) + return MyCORE_STATUS_THREAD_ERROR_MUTEX_INIT; + + if(mythread_mutex_wait(mythread, entry->context.mutex)) { + mythread_mutex_close(mythread, entry->context.mutex); + return MyCORE_STATUS_THREAD_ERROR_MUTEX_LOCK; + } + + entry->thread = mythread_thread_create(mythread, process_func, &entry->context); + if(entry->thread == NULL) { + mythread_mutex_close(mythread, entry->context.mutex); + return MyCORE_STATUS_ERROR; + } + + mythread->entries_length++; + + return MyCORE_STATUS_OK; +} + +mythread_id_t myhread_increase_id_by_entry_id(mythread_t* mythread, mythread_id_t thread_id) +{ + return mythread->id_increase + thread_id; +} + +/* + * Global functions, for all threads + */ +mystatus_t mythread_join(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx) +{ + for (size_t i = 0; i < mythread->entries_length; i++) { + if(before_join) + before_join(mythread, &mythread->entries[i], ctx); + + if(mythread_thread_join(mythread, mythread->entries[i].thread)) + return MyCORE_STATUS_ERROR; + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_quit(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx) +{ + mythread_option_set(mythread, MyTHREAD_OPT_QUIT); + + for (size_t i = 0; i < mythread->entries_length; i++) + { + if(before_join) + before_join(mythread, &mythread->entries[i], ctx); + + if(mythread_thread_join(mythread, mythread->entries[i].thread) || + mythread_thread_destroy(mythread, mythread->entries[i].thread)) + { + return MyCORE_STATUS_ERROR; + } + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_stop(mythread_t *mythread) +{ + if(mythread->opt & MyTHREAD_OPT_STOP) + return MyCORE_STATUS_OK; + + mythread_option_set(mythread, MyTHREAD_OPT_STOP); + + for (size_t i = 0; i < mythread->entries_length; i++) + { + while((mythread->entries[i].context.opt & MyTHREAD_OPT_STOP) == 0) { + mythread_nanosleep_sleep(mythread->timespec); + } + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_suspend(mythread_t *mythread) +{ + if(mythread->opt & MyTHREAD_OPT_WAIT) + return MyCORE_STATUS_OK; + + mythread_option_set(mythread, MyTHREAD_OPT_WAIT); + + for (size_t i = 0; i < mythread->entries_length; i++) + { + while((mythread->entries[i].context.opt & MyTHREAD_OPT_STOP) == 0 && + (mythread->entries[i].context.opt & MyTHREAD_OPT_WAIT) == 0) + { + mythread_nanosleep_sleep(mythread->timespec); + } + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_resume(mythread_t *mythread, mythread_thread_opt_t send_opt) +{ + if(mythread->opt & MyTHREAD_OPT_WAIT) { + mythread_option_set(mythread, send_opt); + return MyCORE_STATUS_OK; + } + + mythread_option_set(mythread, send_opt); + + for (size_t i = 0; i < mythread->entries_length; i++) + { + if(mythread->entries[i].context.opt & MyTHREAD_OPT_STOP) { + mythread->entries[i].context.opt = send_opt; + + if(mythread_mutex_post(mythread, mythread->entries[i].context.mutex)) + return MyCORE_STATUS_ERROR; + } + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_check_status(mythread_t *mythread) +{ + for (size_t i = 0; i < mythread->entries_length; i++) + { + if(mythread->entries[i].context.status) + return mythread->entries[i].context.status; + } + + return MyCORE_STATUS_OK; +} + +mythread_thread_opt_t mythread_option(mythread_t *mythread) +{ + return mythread->opt; +} + +void mythread_option_set(mythread_t *mythread, mythread_thread_opt_t opt) +{ + mythread->opt = opt; +} + +/* + * Entries functions, for all threads + */ +mystatus_t mythread_entry_join(mythread_entry_t* entry, mythread_callback_before_entry_join_f before_join, void* ctx) +{ + if(before_join) + before_join(entry->context.mythread, entry, ctx); + + if(mythread_thread_join(entry->context.mythread, entry->thread)) + return MyCORE_STATUS_ERROR; + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_entry_quit(mythread_entry_t* entry, mythread_callback_before_entry_join_f before_join, void* ctx) +{ + if(before_join) + before_join(entry->context.mythread, entry, ctx); + + if(mythread_thread_join(entry->context.mythread, entry->thread) || + mythread_thread_destroy(entry->context.mythread, entry->thread)) + { + return MyCORE_STATUS_ERROR; + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_entry_stop(mythread_entry_t* entry) +{ + if(entry->context.opt & MyTHREAD_OPT_STOP) + return MyCORE_STATUS_OK; + + entry->context.opt = MyTHREAD_OPT_STOP; + + while((entry->context.opt & MyTHREAD_OPT_STOP) == 0) { + mythread_nanosleep_sleep(entry->context.mythread->timespec); + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_entry_suspend(mythread_entry_t* entry) +{ + if(entry->context.opt & MyTHREAD_OPT_WAIT) + return MyCORE_STATUS_OK; + + entry->context.opt = MyTHREAD_OPT_WAIT; + + while((entry->context.opt & MyTHREAD_OPT_STOP) == 0 && (entry->context.opt & MyTHREAD_OPT_WAIT) == 0) { + mythread_nanosleep_sleep(entry->context.mythread->timespec); + } + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_entry_resume(mythread_entry_t* entry, mythread_thread_opt_t send_opt) +{ + if(entry->context.opt & MyTHREAD_OPT_WAIT) { + entry->context.opt = send_opt; + } + else if(entry->context.opt & MyTHREAD_OPT_STOP) { + entry->context.opt = send_opt; + + if(mythread_mutex_post(entry->context.mythread, entry->context.mutex)) + return MyCORE_STATUS_ERROR; + } + else + entry->context.opt = send_opt; + + return MyCORE_STATUS_OK; +} + +mystatus_t mythread_entry_status(mythread_entry_t* entry) +{ + return entry->context.status; +} + +mythread_t * mythread_entry_mythread(mythread_entry_t* entry) +{ + return entry->context.mythread; +} + +/* Callbacks */ +void mythread_callback_quit(mythread_t* mythread, mythread_entry_t* entry, void* ctx) +{ + while((entry->context.opt & MyTHREAD_OPT_QUIT) == 0) + mythread_nanosleep_sleep(mythread->timespec); +} + +#endif + diff --git a/source/mycore/mythread.h b/source/mycore/mythread.h new file mode 100644 index 0000000..5142c25 --- /dev/null +++ b/source/mycore/mythread.h @@ -0,0 +1,159 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_THREAD_H +#define MyCORE_THREAD_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" +#include "mycore/mystring.h" + +#ifdef MyCORE_BUILD_WITHOUT_THREADS + +struct mythread { + int sys_last_error; +}; + +#else +/* functions */ +typedef void (*mythread_callback_before_entry_join_f)(mythread_t* mythread, mythread_entry_t* entry, void* ctx); +typedef void * (*mythread_process_f)(void* arg); +typedef void (*mythread_work_f)(mythread_id_t thread_id, void* arg); + +void * mythread_function_queue_stream(void *arg); +void * mythread_function_queue_batch(void *arg); +void * mythread_function(void *arg); + +enum mythread_thread_opt { + MyTHREAD_OPT_UNDEF = 0x00, + MyTHREAD_OPT_WAIT = 0x01, + MyTHREAD_OPT_QUIT = 0x02, + MyTHREAD_OPT_STOP = 0x04, + MyTHREAD_OPT_DONE = 0x08 +} +typedef mythread_thread_opt_t; + +enum mythread_type { + MyTHREAD_TYPE_STREAM = 0x00, + MyTHREAD_TYPE_BATCH = 0x01 +} +typedef mythread_type_t; + +// thread +struct mythread_context { + mythread_id_t id; + mythread_work_f func; + + volatile size_t t_count; + volatile mythread_thread_opt_t opt; + + mystatus_t status; + + void* mutex; + void* timespec; + mythread_t* mythread; +}; + +struct mythread_entry { + void* thread; + + mythread_context_t context; + mythread_process_f process_func; +}; + +struct mythread { + mythread_entry_t *entries; + size_t entries_length; + size_t entries_size; + size_t id_increase; + + void* context; + void* attr; + void* timespec; + + int sys_last_error; + + mythread_type_t type; + volatile mythread_thread_opt_t opt; +}; + +mythread_t * mythread_create(void); +mystatus_t mythread_init(mythread_t *mythread, mythread_type_t type, size_t threads_count, size_t id_increase); +void mythread_clean(mythread_t *mythread); +mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx, bool self_destroy); + +mythread_id_t myhread_increase_id_by_entry_id(mythread_t* mythread, mythread_id_t thread_id); + +/* set for all threads */ +mystatus_t mythread_join(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_quit(mythread_t *mythread, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_stop(mythread_t *mythread); +mystatus_t mythread_resume(mythread_t *mythread, mythread_thread_opt_t send_opt); +mystatus_t mythread_suspend(mythread_t *mythread); +mystatus_t mythread_check_status(mythread_t *mythread); + +mythread_thread_opt_t mythread_option(mythread_t *mythread); +void mythread_option_set(mythread_t *mythread, mythread_thread_opt_t opt); + +/* Entries */ +mystatus_t myhread_entry_create(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt); + +mystatus_t mythread_entry_join(mythread_entry_t* entry, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_entry_quit(mythread_entry_t* entry, mythread_callback_before_entry_join_f before_join, void* ctx); +mystatus_t mythread_entry_stop(mythread_entry_t* entry); +mystatus_t mythread_entry_resume(mythread_entry_t* entry, mythread_thread_opt_t send_opt); +mystatus_t mythread_entry_suspend(mythread_entry_t* entry); +mystatus_t mythread_entry_status(mythread_entry_t* entry); +mythread_t * mythread_entry_mythread(mythread_entry_t* entry); + +/* API for ports */ +void * mythread_thread_create(mythread_t *mythread, mythread_process_f process_func, void* ctx); +mystatus_t mythread_thread_join(mythread_t *mythread, void* thread); +mystatus_t mythread_thread_cancel(mythread_t *mythread, void* thread); +mystatus_t mythread_thread_destroy(mythread_t *mythread, void* thread); + +void * mythread_thread_attr_init(mythread_t *mythread); +void mythread_thread_attr_clean(mythread_t *mythread, void* attr); +void mythread_thread_attr_destroy(mythread_t *mythread, void* attr); + +void * mythread_mutex_create(mythread_t *mythread); +mystatus_t mythread_mutex_post(mythread_t *mythread, void* mutex); +mystatus_t mythread_mutex_wait(mythread_t *mythread, void* mutex); +void mythread_mutex_close(mythread_t *mythread, void* mutex); + +void * mythread_nanosleep_create(mythread_t* mythread); +void mythread_nanosleep_clean(void* timespec); +void mythread_nanosleep_destroy(void* timespec); +mystatus_t mythread_nanosleep_sleep(void* timespec); + +/* callback */ +void mythread_callback_quit(mythread_t* mythread, mythread_entry_t* entry, void* ctx); + +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_THREAD_H */ diff --git a/source/mycore/perf.h b/source/mycore/perf.h new file mode 100644 index 0000000..0e878a1 --- /dev/null +++ b/source/mycore/perf.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_PERF_H +#define MyCORE_PERF_H +#pragma once + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" + +#ifdef MyCORE_WITH_PERF +void * mycore_perf_create(void); +void mycore_perf_clean(void* perf); +void mycore_perf_destroy(void* perf); + +mycore_status_t myhtml_perf_begin(void* perf); +mycore_status_t myhtml_perf_end(void* perf); +double myhtml_perf_in_sec(void* perf); + +unsigned long long mycore_perf_clock(void); +unsigned long long mycore_perf_frequency(void); +#endif /* MyCORE_WITH_PERF */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_PERF_H */ diff --git a/source/mycore/thread_queue.c b/source/mycore/thread_queue.c new file mode 100644 index 0000000..4532c6b --- /dev/null +++ b/source/mycore/thread_queue.c @@ -0,0 +1,654 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/thread_queue.h" + +mythread_queue_t * mythread_queue_create(void) +{ + return mycore_calloc(1, sizeof(mythread_queue_t)); +} + +mystatus_t mythread_queue_init(mythread_queue_t* queue, size_t size) +{ + if(size < 32) + size = 32; + + queue->nodes_pos_size = 512; + queue->nodes_size = size; + queue->nodes = (mythread_queue_node_t**)mycore_calloc(queue->nodes_pos_size, sizeof(mythread_queue_node_t*)); + + if(queue->nodes == NULL) + return MyCORE_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; + + queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)mycore_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); + + if(queue->nodes[queue->nodes_pos] == NULL) { + queue->nodes = mycore_free(queue->nodes); + return MyCORE_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; + } + + return MyCORE_STATUS_OK; +} + +void mythread_queue_clean(mythread_queue_t* queue) +{ + queue->nodes_length = 0; + queue->nodes_pos = 0; + queue->nodes_root = 0; + queue->nodes_uses = 0; +} + +mythread_queue_t * mythread_queue_destroy(mythread_queue_t* queue) +{ + if(queue == NULL) + return NULL; + + if(queue->nodes) { + /* '<=' it is normal */ + for (size_t i = 0; i <= queue->nodes_pos; i++) { + mycore_free(queue->nodes[i]); + } + + mycore_free(queue->nodes); + } + + mycore_free(queue); + + return NULL; +} + +void mythread_queue_node_clean(mythread_queue_node_t* qnode) +{ + memset(qnode, 0, sizeof(mythread_queue_node_t)); +} + +mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode) +{ + return qnode->prev; +} + +mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue) +{ + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue) +{ + return &queue->nodes[0][0]; +} + +size_t mythread_queue_count_used_node(mythread_queue_t* queue) +{ + return queue->nodes_uses; +} + +mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, mystatus_t *status) +{ + queue->nodes_length++; + + if(queue->nodes_length >= queue->nodes_size) + { + queue->nodes_pos++; + + if(queue->nodes_pos >= queue->nodes_pos_size) + { +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(mythread) + mythread_queue_list_wait_for_done(mythread, mythread->context); +#endif + size_t new_size = queue->nodes_pos_size + 512; + mythread_queue_node_t** tmp = mycore_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * new_size); + + if(tmp) { + memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (new_size - queue->nodes_pos)); + + queue->nodes = tmp; + queue->nodes_pos_size = new_size; + } + else { + if(status) + *status = MyCORE_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; + + return NULL; + } + } + + if(queue->nodes[queue->nodes_pos] == NULL) { + queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)mycore_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); + + if(queue->nodes[queue->nodes_pos] == NULL) { + if(status) + *status = MyCORE_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; + + return NULL; + } + } + + queue->nodes_length = 0; + } + + queue->nodes_uses++; + + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, mystatus_t *status) +{ + queue->nodes_length++; + + if(queue->nodes_uses >= limit) { + queue->nodes_uses++; + +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(mythread) + mythread_queue_list_wait_for_done(mythread, mythread->context); +#endif + queue->nodes_length = 0; + queue->nodes_pos = 0; + queue->nodes_root = 0; + queue->nodes_uses = 0; + } + else if(queue->nodes_length >= queue->nodes_size) + { + queue->nodes_pos++; + + if(queue->nodes_pos >= queue->nodes_pos_size) + { +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(mythread) + mythread_queue_list_wait_for_done(mythread, mythread->context); +#endif + size_t new_size = queue->nodes_pos_size + 512; + mythread_queue_node_t** tmp = mycore_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * new_size); + + if(tmp) { + memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (new_size - queue->nodes_pos)); + + queue->nodes = tmp; + queue->nodes_pos_size = new_size; + } + else { + if(status) + *status = MyCORE_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; + + return NULL; + } + } + + if(queue->nodes[queue->nodes_pos] == NULL) { + queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)mycore_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); + + if(queue->nodes[queue->nodes_pos] == NULL) { + if(status) + *status = MyCORE_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; + + return NULL; + } + } + + queue->nodes_length = 0; + } + + queue->nodes_uses++; + + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, mystatus_t *status) +{ + mythread_queue_t* queue = entry->queue; + + queue->nodes_length++; + + if(queue->nodes_length >= queue->nodes_size) { + queue->nodes_uses++; + +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(mythread) + mythread_queue_list_entry_wait_for_done(mythread, entry); +#endif + + mythread_queue_list_entry_clean(entry); + } + else + queue->nodes_uses++; + + return &queue->nodes[queue->nodes_pos][queue->nodes_length]; +} +#endif + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +/* + * Queue List + */ +mythread_queue_list_t * mythread_queue_list_create(mystatus_t *status) +{ + return (mythread_queue_list_t*)mycore_calloc(1, sizeof(mythread_queue_list_t)); +} + +void mythread_queue_list_destroy(mythread_queue_list_t* queue_list) +{ + if(queue_list == NULL) + return; + + mycore_free(queue_list); +} + +size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list) +{ + return queue_list->count; +} + +void mythread_queue_list_wait_for_done(mythread_t* mythread, mythread_queue_list_t* queue_list) +{ + if(queue_list == NULL) + return; + + mythread_queue_list_entry_t *entry = queue_list->first; + + while(entry) + { + for (size_t i = 0; i < mythread->entries_length; i++) { + while(entry->thread_param[i].use < entry->queue->nodes_uses) + mythread_nanosleep_sleep(mythread->timespec); + } + + entry = entry->next; + } +} + +bool mythread_queue_list_see_for_done(mythread_t* mythread, mythread_queue_list_t* queue_list) +{ + if(queue_list == NULL) + return true; + + mythread_queue_list_entry_t *entry = queue_list->first; + + while(entry) + { + for (size_t i = 0; i < mythread->entries_length; i++) { + if(entry->thread_param[i].use < entry->queue->nodes_uses) + return false; + } + + entry = entry->next; + } + + return true; +} + +bool mythread_queue_list_see_for_done_by_thread(mythread_t* mythread, mythread_queue_list_t* queue_list, mythread_id_t thread_id) +{ + if(queue_list == NULL) + return true; + + mythread_queue_list_entry_t *entry = queue_list->first; + + while(entry) + { + if(entry->thread_param[thread_id].use < entry->queue->nodes_uses) + return false; + + entry = entry->next; + } + + return true; +} + +/* + * Queue List Entry + */ +mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t** mythread_list, size_t list_size, mythread_queue_list_t* queue_list, + mythread_queue_t* queue, size_t thread_param_size, mystatus_t* status) +{ + if(status) + *status = MyCORE_STATUS_OK; + + /* create new entry */ + mythread_queue_list_entry_t* entry = (mythread_queue_list_entry_t*)mycore_calloc(1, sizeof(mythread_queue_list_entry_t)); + if(entry == NULL) { + if(status) + *status = MyCORE_STATUS_THREAD_ERROR_QUEUE_MALLOC; + + return NULL; + } + + /* create thread params */ + entry->thread_param_size = thread_param_size; + + if(thread_param_size) { + entry->thread_param = (mythread_queue_thread_param_t*)mycore_calloc(thread_param_size, sizeof(mythread_queue_thread_param_t)); + + if(entry->thread_param == NULL) { + mycore_free(entry); + + if(status) + *status = MyCORE_STATUS_THREAD_ERROR_QUEUE_MALLOC; + + return NULL; + } + } + else + entry->thread_param = NULL; + + entry->queue = queue; + + for(size_t i = 0; i < list_size; i++) { + if(mythread_list[i]->type == MyTHREAD_TYPE_BATCH) { + mythread_queue_list_entry_make_batch(mythread_list[i], entry, mythread_list[i]->id_increase, mythread_list[i]->entries_length); + } + + if(mythread_list[i]) + mythread_suspend(mythread_list[i]); + } + + if(queue_list->first) { + queue_list->last->next = entry; + entry->prev = queue_list->last; + + queue_list->last = entry; + } + else { + queue_list->first = entry; + queue_list->last = entry; + } + + queue_list->count++; + + for(size_t i = 0; i < list_size; i++) + if(mythread_list[i]) + mythread_resume(mythread_list[i], MyTHREAD_OPT_UNDEF); + + return entry; +} + +mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t** mythread_list, size_t list_size, mythread_queue_list_t *queue_list, mythread_queue_list_entry_t *entry, bool destroy_queue) +{ + for(size_t i = 0; i < list_size; i++) + if(mythread_list[i]) + mythread_suspend(mythread_list[i]); + + mythread_queue_list_entry_t *next = entry->next; + mythread_queue_list_entry_t *prev = entry->prev; + + if(prev) + prev->next = next; + + if(next) + next->prev = prev; + + if(queue_list->first == entry) + queue_list->first = next; + + if(queue_list->last == entry) + queue_list->last = prev; + + queue_list->count--; + + for(size_t i = 0; i < list_size; i++) + if(mythread_list[i]) + mythread_resume(mythread_list[i], MyTHREAD_OPT_UNDEF); + + if(destroy_queue && entry->queue) + mythread_queue_destroy(entry->queue); + + if(entry->thread_param) + mycore_free(entry->thread_param); + + mycore_free(entry); + + return NULL; +} + +void mythread_queue_list_entry_clean(mythread_queue_list_entry_t *entry) +{ + if(entry == NULL) + return; + + mythread_queue_clean(entry->queue); + + for (size_t i = 0; i < entry->thread_param_size; i++) { + memset(&entry->thread_param[i], 0, sizeof(mythread_queue_thread_param_t)); + } +} + +void mythread_queue_list_entry_wait_for_done(mythread_t* mythread, mythread_queue_list_entry_t *entry) +{ + if(entry == NULL) + return; + + for(size_t i = 0; i < entry->thread_param_size; i++) { + while(entry->thread_param[i].use < entry->queue->nodes_uses) + mythread_nanosleep_sleep(mythread->timespec); + } +} + +bool mythread_queue_list_entry_see_for_done(mythread_queue_list_entry_t *entry) +{ + if(entry == NULL) + return true; + + for(size_t i = 0; i < entry->thread_param_size; i++) { + if(entry->thread_param[i].use < entry->queue->nodes_uses) + return false; + } + + return true; +} + +void mythread_queue_list_entry_make_batch(mythread_t* mythread, mythread_queue_list_entry_t* entry, size_t from, size_t count) +{ + size_t i = 0; + while(from <= count) { + entry->thread_param[from].use = i; + i++; from++; + } +} + +/* + * Thread Process Functions + */ +bool mythread_function_see_opt(mythread_context_t *ctx, volatile mythread_thread_opt_t opt, mythread_id_t thread_id, size_t done_count, void* timeout) +{ + mythread_t *mythread = ctx->mythread; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; + + if(done_count != queue_list->count) + return false; + + if(opt & MyTHREAD_OPT_STOP) + { + if(mythread_queue_list_see_for_done_by_thread(mythread, queue_list, thread_id)) + { + ctx->opt = MyTHREAD_OPT_STOP; + mythread_mutex_wait(mythread, ctx->mutex); + ctx->opt = MyTHREAD_OPT_UNDEF; + + return false; + } + } + else if(opt & MyTHREAD_OPT_QUIT) + { + if(mythread_queue_list_see_for_done_by_thread(mythread, queue_list, thread_id)) + { + mythread_mutex_close(mythread, ctx->mutex); + mythread_nanosleep_destroy(ctx->timespec); + + ctx->opt = MyTHREAD_OPT_QUIT; + return true; + } + } + + mythread_nanosleep_sleep(timeout); + + return false; +} + +void * mythread_function_queue_batch(void *arg) +{ + mythread_context_t *ctx = (mythread_context_t*)arg; + mythread_t *mythread = ctx->mythread; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; + mythread_id_t thread_id = myhread_increase_id_by_entry_id(mythread, ctx->id); + + mythread_mutex_wait(mythread, ctx->mutex); + + do { + if(mythread->opt & MyTHREAD_OPT_WAIT) { + ctx->opt = MyTHREAD_OPT_WAIT; + + while (mythread->opt & MyTHREAD_OPT_WAIT) + mythread_nanosleep_sleep(ctx->timespec); + + ctx->opt = MyTHREAD_OPT_UNDEF; + } + + mythread_queue_list_entry_t *entry = queue_list->first; + size_t done_count = 0; + + while(entry) + { + mythread_queue_thread_param_t *thread_param = &entry->thread_param[ thread_id ]; + + if(thread_param->use < entry->queue->nodes_uses) + { + size_t pos = thread_param->use / entry->queue->nodes_size; + size_t len = thread_param->use % entry->queue->nodes_size; + + mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; + + //if((qnode->tree->flags & MyCORE_TREE_FLAGS_SINGLE_MODE) == 0) + ctx->func(ctx->id, (void*)qnode); + + thread_param->use += mythread->entries_length; + } + else + done_count++; + + entry = entry->next; + } + + if(done_count == queue_list->count && + mythread_function_see_opt(ctx, mythread->opt, thread_id, done_count, ctx->timespec)) + { + break; + } + } + while (1); + + return NULL; +} + +void * mythread_function_queue_stream(void *arg) +{ + mythread_context_t *ctx = (mythread_context_t*)arg; + mythread_t * mythread = ctx->mythread; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; + mythread_id_t thread_id = myhread_increase_id_by_entry_id(mythread, ctx->id); + + mythread_mutex_wait(mythread, ctx->mutex); + + do { + if(mythread->opt & MyTHREAD_OPT_WAIT) { + ctx->opt = MyTHREAD_OPT_WAIT; + + while (mythread->opt & MyTHREAD_OPT_WAIT) { + mythread_nanosleep_sleep(ctx->timespec); + } + + ctx->opt = MyTHREAD_OPT_UNDEF; + } + + mythread_queue_list_entry_t *entry = queue_list->first; + size_t done_count = 0; + + while(entry) + { + mythread_queue_thread_param_t *thread_param = &entry->thread_param[ thread_id ]; + + if(thread_param->use < entry->queue->nodes_uses) + { + size_t pos = thread_param->use / entry->queue->nodes_size; + size_t len = thread_param->use % entry->queue->nodes_size; + + mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; + + //if((qnode->tree->flags & MyCORE_TREE_FLAGS_SINGLE_MODE) == 0) + ctx->func(ctx->id, (void*)qnode); + + thread_param->use++; + } + else + done_count++; + + entry = entry->next; + } + + if(done_count == queue_list->count && + mythread_function_see_opt(ctx, mythread->opt, thread_id, done_count, ctx->timespec)) + { + break; + } + } + while(1); + + return NULL; +} + +void * mythread_function(void *arg) +{ + mythread_context_t *ctx = (mythread_context_t*)arg; + mythread_t * mythread = ctx->mythread; + + mythread_mutex_wait(mythread, ctx->mutex); + + do { + ctx->func(ctx->id, ctx); + + ctx->opt |= MyTHREAD_OPT_DONE; + + if(ctx->opt & MyTHREAD_OPT_WAIT) { + while (ctx->opt & MyTHREAD_OPT_WAIT) { + mythread_nanosleep_sleep(ctx->timespec); + } + } + else { + ctx->opt |= MyTHREAD_OPT_STOP; + mythread_mutex_wait(mythread, ctx->mutex); + } + + if(mythread->opt & MyTHREAD_OPT_QUIT || ctx->opt & MyTHREAD_OPT_QUIT) + { + mythread_mutex_close(mythread, ctx->mutex); + mythread_nanosleep_destroy(ctx->timespec); + + ctx->opt = MyTHREAD_OPT_QUIT; + break; + } + + ctx->opt = MyTHREAD_OPT_UNDEF; + } + while(1); + + return NULL; +} + +#endif diff --git a/source/mycore/thread_queue.h b/source/mycore/thread_queue.h new file mode 100644 index 0000000..789b708 --- /dev/null +++ b/source/mycore/thread_queue.h @@ -0,0 +1,110 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_THREAD_QUEUE_H +#define MyCORE_THREAD_QUEUE_H +#pragma once + +#include "mycore/myosi.h" +#include "mycore/mythread.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// queue +struct mythread_queue_node { + void* context; + void* args; + + mythread_queue_node_t* prev; +}; + +struct mythread_queue_thread_param { + volatile size_t use; +}; + +struct mythread_queue_list_entry { + mythread_queue_t* queue; + mythread_queue_thread_param_t* thread_param; + size_t thread_param_size; + + mythread_queue_list_entry_t* next; + mythread_queue_list_entry_t* prev; +}; + +struct mythread_queue_list { + mythread_queue_list_entry_t *first; + mythread_queue_list_entry_t *last; + + volatile size_t count; +}; + +struct mythread_queue { + mythread_queue_node_t **nodes; + + size_t nodes_pos; + size_t nodes_pos_size; + size_t nodes_length; + + volatile size_t nodes_uses; + volatile size_t nodes_size; + volatile size_t nodes_root; +}; + +mythread_queue_t * mythread_queue_create(void); +mystatus_t mythread_queue_init(mythread_queue_t* queue, size_t size); +void mythread_queue_clean(mythread_queue_t* queue); +mythread_queue_t * mythread_queue_destroy(mythread_queue_t* token); + +void mythread_queue_node_clean(mythread_queue_node_t* qnode); +size_t mythread_queue_count_used_node(mythread_queue_t* queue); + +mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue); +mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode); +mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue); + +mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, mystatus_t *status); +mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, mystatus_t *status); +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, mystatus_t *status); +#endif + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mythread_queue_list_t * mythread_queue_list_create(mystatus_t *status); +void mythread_queue_list_destroy(mythread_queue_list_t* queue_list); +size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list); + +void mythread_queue_list_wait_for_done(mythread_t* mythread, mythread_queue_list_t* queue_list); +bool mythread_queue_list_see_for_done(mythread_t* mythread, mythread_queue_list_t* queue_list); +bool mythread_queue_list_see_for_done_by_thread(mythread_t* mythread, mythread_queue_list_t* queue_list, mythread_id_t thread_id); + +mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t** mythread_list, size_t list_size, mythread_queue_list_t* queue_list, mythread_queue_t* queue, size_t thread_param_size, mystatus_t* status); +mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t** mythread_list, size_t list_size, mythread_queue_list_t *queue_list, mythread_queue_list_entry_t *entry, bool destroy_queue); +void mythread_queue_list_entry_clean(mythread_queue_list_entry_t *entry); +void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry); +void mythread_queue_list_entry_make_batch(mythread_t* mythread, mythread_queue_list_entry_t* entry, size_t from, size_t length); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_THREAD_QUEUE_H */ diff --git a/source/mycore/utils.c b/source/mycore/utils.c new file mode 100644 index 0000000..c91fc2c --- /dev/null +++ b/source/mycore/utils.c @@ -0,0 +1,183 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils.h" +#include "mycore/utils/resources.h" + +size_t mycore_power(size_t t, size_t k) +{ + size_t res = 1; + + while (k) { + if(k & 1) res *= t; + t *= t; + k >>= 1; + } + + return res; +} + +size_t mycore_strncasecmp(const char* str1, const char* str2, size_t size) +{ + if(str1 == NULL || str2 == NULL) { + if(str1 == str2) + return 0; + + return 1; + } + + const unsigned char *ustr1 = (const unsigned char *)str1; + const unsigned char *ustr2 = (const unsigned char *)str2; + + size_t i = 0; + while (i < size) { + if(mycore_string_chars_lowercase_map[*ustr1] != mycore_string_chars_lowercase_map[*ustr2]) + return (size - i); + + ustr1++; + ustr2++; + + i++; + } + + return 0; +} + +size_t mycore_strcasecmp(const char* str1, const char* str2) +{ + if(str1 == NULL || str2 == NULL) { + if(str1 == str2) + return 0; + + return 1; + } + + const unsigned char *ustr1 = (const unsigned char *)str1; + const unsigned char *ustr2 = (const unsigned char *)str2; + + for (size_t i = 0;;) + { + if(mycore_string_chars_lowercase_map[*ustr1] != mycore_string_chars_lowercase_map[*ustr2]) + return (i + 1); + + if(*ustr1 == '\0') + return 0; + + ustr1++; + ustr2++; + + i++; + } +} + +size_t mycore_strncmp(const char* str1, const char* str2, size_t size) +{ + if(str1 == NULL || str2 == NULL) { + if(str1 == str2) + return 0; + + return 1; + } + + const unsigned char *ustr1 = (const unsigned char *)str1; + const unsigned char *ustr2 = (const unsigned char *)str2; + + size_t i = 0; + while (i < size) { + if(*ustr1 != *ustr2) + return (size - i); + + ustr1++; + ustr2++; + + i++; + } + + return 0; +} + +size_t mycore_strcmp(const char* str1, const char* str2) +{ + if(str1 == NULL || str2 == NULL) { + if(str1 == str2) + return 0; + + return 1; + } + + const unsigned char *ustr1 = (const unsigned char *)str1; + const unsigned char *ustr2 = (const unsigned char *)str2; + + for (size_t i = 0;;) + { + if(*ustr1 != *ustr2) + return (i + 1); + + if(*ustr1 == '\0') + return 0; + + ustr1++; + ustr2++; + + i++; + } +} + +size_t mycore_strcmp_ws(const char* str1, const char* str2) +{ + if(str1 == NULL || str2 == NULL) { + if(str1 == str2) + return 0; + + return 1; + } + + const unsigned char *ustr1 = (const unsigned char *)str1; + const unsigned char *ustr2 = (const unsigned char *)str2; + + for (size_t i = 0;;) + { + if(*ustr1 != *ustr2) + return (i + 1); + + if(mycore_utils_whithspace(*ustr1, ==, ||) || *ustr1 == '\0') + return 0; + + ustr1++; + ustr2++; + + i++; + } +} + +bool mycore_ustrcasecmp_without_checks_by_secondary(const unsigned char* ustr1, const unsigned char* ustr2) +{ + while (*ustr1 != '\0') { + if(mycore_string_chars_lowercase_map[*ustr1] != mycore_string_chars_lowercase_map[*ustr2]) + return false; + + ustr1++; + ustr2++; + } + + return true; +} + + diff --git a/source/mycore/utils.h b/source/mycore/utils.h new file mode 100644 index 0000000..f926cb7 --- /dev/null +++ b/source/mycore/utils.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_H +#define MyCORE_UTILS_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" + +#define mycore_utils_whithspace(onechar, action, logic) \ + (onechar action ' ' logic \ + onechar action '\t' logic \ + onechar action '\n' logic \ + onechar action '\f' logic \ + onechar action '\r') + +size_t mycore_power(size_t t, size_t k); +size_t mycore_strncasecmp(const char* str1, const char* str2, size_t size); +size_t mycore_strcasecmp(const char* str1, const char* str2); +size_t mycore_strncmp(const char* str1, const char* str2, size_t size); +size_t mycore_strcmp(const char* str1, const char* str2); +size_t mycore_strcmp_ws(const char* str1, const char* str2); +bool mycore_ustrcasecmp_without_checks_by_secondary(const unsigned char* ustr1, const unsigned char* ustr2); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* utils_h */ diff --git a/source/mycore/utils/avl_tree.c b/source/mycore/utils/avl_tree.c new file mode 100644 index 0000000..d9d4e39 --- /dev/null +++ b/source/mycore/utils/avl_tree.c @@ -0,0 +1,353 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/avl_tree.h" + +mycore_utils_avl_tree_t * mycore_utils_avl_tree_create(void) +{ + return (mycore_utils_avl_tree_t*)mycore_calloc(1, sizeof(mycore_utils_avl_tree_t)); +} + +mystatus_t mycore_utils_avl_tree_init(mycore_utils_avl_tree_t* avl_tree) +{ + /* for raw declaration style */ + avl_tree->mc_nodes = mcobject_create(); + if(avl_tree->mc_nodes == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + mystatus_t mycore_status = mcobject_init(avl_tree->mc_nodes, 256, sizeof(mycore_utils_avl_tree_node_t)); + if(mycore_status) + return MyCORE_STATUS_ERROR; + + return MyCORE_STATUS_OK; +} + +void mycore_utils_avl_tree_clean(mycore_utils_avl_tree_t* avl_tree) +{ + mcobject_clean(avl_tree->mc_nodes); +} + +mycore_utils_avl_tree_t * mycore_utils_avl_tree_destroy(mycore_utils_avl_tree_t* avl_tree, bool self_destroy) +{ + if(avl_tree == NULL) + return NULL; + + mcobject_destroy(avl_tree->mc_nodes, true); + + if(self_destroy) { + mycore_free(avl_tree); + return NULL; + } + + return avl_tree; +} + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_node_create_root(mycore_utils_avl_tree_t* avl_tree, size_t type, void* value) +{ + mycore_utils_avl_tree_node_t *node = mcobject_malloc(avl_tree->mc_nodes, NULL); + memset(node, 0, sizeof(mycore_utils_avl_tree_node_t)); + + node->type = type; + node->value = value; + + return node; +} + +void mycore_utils_avl_tree_node_clean(mycore_utils_avl_tree_node_t* node) +{ + memset(node, 0, sizeof(mycore_utils_avl_tree_node_t)); +} + +short mycore_utils_avl_tree_node_height(mycore_utils_avl_tree_node_t* node) +{ + return (node ? node->height : 0); +} + +short mycore_utils_avl_tree_node_balance_factor(mycore_utils_avl_tree_node_t* node) +{ + return (mycore_utils_avl_tree_node_height(node->right) - mycore_utils_avl_tree_node_height(node->left)); +} + +void mycore_utils_avl_tree_node_set_height(mycore_utils_avl_tree_node_t* node) +{ + short left_height = mycore_utils_avl_tree_node_height(node->left); + short right_height = mycore_utils_avl_tree_node_height(node->right); + + node->height = (left_height > right_height ? left_height : right_height) + 1; +} + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_node_rotate_right(mycore_utils_avl_tree_node_t* pos) +{ + mycore_utils_avl_tree_node_t* node = pos->left; + + node->parent = pos->parent; + + if(node->right) + node->right->parent = pos; + + pos->left = node->right; + pos->parent = node; + + node->right = pos; + + mycore_utils_avl_tree_node_set_height(pos); + mycore_utils_avl_tree_node_set_height(node); + + return node; +} + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_node_rotate_left(mycore_utils_avl_tree_node_t* pos) +{ + mycore_utils_avl_tree_node_t* node = pos->right; + + node->parent = pos->parent; + + if(node->left) + node->left->parent = pos; + + pos->right = node->left; + pos->parent = node; + + node->left = pos; + + mycore_utils_avl_tree_node_set_height(pos); + mycore_utils_avl_tree_node_set_height(node); + + return node; +} + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_node_balance(mycore_utils_avl_tree_node_t* node, mycore_utils_avl_tree_node_t** root) +{ + /* set height */ + short left_height = mycore_utils_avl_tree_node_height(node->left); + short right_height = mycore_utils_avl_tree_node_height(node->right); + + node->height = (left_height > right_height ? left_height : right_height) + 1; + + /* check balance */ + switch ((right_height - left_height)) + { + case 2: { + if(mycore_utils_avl_tree_node_balance_factor(node->right) < 0) + node->right = mycore_utils_avl_tree_node_rotate_right(node->right); + + mycore_utils_avl_tree_node_t* parent = node->parent; + + if(parent) { + if(parent->right == node) + return parent->right = mycore_utils_avl_tree_node_rotate_left(node); + else + return parent->left = mycore_utils_avl_tree_node_rotate_left(node); + } + + return mycore_utils_avl_tree_node_rotate_left(node); + } + case -2: { + if(mycore_utils_avl_tree_node_balance_factor(node->left) > 0) + node->left = mycore_utils_avl_tree_node_rotate_left(node->left); + + mycore_utils_avl_tree_node_t* parent = node->parent; + + if(parent) { + if(parent->right == node) + return parent->right = mycore_utils_avl_tree_node_rotate_right(node); + else + return parent->left = mycore_utils_avl_tree_node_rotate_right(node); + } + + return mycore_utils_avl_tree_node_rotate_right(node); + } + default: + break; + } + + if(node->parent == NULL) + *root = node; + + return node->parent; +} + +void mycore_utils_avl_tree_add(mycore_utils_avl_tree_t* avl_tree, mycore_utils_avl_tree_node_t** root, size_t type, void* value) +{ + if(*root == NULL) { + *root = mycore_utils_avl_tree_node_create_root(avl_tree, type, value); + return; + } + + mycore_utils_avl_tree_node_t* node = *root; + mycore_utils_avl_tree_node_t* new_node = mcobject_malloc(avl_tree->mc_nodes, NULL); + mycore_utils_avl_tree_node_clean(new_node); + + while(1) + { + if(type == node->type) { + node->value = value; + return; + } + else if(type < node->type) { + if(node->left == NULL) { + node->left = new_node; + + new_node->parent = node; + new_node->type = type; + new_node->value = value; + + node = new_node; + break; + } + + node = node->left; + } + else { + if(node->right == NULL) { + node->right = new_node; + + new_node->parent = node; + new_node->type = type; + new_node->value = value; + + node = new_node; + break; + } + + node = node->right; + } + } + + while(node) { + node = mycore_utils_avl_tree_node_balance(node, root); + } +} + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_find_min(mycore_utils_avl_tree_node_t* node) +{ + if(node == NULL) + return NULL; + + while(node->right) { + node = node->right; + } + + return node; +} + +void mycore_utils_avl_tree_rotate_for_delete(mycore_utils_avl_tree_node_t* delete_node, mycore_utils_avl_tree_node_t* node, mycore_utils_avl_tree_node_t** root) +{ + mycore_utils_avl_tree_node_t* balance_node; + + if(node) { + if(delete_node->left == node) { + balance_node = node->left ? node->left : node; + + node->parent = delete_node->parent; + node->right = delete_node->right; + + if(delete_node->right) + delete_node->right->parent = node; + } + else { + balance_node = node; + + node->parent->right = NULL; + node->parent = delete_node->parent; + node->right = delete_node->right; + node->left = delete_node->left; + + if(delete_node->left) + delete_node->left->parent = node; + if(delete_node->right) + delete_node->right->parent = node; + } + + if(delete_node->parent) { + if(delete_node->parent->left == delete_node) { delete_node->parent->left = node; } + else { delete_node->parent->right = node; } + } + else { + *root = node; + } + } + else { + balance_node = delete_node->parent; + + if(delete_node->parent) { + if(delete_node->parent->left == delete_node) { delete_node->parent->left = delete_node->right; } + else { delete_node->parent->right = delete_node->right; } + } + else { + *root = delete_node->right; + } + } + + while(balance_node) { + balance_node = mycore_utils_avl_tree_node_balance(balance_node, root); + } +} + +void * mycore_utils_avl_tree_delete(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t** root, size_t type) +{ + mycore_utils_avl_tree_node_t* node = *root; + + while(node) + { + if(type == node->type) { + mycore_utils_avl_tree_rotate_for_delete(node, mycore_utils_avl_tree_find_min(node->left), root); + + void *value = node->value; + mcobject_free(avl_tree->mc_nodes, node); + + return value; + } + else if(type < node->type) + node = node->left; + else + node = node->right; + } + + return NULL; +} + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_search_by_type(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t* node, size_t type) +{ + while(node) + { + if(type == node->type) + return node; + else if(type < node->type) + node = node->left; + else + node = node->right; + } + + return NULL; +} + +void mycore_utils_avl_tree_list_all_nodes(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t* root, mycore_utils_avl_tree_node_callback_f callback, void* ctx) +{ + if(root == NULL) + return; + + callback(root, ctx); + + mycore_utils_avl_tree_list_all_nodes(avl_tree, root->left, callback, ctx); + mycore_utils_avl_tree_list_all_nodes(avl_tree, root->right, callback, ctx); +} + + diff --git a/source/mycore/utils/avl_tree.h b/source/mycore/utils/avl_tree.h new file mode 100644 index 0000000..2ab7ecb --- /dev/null +++ b/source/mycore/utils/avl_tree.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_AVL_TREE_H +#define MyCORE_UTILS_AVL_TREE_H +#pragma once + +#include "mycore/myosi.h" +#include "mycore/utils/mcobject.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycore_utils_avl_tree_node mycore_utils_avl_tree_node_t; +typedef void (*mycore_utils_avl_tree_node_callback_f)(mycore_utils_avl_tree_node_t* avl_tree_node, void* ctx); + +struct mycore_utils_avl_tree_node { + void *value; + size_t type; + + mycore_utils_avl_tree_node_t* left; + mycore_utils_avl_tree_node_t* right; + mycore_utils_avl_tree_node_t* parent; + + short height; +}; + +struct mycore_utils_avl_tree { + mcobject_t* mc_nodes; +} +typedef mycore_utils_avl_tree_t; + +mycore_utils_avl_tree_t * mycore_utils_avl_tree_create(void); +mystatus_t mycore_utils_avl_tree_init(mycore_utils_avl_tree_t* avl_tree); +void mycore_utils_avl_tree_clean(mycore_utils_avl_tree_t* avl_tree); +mycore_utils_avl_tree_t * mycore_utils_avl_tree_destroy(mycore_utils_avl_tree_t* avl_tree, bool self_destroy); + +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_node_create_root(mycore_utils_avl_tree_t* avl_tree, size_t type, void* value); + +void mycore_utils_avl_tree_add(mycore_utils_avl_tree_t* avl_tree, mycore_utils_avl_tree_node_t** root, size_t type, void* value); +void * mycore_utils_avl_tree_delete(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t** root, size_t type); +mycore_utils_avl_tree_node_t * mycore_utils_avl_tree_search_by_type(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t* node, size_t type); + +void mycore_utils_avl_tree_list_all_nodes(mycore_utils_avl_tree_t *avl_tree, mycore_utils_avl_tree_node_t* root, mycore_utils_avl_tree_node_callback_f callback, void* ctx); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_AVL_TREE_H */ diff --git a/source/mycore/utils/mchar_async.c b/source/mycore/utils/mchar_async.c new file mode 100644 index 0000000..23bd322 --- /dev/null +++ b/source/mycore/utils/mchar_async.c @@ -0,0 +1,851 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mchar_async.h" + +mchar_async_t * mchar_async_create(void) +{ + return (mchar_async_t*)mycore_calloc(1, sizeof(mchar_async_t)); +} + +mystatus_t mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size) +{ + if(char_size < 4096) + char_size = 4096; + + mchar_async->origin_size = char_size; + + mchar_async->chunks_size = chunk_len; + mchar_async->chunks_pos_size = 1024; + + /* Chunck, list of mchar_async_chunk_t* */ + mchar_async->chunks = (mchar_async_chunk_t**)mycore_calloc(mchar_async->chunks_pos_size, sizeof(mchar_async_chunk_t*)); + + if(mchar_async->chunks == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + /* Init first mchar_async_chunk_t* */ + mchar_async->chunks[0] = (mchar_async_chunk_t*)mycore_calloc(mchar_async->chunks_size, sizeof(mchar_async_chunk_t)); + + if(mchar_async->chunks[0] == NULL) { + mchar_async->chunks = mycore_free(mchar_async->chunks); + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + /* Init cache */ + mystatus_t status = mchar_async_cache_init(&mchar_async->chunk_cache); + + if(status) { + mycore_free(mchar_async->chunks[0]); + mchar_async->chunks = mycore_free(mchar_async->chunks); + + return status; + } + + mchar_async->nodes_length = 0; + mchar_async->nodes_size = 64; + mchar_async->nodes = (mchar_async_node_t*)mycore_calloc(mchar_async->nodes_size, sizeof(mchar_async_node_t)); + + if(mchar_async->nodes == NULL) + return status; + + mchar_async->nodes_cache_length = 0; + mchar_async->nodes_cache_size = mchar_async->nodes_size; + mchar_async->nodes_cache = (size_t*)mycore_malloc(mchar_async->nodes_cache_size * sizeof(size_t)); + + if(mchar_async->nodes_cache == NULL) + return status; + + mchar_async_clean(mchar_async); + + mchar_async->mcsync = mcsync_create(); + if(mchar_async->mcsync == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if((status = mcsync_init(mchar_async->mcsync))) + return status; + + return MyCORE_STATUS_OK; +} + +mystatus_t mchar_async_clean(mchar_async_t *mchar_async) +{ + mchar_async->chunks_length = 0; + mchar_async->chunks_pos_length = 1; + + mchar_async_cache_clean(&mchar_async->chunk_cache); + + for (size_t node_idx = 0; node_idx < mchar_async->nodes_length; node_idx++) + { + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + mchar_async_cache_clean(&node->cache); + + node->chunk = mchar_async_chunk_malloc(mchar_async, node, mchar_async->origin_size); + + if(node->chunk == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + node->chunk->prev = 0; + } + + return MyCORE_STATUS_OK; +} + +mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self) +{ + if(mchar_async == NULL) + return NULL; + + if(mchar_async->nodes) + { + for (size_t node_idx = 0; node_idx < mchar_async->nodes_length; node_idx++) + { + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + mchar_async_cache_destroy(&node->cache, false); + } + + mycore_free(mchar_async->nodes); + mchar_async->nodes = NULL; + } + + if(mchar_async->nodes_cache) { + mycore_free(mchar_async->nodes_cache); + } + + if(mchar_async->chunks) + { + for (size_t pos_idx = 0; pos_idx < mchar_async->chunks_pos_length; pos_idx++) { + if(mchar_async->chunks[pos_idx]) + { + for (size_t idx = 0; idx < mchar_async->chunks_size; idx++) { + if(mchar_async->chunks[pos_idx][idx].begin) + mycore_free(mchar_async->chunks[pos_idx][idx].begin); + } + + mycore_free(mchar_async->chunks[pos_idx]); + } + } + + mycore_free(mchar_async->chunks); + mchar_async->chunks = NULL; + } + + mchar_async_cache_destroy(&mchar_async->chunk_cache, false); + + mchar_async->mcsync = mcsync_destroy(mchar_async->mcsync, 1); + + memset(mchar_async, 0, sizeof(mchar_async_t)); + + if(destroy_self) + mycore_free(mchar_async); + else + return mchar_async; + + return NULL; +} + +void mchar_async_mem_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, mchar_async_chunk_t *chunk, size_t length) +{ + if(chunk == NULL) + return; + + if(chunk->begin) { + if(length > chunk->size) { + mycore_free(chunk->begin); + + chunk->size = length + mchar_async->origin_size; + chunk->begin = (char*)mycore_malloc(chunk->size * sizeof(char)); + } + } + else { + chunk->size = mchar_async->origin_size; + + if(length > chunk->size) + chunk->size = length; + + chunk->begin = (char*)mycore_malloc(chunk->size * sizeof(char)); + } + + chunk->length = 0; +} + +mchar_async_chunk_t * mchar_async_chunk_malloc_without_lock(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length) +{ + if(mchar_async_cache_has_nodes(mchar_async->chunk_cache)) + { + size_t index = mchar_async_cache_delete(&mchar_async->chunk_cache, length); + + if(index) + return (mchar_async_chunk_t*)mchar_async->chunk_cache.nodes[index].value; + else + return NULL; + } + + if(mchar_async->chunks_length >= mchar_async->chunks_size) + { + size_t current_idx = mchar_async->chunks_pos_length; + mchar_async->chunks_pos_length++; + + if(mchar_async->chunks_pos_length >= mchar_async->chunks_pos_size) + { + mchar_async->chunks_pos_size <<= 1; + mchar_async_chunk_t **tmp_pos = mycore_realloc(mchar_async->chunks, + sizeof(mchar_async_chunk_t*) * mchar_async->chunks_pos_size); + + if(tmp_pos) { + memset(&tmp_pos[mchar_async->chunks_pos_length], 0, (mchar_async->chunks_pos_size - mchar_async->chunks_pos_length) + * sizeof(mchar_async_chunk_t*)); + + mchar_async->chunks = tmp_pos; + } + else + return NULL; + } + + if(mchar_async->chunks[current_idx] == NULL) { + mchar_async_chunk_t *tmp = mycore_calloc(mchar_async->chunks_size, sizeof(mchar_async_chunk_t)); + + if(tmp) + mchar_async->chunks[current_idx] = tmp; + else + return NULL; + } + + mchar_async->chunks_length = 0; + } + + mchar_async_chunk_t *chunk = &mchar_async->chunks[mchar_async->chunks_pos_length - 1][mchar_async->chunks_length]; + mchar_async->chunks_length++; + + mchar_async_mem_malloc(mchar_async, node, chunk, length); + + if(chunk->begin == NULL) + return NULL; + + return chunk; +} + +mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length) +{ + mcsync_lock(mchar_async->mcsync); + mchar_async_chunk_t *chunk = mchar_async_chunk_malloc_without_lock(mchar_async, node, length); + mcsync_unlock(mchar_async->mcsync); + + return chunk; +} + +size_t mchar_async_node_add(mchar_async_t *mchar_async, mystatus_t* status) +{ + if(mcsync_lock(mchar_async->mcsync)) { + if(status) + *status = MyCORE_STATUS_ASYNC_ERROR_LOCK; + + return 0; + } + + size_t node_idx; + + if(mchar_async->nodes_cache_length) { + mchar_async->nodes_cache_length--; + + node_idx = mchar_async->nodes_cache[ mchar_async->nodes_cache_length ]; + } + else { + if(mchar_async->nodes_length >= mchar_async->nodes_size) { + if(status) + *status = MyCORE_STATUS_ERROR_NO_FREE_SLOT; + + mcsync_unlock(mchar_async->mcsync); + return 0; + } + + node_idx = mchar_async->nodes_length; + mchar_async->nodes_length++; + } + + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + + if(mchar_async_cache_init(&node->cache)) { + if(status) + *status = MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + mcsync_unlock(mchar_async->mcsync); + return 0; + } + + node->chunk = mchar_async_chunk_malloc_without_lock(mchar_async, node, mchar_async->origin_size); + + if(node->chunk == NULL) { + if(status) + *status = MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + mcsync_unlock(mchar_async->mcsync); + return 0; + } + + node->chunk->next = NULL; + node->chunk->prev = NULL; + + mcsync_unlock(mchar_async->mcsync); + + if(status) + *status = MyCORE_STATUS_OK; + + return node_idx; +} + +void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx) +{ + if(mchar_async->nodes_length <= node_idx) + return; + + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + + while (node->chunk->prev) + node->chunk = node->chunk->prev; + + node->chunk->length = 0; + mchar_async_cache_clean(&node->cache); +} + +void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx) +{ + mcsync_lock(mchar_async->mcsync); + + if(mchar_async->nodes_length <= node_idx) { + mcsync_unlock(mchar_async->mcsync); + return; + } + + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + mchar_async_chunk_t *chunk = node->chunk; + + while (chunk->next) + chunk = chunk->next; + + while (chunk) + { + mchar_async_cache_add(&mchar_async->chunk_cache, (void*)chunk, chunk->size); + chunk = chunk->prev; + } + + if(node->cache.nodes) + mchar_async_cache_destroy(&node->cache, false); + + memset(node, 0, sizeof(mchar_async_node_t)); + + if(mchar_async->nodes_cache_length >= mchar_async->nodes_cache_size) { + size_t new_size = mchar_async->nodes_cache_size << 1; + + size_t *tmp = (size_t*)mycore_realloc(mchar_async->nodes_cache, sizeof(size_t) * mchar_async->nodes_cache_size); + + if(tmp) { + mchar_async->nodes_cache = tmp; + mchar_async->nodes_cache_size = new_size; + } + } + + mchar_async->nodes_cache[ mchar_async->nodes_cache_length ] = node_idx; + mchar_async->nodes_cache_length++; + + mcsync_unlock(mchar_async->mcsync); +} + +mchar_async_chunk_t * mchar_sync_chunk_find_by_size(mchar_async_node_t *node, size_t size) +{ + mchar_async_chunk_t *chunk = node->chunk->next; + + while (chunk) { + if(chunk->size >= size) + return chunk; + + chunk = chunk->next; + } + + return NULL; +} + +void mchar_sync_chunk_insert_after(mchar_async_chunk_t *base, mchar_async_chunk_t *chunk) +{ + if(base->next == chunk) + return; + + if(chunk->prev) + chunk->prev->next = chunk->next; + + if(chunk->next) + chunk->next->prev = chunk->prev; + + if(base->next) + base->next->prev = chunk; + + chunk->next = base->next; + chunk->prev = base; + + base->next = chunk; +} + +char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size) +{ + if(size == 0) + return NULL; + + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + mchar_async_chunk_t *chunk = node->chunk; + + if(mchar_async_cache_has_nodes(node->cache)) { + size_t index = mchar_async_cache_delete(&node->cache, size); + + if(index) { + return (char *)(node->cache.nodes[index].value); + } + } + + size_t new_size = chunk->length + size + sizeof(size_t); + + if(new_size > chunk->size) + { + if((chunk->length + sizeof(size_t)) < chunk->size) + { + size_t calc_size = (chunk->size - chunk->length) - sizeof(size_t); + + if(calc_size) { + char *tmp = &chunk->begin[(chunk->length + sizeof(size_t))]; + *(size_t*)(&chunk->begin[chunk->length]) = calc_size; + + chunk->length = chunk->size; + + mchar_async_cache_add(&node->cache, tmp, calc_size); + } + } + + chunk = mchar_sync_chunk_find_by_size(node, (size + sizeof(size_t))); + + if(chunk) + chunk->length = 0; + else { + if((size + sizeof(size_t)) > mchar_async->origin_size) + chunk = mchar_async_chunk_malloc(mchar_async, node, (size + sizeof(size_t) + mchar_async->origin_size)); + else + chunk = mchar_async_chunk_malloc(mchar_async, node, mchar_async->origin_size); + } + + mchar_sync_chunk_insert_after(node->chunk, chunk); + node->chunk = chunk; + } + + char *tmp = &chunk->begin[(chunk->length + sizeof(size_t))]; + *((size_t*)(&chunk->begin[chunk->length])) = size; + + chunk->length = chunk->length + size + sizeof(size_t); + + return tmp; +} + +char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size) +{ + if(data == NULL) + return NULL; + + size_t curr_size = *((size_t*)(data - sizeof(size_t))); + + if(curr_size >= new_size) + return data; + + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + + if(node->chunk->length >= curr_size && + &node->chunk->begin[ (node->chunk->length - curr_size) ] == data) + { + size_t next_size = (node->chunk->length - curr_size) + new_size; + + if(next_size <= node->chunk->size) { + /* it`s Magic */ + *((size_t*)(&node->chunk->begin[ ((node->chunk->length - curr_size) - sizeof(size_t)) ])) = new_size; + + node->chunk->length = next_size; + + return data; + } +// else { +// size_t re_size = next_size - node->chunk->length; +// +// /* a little Magic ;) */ +// *((size_t*)(&node->chunk->begin[ ((node->chunk->length - curr_size) - sizeof(size_t)) ])) = re_size; +// +// curr_size = re_size; +// } + } + + char *tmp = mchar_async_malloc(mchar_async, node_idx, new_size); + + if(tmp) { + memcpy(tmp, data, sizeof(char) * data_len); + + mchar_async_cache_add(&node->cache, data, curr_size); + } + + return tmp; +} + +char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len) +{ + if(data == NULL) + return NULL; + + size_t curr_size = *((size_t*)(data - sizeof(size_t))); + + char *tmp_old = data; + data = &data[crop_len]; + + *((size_t*)(data - sizeof(size_t))) = curr_size - crop_len; + + if((crop_len + 4) > sizeof(size_t)) { + crop_len = crop_len - sizeof(size_t); + *((size_t*)(tmp_old - sizeof(size_t))) = crop_len; + + mchar_async_node_t *node = &mchar_async->nodes[node_idx]; + mchar_async_cache_add(&node->cache, tmp_old, crop_len); + } + + return data; +} + +char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len) +{ + if(data == NULL) + return NULL; + + size_t curr_size = *((size_t*)(data - sizeof(size_t))); + data = &data[crop_len]; + + *((size_t*)(data - sizeof(size_t))) = curr_size - crop_len; + + return data; +} + +size_t mchar_async_get_size_by_data(const char *data) +{ + if(data == NULL) + return 0; + + return *((size_t*)(data - sizeof(size_t))); +} + +void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry) +{ + if(entry) + mchar_async_cache_add(&mchar_async->nodes[node_idx].cache, entry, *(size_t*)(entry - sizeof(size_t))); +} + +mystatus_t mchar_async_cache_init(mchar_async_cache_t *cache) +{ + cache->count = 0; + cache->nodes_root = 0; + cache->nodes_length = 1; + cache->nodes_size = 1024; + cache->nodes = (mchar_async_cache_node_t*)mycore_malloc(sizeof(mchar_async_cache_node_t) * cache->nodes_size); + + if(cache->nodes == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + cache->nodes[0].left = 0; + cache->nodes[0].right = 0; + cache->nodes[0].size = 0; + cache->nodes[0].value = NULL; + + cache->index_length = 0; + cache->index_size = cache->nodes_size; + cache->index = (size_t*)mycore_malloc(sizeof(size_t) * cache->index_size); + + if(cache->index == NULL) { + cache->nodes = mycore_free(cache->nodes); + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + return MyCORE_STATUS_OK; +} + +void mchar_async_cache_clean(mchar_async_cache_t *cache) +{ + cache->count = 0; + cache->nodes_root = 0; + cache->nodes_length = 1; + cache->index_length = 0; + + if(cache->nodes) { + cache->nodes[0].left = 0; + cache->nodes[0].right = 0; + cache->nodes[0].size = 0; + cache->nodes[0].value = NULL; + } +} + +mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy) +{ + if(cache == NULL) + return NULL; + + if(cache->nodes) + mycore_free(cache->nodes); + + if(cache->index) + mycore_free(cache->index); + + if(self_destroy) { + mycore_free(cache); + return NULL; + } + + return cache; +} + +size_t mchar_async_cache_malloc(mchar_async_cache_t *cache) +{ + if(cache->index_length) { + cache->index_length--; + return cache->index[cache->index_length]; + } + + cache->nodes_length++; + + if(cache->nodes_length >= cache->nodes_size) { + cache->nodes_size <<= 1; + + mchar_async_cache_node_t *tmp = (mchar_async_cache_node_t*)mycore_realloc(cache->nodes, sizeof(mchar_async_cache_node_t) * cache->nodes_size); + + if(tmp) + cache->nodes = tmp; + } + + return cache->nodes_length - 1; +} + +size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size) +{ + mchar_async_cache_node_t *list = cache->nodes; + size_t idx = cache->nodes_root; + + while (idx) + { + if(size <= list[idx].size) + { + while( list[ list[idx].right ].size == size ) + idx = list[idx].right; + + size_t parent = list[idx].parent; + + if(parent) { + if(list[parent].left == idx) + { + if(list[idx].right) { + if(list[idx].left) { + size_t last_left = list[ list[idx].right ].left; + + while( list[last_left].left ) + last_left = list[last_left].left; + + if(last_left) { + list[last_left].left = list[idx].left; + list[ list[idx].left ].parent = last_left; + } + else { + list[ list[idx].right ].left = list[idx].left; + } + } + + list[parent].left = list[idx].right; + list[ list[idx].right ].parent = parent; + } + else { + list[parent].left = list[idx].left; + list[ list[idx].left ].parent = parent; + } + } + else { + if(list[idx].left) { + if(list[idx].right) { + size_t last_right = list[ list[idx].left ].right; + + while( list[last_right].right ) + last_right = list[last_right].right; + + if(last_right) { + list[last_right].right = list[idx].right; + list[ list[idx].right ].parent = last_right; + } + else { + list[ list[idx].left ].right = list[idx].right; + } + } + + list[parent].right = list[idx].left; + list[ list[idx].left ].parent = parent; + } + else { + list[parent].right = list[idx].right; + list[ list[idx].right ].parent = parent; + } + } + } + else { + if(list[idx].left) { + if(list[idx].right) { + size_t last_right = list[ list[idx].left ].right; + + while( list[last_right].right ) + last_right = list[last_right].right; + + if(last_right) { + list[last_right].right = list[idx].right; + list[ list[idx].right ].parent = last_right; + } + else { + list[ list[idx].left ].right = list[idx].right; + } + } + + cache->nodes_root = list[idx].left; + list[ list[idx].left ].parent = 0; + } + else { + cache->nodes_root = list[idx].right; + list[ list[idx].right ].parent = 0; + } + } + + cache->index[cache->index_length] = idx; + + cache->index_length++; + if(cache->index_length >= cache->index_size) + { + size_t new_size = cache->index_size << 1; + size_t *tmp = (size_t*)mycore_realloc(cache->index, sizeof(size_t) * new_size); + + if(tmp) { + cache->index = tmp; + cache->index_size = new_size; + } + else + return 0; + } + + cache->count--; + + return idx; + } + else { + idx = list[idx].right; + } + } + + return 0; +} + +void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size) +{ + cache->count++; + + if(cache->nodes_root == 0) { + mchar_async_cache_node_t *list = cache->nodes; + + cache->nodes_root = mchar_async_cache_malloc(cache); + + list[cache->nodes_root].parent = 0; + list[cache->nodes_root].left = 0; + list[cache->nodes_root].right = 0; + list[cache->nodes_root].size = size; + list[cache->nodes_root].value = value; + + return; + } + + size_t idx = cache->nodes_root; + size_t new_idx = mchar_async_cache_malloc(cache); + + mchar_async_cache_node_t *list = cache->nodes; + + while(idx) + { + if(size == list[idx].size) + { + if(list[idx].right) { + list[new_idx].right = list[idx].right; + list[ list[idx].right ].parent = new_idx; + } + else { + list[new_idx].right = 0; + } + + list[idx].right = new_idx; + + list[new_idx].parent = idx; + list[new_idx].left = 0; + list[new_idx].size = size; + list[new_idx].value = value; + + break; + } + else if(size < list[idx].size) + { + size_t parent = list[idx].parent; + + if(parent) { + if(list[parent].left == idx) + list[parent].left = new_idx; + else + list[parent].right = new_idx; + + list[new_idx].parent = parent; + } + else { + cache->nodes_root = new_idx; + list[new_idx].parent = 0; + } + + list[idx].parent = new_idx; + + list[new_idx].right = idx; + list[new_idx].left = 0; + list[new_idx].size = size; + list[new_idx].value = value; + + break; + } + else // size > list[idx].size + { + if(list[idx].right) + idx = list[idx].right; + else { + list[idx].right = new_idx; + + list[new_idx].right = 0; + list[new_idx].left = 0; + list[new_idx].parent = idx; + list[new_idx].size = size; + list[new_idx].value = value; + + break; + } + } + } +} + + diff --git a/source/mycore/utils/mchar_async.h b/source/mycore/utils/mchar_async.h new file mode 100644 index 0000000..f7fe54b --- /dev/null +++ b/source/mycore/utils/mchar_async.h @@ -0,0 +1,131 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCHAR_ASYNC_H +#define MyCORE_UTILS_MCHAR_ASYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" +#include "mycore/utils/mcsync.h" + +#define mchar_async_cache_has_nodes(cache) cache.count + +typedef struct mchar_async_node mchar_async_node_t; + +struct mchar_async_cache_node { + void *value; + size_t size; + + size_t left; + size_t right; + size_t parent; +} +typedef mchar_async_cache_node_t; + +struct mchar_async_chunk { + char *begin; + size_t length; + size_t size; + + struct mchar_async_chunk *next; + struct mchar_async_chunk *prev; +} +typedef mchar_async_chunk_t; + +struct mchar_async_cache { + mchar_async_cache_node_t *nodes; + size_t nodes_size; + size_t nodes_length; + size_t nodes_root; + + size_t count; + + size_t *index; + size_t index_length; + size_t index_size; +} +typedef mchar_async_cache_t; + +struct mchar_async_node { + mchar_async_chunk_t *chunk; + mchar_async_cache_t cache; +}; + +struct mchar_async { + size_t origin_size; + + mchar_async_chunk_t **chunks; + size_t chunks_pos_size; + size_t chunks_pos_length; + size_t chunks_size; + size_t chunks_length; + + mchar_async_cache_t chunk_cache; + + mchar_async_node_t *nodes; + size_t nodes_length; + size_t nodes_size; + + size_t *nodes_cache; + size_t nodes_cache_length; + size_t nodes_cache_size; + + mcsync_t *mcsync; +} +typedef mchar_async_t; + + +mchar_async_t * mchar_async_create(void); +mystatus_t mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size); +mystatus_t mchar_async_clean(mchar_async_t *mchar_async); +mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self); + +char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size); +char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size); +void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry); + +size_t mchar_async_node_add(mchar_async_t *mchar_async, mystatus_t* status); +void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx); +void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx); + +mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length); +char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len); +char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len); + +size_t mchar_async_get_size_by_data(const char *data); + +// cache +mystatus_t mchar_async_cache_init(mchar_async_cache_t *cache); +mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy); +void mchar_async_cache_clean(mchar_async_cache_t *cache); + +void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size); +size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mchar_async_h */ + diff --git a/source/mycore/utils/mcobject.c b/source/mycore/utils/mcobject.c new file mode 100644 index 0000000..57197f1 --- /dev/null +++ b/source/mycore/utils/mcobject.c @@ -0,0 +1,194 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mcobject.h" + +mcobject_t * mcobject_create(void) +{ + return mycore_calloc(1, sizeof(mcobject_t)); +} + +mystatus_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size) +{ + mcobject->struct_size = struct_size; + mcobject->chunk_size = chunk_size; + + mcobject->chunk = NULL; + + mcobject->cache_length = 0; + mcobject->cache_size = chunk_size; + mcobject->cache = (void**)mycore_malloc(sizeof(void*) * mcobject->cache_size); + + if(mcobject->cache == NULL) + return MyCORE_STATUS_MCOBJECT_ERROR_CACHE_CREATE; + + return MyCORE_STATUS_OK; +} + +void mcobject_clean(mcobject_t *mcobject) +{ + if(mcobject->chunk == NULL) + return; + + mcobject_chunk_t* chunk = mcobject->chunk; + + while(chunk->next) + chunk = chunk->next; + + while(chunk) { + mcobject_chunk_t* tmp = chunk->prev; + + if(chunk->begin) { + mycore_free(chunk->begin); + } + + mycore_free(chunk); + + chunk = tmp; + } + + mcobject->chunk = NULL; + mcobject->cache_length = 0; +} + +mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self) +{ + if(mcobject == NULL) + return NULL; + + mcobject_clean(mcobject); + + if(mcobject->cache) { + mycore_free(mcobject->cache); + mcobject->cache = NULL; + } + + if(destroy_self) { + mycore_free(mcobject); + return NULL; + } + + return mcobject; +} + +void mcobject_chunk_malloc(mcobject_t* mcobject, mystatus_t* status) +{ + if(status) + *status = MyCORE_STATUS_OK; + + mcobject_chunk_t* chunk; + + if(mcobject->chunk && mcobject->chunk->next) { + mcobject->chunk = mcobject->chunk->next; + + mcobject->chunk->length = 0; + + return; + } + else { + chunk = mycore_calloc(1, sizeof(mcobject_chunk_t)); + + if(chunk == NULL) { + if(status) + *status = MyCORE_STATUS_MCOBJECT_ERROR_CHUNK_CREATE; + + return; + } + + chunk->begin = mycore_malloc(mcobject->struct_size * mcobject->chunk_size); + + if(chunk->begin == NULL) { + if(status) + *status = MyCORE_STATUS_MCOBJECT_ERROR_CHUNK_INIT; + + mycore_free(chunk); + return; + } + + chunk->size = mcobject->chunk_size; + } + + if(mcobject->chunk == NULL) { + mcobject->chunk = chunk; + return; + } + + chunk->prev = mcobject->chunk; + mcobject->chunk->next = chunk; + + mcobject->chunk = chunk; +} + +void * mcobject_malloc(mcobject_t *mcobject, mystatus_t* status) +{ + if(mcobject->cache_length) { + if(status) + *status = MyCORE_STATUS_OK; + + mcobject->cache_length--; + return mcobject->cache[ mcobject->cache_length ]; + } + + mcobject_chunk_t* chunk = mcobject->chunk; + + if(chunk == NULL || chunk->length >= chunk->size) + { + mystatus_t ns_status; + mcobject_chunk_malloc(mcobject, &ns_status); + + if(ns_status) { + if(status) + *status = ns_status; + + return NULL; + } + + chunk = mcobject->chunk; + } + + if(status) + *status = MyCORE_STATUS_OK; + + chunk->length++; + return &chunk->begin[((chunk->length - 1) * mcobject->struct_size)]; +} + +mystatus_t mcobject_free(mcobject_t *mcobject, void *entry) +{ + if(mcobject->cache_length >= mcobject->cache_size) { + size_t new_size = mcobject->cache_size << 1; + + void **tmp = (void**)mycore_realloc(mcobject->cache, sizeof(void*) * new_size); + + if(tmp) { + mcobject->cache = tmp; + mcobject->cache_size = new_size; + } + else + return MyCORE_STATUS_MCOBJECT_ERROR_CACHE_REALLOC; + } + + mcobject->cache[ mcobject->cache_length ] = entry; + mcobject->cache_length++; + + return MyCORE_STATUS_OK; +} + + diff --git a/source/mycore/utils/mcobject.h b/source/mycore/utils/mcobject.h new file mode 100644 index 0000000..a38e937 --- /dev/null +++ b/source/mycore/utils/mcobject.h @@ -0,0 +1,70 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCOBJECT_H +#define MyCORE_UTILS_MCOBJECT_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" + +struct mcobject_chunk { + unsigned char *begin; + size_t length; + size_t size; + + struct mcobject_chunk *next; + struct mcobject_chunk *prev; +} +typedef mcobject_chunk_t; + +struct mcobject { + mcobject_chunk_t *chunk; + + void **cache; + size_t cache_size; + size_t cache_length; + + size_t struct_size; + size_t chunk_size; +} +typedef mcobject_t; + + +mcobject_t * mcobject_create(void); +mystatus_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size); +void mcobject_clean(mcobject_t *mcobject); +mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self); + +void mcobject_chunk_malloc(mcobject_t* mcobject, mystatus_t* status); + +void * mcobject_malloc(mcobject_t *mcobject, mystatus_t* status); +mystatus_t mcobject_free(mcobject_t *mcobject, void *entry); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_MCOBJECT_H */ + diff --git a/source/mycore/utils/mcobject_async.c b/source/mycore/utils/mcobject_async.c new file mode 100644 index 0000000..191836a --- /dev/null +++ b/source/mycore/utils/mcobject_async.c @@ -0,0 +1,486 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mcobject_async.h" + +mcobject_async_t * mcobject_async_create(void) +{ + return (mcobject_async_t*)mycore_calloc(1, sizeof(mcobject_async_t)); +} + +mcobject_async_status_t mcobject_async_chunk_up(mcobject_async_t *mcobj_async) +{ + mcobj_async->chunks_length = 0; + + if(mcobj_async->chunks[ mcobj_async->chunks_pos_length ] == NULL) { + mcobj_async->chunks[ mcobj_async->chunks_pos_length ] = (mcobject_async_chunk_t*)mycore_calloc(mcobj_async->chunks_size, sizeof(mcobject_async_chunk_t)); + + if(mcobj_async->chunks[ mcobj_async->chunks_pos_length ] == NULL) + return MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; + } + + return MCOBJECT_ASYNC_STATUS_OK; +} + +mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size) +{ + mcobj_async->origin_size = obj_size_by_one_chunk; + mcobj_async->struct_size = struct_size; + mcobj_async->struct_size_sn = struct_size + sizeof(size_t); + + mcobj_async->chunks_pos_length = 0; + mcobj_async->chunks_pos_size = 128; + mcobj_async->chunks_size = chunk_len; + mcobj_async->chunks = (mcobject_async_chunk_t**)mycore_calloc(mcobj_async->chunks_pos_size, sizeof(mcobject_async_chunk_t*)); + + if(mcobj_async->chunks == NULL) + return MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; + + mcobject_async_chunk_up(mcobj_async); + + mcobj_async->chunk_cache_size = mcobj_async->chunks_size; + mcobj_async->chunk_cache = (mcobject_async_chunk_t**)mycore_calloc(mcobj_async->chunk_cache_size, sizeof(mcobject_async_chunk_t*)); + + if(mcobj_async->chunk_cache == NULL) + return MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION; + + mcobj_async->nodes_length = 0; + mcobj_async->nodes_size = 64; + mcobj_async->nodes = (mcobject_async_node_t*)mycore_calloc(mcobj_async->nodes_size, sizeof(mcobject_async_node_t)); + + if(mcobj_async->nodes == NULL) + return MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION; + + mcobj_async->nodes_cache_length = 0; + mcobj_async->nodes_cache_size = mcobj_async->nodes_size; + mcobj_async->nodes_cache = (size_t*)mycore_malloc(mcobj_async->nodes_cache_size * sizeof(size_t)); + + if(mcobj_async->nodes_cache == NULL) + return MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION; + + mcobject_async_clean(mcobj_async); + + mcobj_async->mcsync = mcsync_create(); + if(mcobj_async->mcsync == NULL) + return MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION; + + if(mcsync_init(mcobj_async->mcsync)) + return MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION; + + return MCOBJECT_ASYNC_STATUS_OK; +} + +void mcobject_async_clean(mcobject_async_t *mcobj_async) +{ + if(mcobj_async->chunks[0] != NULL) + mcobj_async->chunks_pos_length = 1; + else + mcobj_async->chunks_pos_length = 0; + + mcobj_async->chunks_length = 0; + mcobj_async->chunk_cache_length = 0; + + size_t node_idx; + for (node_idx = 0; node_idx < mcobj_async->nodes_length; node_idx++) + { + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + node->cache_length = 0; + + if(node->chunk) { + node->chunk = mcobject_async_chunk_malloc(mcobj_async, mcobj_async->origin_size, NULL); + } + } +} + +mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self) +{ + if(mcobj_async == NULL) + return NULL; + + if(mcobj_async->nodes) + { + for (size_t node_idx = 0; node_idx < mcobj_async->nodes_length; node_idx++) + { + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + + if(node->cache) + mycore_free(node->cache); + } + + mycore_free(mcobj_async->nodes); + } + + if(mcobj_async->nodes_cache) { + mycore_free(mcobj_async->nodes_cache); + } + + if(mcobj_async->chunks) { + for (size_t pos_idx = 0; pos_idx < mcobj_async->chunks_pos_length; pos_idx++) { + if(mcobj_async->chunks[pos_idx]) + { + for (size_t idx = 0; idx < mcobj_async->chunks_size; idx++) { + if(mcobj_async->chunks[pos_idx][idx].begin) + mycore_free(mcobj_async->chunks[pos_idx][idx].begin); + } + + mycore_free(mcobj_async->chunks[pos_idx]); + } + } + + mycore_free(mcobj_async->chunks); + } + + if(mcobj_async->chunk_cache) { + mycore_free(mcobj_async->chunk_cache); + } + + mcobj_async->mcsync = mcsync_destroy(mcobj_async->mcsync, 1); + + memset(mcobj_async, 0, sizeof(mcobject_async_t)); + + if(destroy_self) + mycore_free(mcobj_async); + else + return mcobj_async; + + return NULL; +} + +mcobject_async_status_t mcobject_async_mem_malloc(mcobject_async_t *mcobj_async, mcobject_async_chunk_t *chunk, size_t length) +{ + if(chunk->begin) { + if(length > chunk->size) { + mycore_free(chunk->begin); + + chunk->size = length + mcobj_async->origin_size; + chunk->begin = (unsigned char*)mycore_malloc(chunk->size * mcobj_async->struct_size_sn); + } + } + else { + chunk->size = mcobj_async->origin_size; + + if(length > chunk->size) + chunk->size += length; + + chunk->begin = (unsigned char*)mycore_malloc(chunk->size * mcobj_async->struct_size_sn); + } + + chunk->length = 0; + + if(chunk->begin == NULL) + return MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; + + return MCOBJECT_ASYNC_STATUS_OK; +} + +mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status) +{ + if(status) + *status = MCOBJECT_ASYNC_STATUS_OK; + + if(mcobj_async->chunk_cache_length) + { + mcobj_async->chunk_cache_length--; + + mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]->length = 0; + mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]->next = NULL; + mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]->prev = NULL; + + return mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]; + } + + if(mcobj_async->chunks_length >= mcobj_async->chunks_size) + { + if(mcobj_async->chunks_pos_length >= mcobj_async->chunks_pos_size) + { + size_t tmp_pos_size = mcobj_async->chunks_pos_size << 1; + mcobject_async_chunk_t **tmp_pos = mycore_realloc(mcobj_async->chunks, + sizeof(mcobject_async_chunk_t*) * tmp_pos_size); + + if(tmp_pos) + { + memset(&tmp_pos[mcobj_async->chunks_pos_length], 0, (tmp_pos_size - mcobj_async->chunks_pos_length) + * sizeof(mcobject_async_chunk_t*)); + + mcobj_async->chunks_pos_size = tmp_pos_size; + mcobj_async->chunks = tmp_pos; + } + else { + if(status) + *status = MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; + + return NULL; + } + } + + if(mcobject_async_chunk_up(mcobj_async)) { + if(status) + *status = MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; + + return NULL; + } + + mcobj_async->chunks_pos_length++; + } + + mcobject_async_chunk_t* chunk = &mcobj_async->chunks[mcobj_async->chunks_pos_length - 1][mcobj_async->chunks_length]; + mcobj_async->chunks_length++; + + chunk->next = NULL; + chunk->prev = NULL; + + if(status) + *status = mcobject_async_mem_malloc(mcobj_async, chunk, length); + else + mcobject_async_mem_malloc(mcobj_async, chunk, length); + + return chunk; +} + +mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status) +{ + if(mcsync_lock(mcobj_async->mcsync)) { + if(status) + *status = MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION; + + return NULL; + } + + mcobject_async_chunk_t* chunk = mcobject_async_chunk_malloc_without_lock(mcobj_async, length, status); + mcsync_unlock(mcobj_async->mcsync); + + return chunk; +} + +size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status) +{ + mcsync_lock(mcobj_async->mcsync); + + if(status) + *status = MCOBJECT_ASYNC_STATUS_OK; + + size_t node_idx; + + if(mcobj_async->nodes_cache_length) { + mcobj_async->nodes_cache_length--; + + node_idx = mcobj_async->nodes_cache[ mcobj_async->nodes_cache_length ]; + } + else { + if(mcobj_async->nodes_length >= mcobj_async->nodes_size) { + mcsync_unlock(mcobj_async->mcsync); + return 0; + } + + node_idx = mcobj_async->nodes_length; + mcobj_async->nodes_length++; + } + + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + + node->chunk = mcobject_async_chunk_malloc_without_lock(mcobj_async, mcobj_async->origin_size, status); + + if(status && *status) { + mcsync_unlock(mcobj_async->mcsync); + return 0; + } + + node->chunk->next = NULL; + node->chunk->prev = NULL; + + node->cache_length = 0; + node->cache_size = mcobj_async->origin_size; + node->cache = (void**)mycore_malloc(sizeof(void*) * node->cache_size); + + if(node->cache == NULL) { + if(status) + *status = MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION; + + mcsync_unlock(mcobj_async->mcsync); + return 0; + } + + mcsync_unlock(mcobj_async->mcsync); + + return node_idx; +} + +void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx) +{ + if(mcobj_async->nodes_length <= node_idx) + return; + + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + node->cache_length = 0; + + if(node->chunk == NULL) + return; + + while (node->chunk->prev) + node->chunk = node->chunk->prev; + + node->chunk->length = 0; + node->cache_length = 0; +} + +void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async) +{ + for (size_t node_idx = 0; node_idx < mcobj_async->nodes_length; node_idx++) { + mcobject_async_node_clean(mcobj_async, node_idx); + } +} + +void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx) +{ + mcsync_lock(mcobj_async->mcsync); + + if(mcobj_async->nodes_length <= node_idx) { + mcsync_unlock(mcobj_async->mcsync); + return; + } + + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + mcobject_async_chunk_t *chunk = node->chunk; + + while (chunk->next) + chunk = chunk->next; + + while (chunk) + { + if(mcobj_async->chunk_cache_length >= mcobj_async->chunk_cache_size) { + size_t new_size = mcobj_async->chunk_cache_size << 1; + + mcobject_async_chunk_t **tmp = (mcobject_async_chunk_t**)mycore_realloc(mcobj_async->chunk_cache, + sizeof(mcobject_async_chunk_t*) * new_size); + + if(tmp) { + mcobj_async->chunk_cache_size = new_size; + mcobj_async->chunk_cache = tmp; + } + else { + // TODO: add return status + mcsync_unlock(mcobj_async->mcsync); + return; + } + } + + mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ] = chunk; + mcobj_async->chunk_cache_length++; + + chunk = chunk->prev; + } + + if(node->cache) + mycore_free(node->cache); + + memset(node, 0, sizeof(mcobject_async_node_t)); + + if(mcobj_async->nodes_cache_length >= mcobj_async->nodes_cache_size) { + size_t new_size = mcobj_async->nodes_cache_size << 1; + + size_t *tmp = (size_t*)mycore_realloc(mcobj_async->nodes_cache, sizeof(size_t) * mcobj_async->nodes_cache_size); + + if(tmp) { + mcobj_async->nodes_cache = tmp; + mcobj_async->nodes_cache_size = new_size; + } + } + + mcobj_async->nodes_cache[ mcobj_async->nodes_cache_length ] = node_idx; + mcobj_async->nodes_cache_length++; + + mcsync_unlock(mcobj_async->mcsync); +} + +void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status) +{ + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + + if(node->cache_length) { + if(status) + *status = MCOBJECT_ASYNC_STATUS_OK; + + node->cache_length--; + return node->cache[ node->cache_length ]; + } + + if(node->chunk->length >= node->chunk->size) + { + if(node->chunk->next) { + node->chunk = node->chunk->next; + node->chunk->length = 0; + } + else { + mcobject_async_status_t mystatus; + mcobject_async_chunk_t *chunk = mcobject_async_chunk_malloc(mcobj_async, mcobj_async->origin_size, &mystatus); + + if(mystatus) { + if(status) + *status = mystatus; + + return NULL; + } + + chunk->prev = node->chunk; + node->chunk->next = chunk; + + node->chunk = chunk; + } + } + + if(status) + *status = MCOBJECT_ASYNC_STATUS_OK; + + size_t offset = node->chunk->length * mcobj_async->struct_size_sn; + *((size_t*)(&node->chunk->begin[offset])) = node_idx; + + node->chunk->length++; + return &node->chunk->begin[(offset + sizeof(size_t))]; +} + +mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry) +{ + size_t node_idx = *((size_t*)((unsigned char*)entry - sizeof(size_t))); + + if(node_idx >= mcobj_async->nodes_length) + return MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID; + + mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; + + if(node->cache_length >= node->cache_size) { + size_t new_size = node->cache_size << 1; + + void **tmp = (void**)mycore_realloc(node->cache, sizeof(void*) * new_size); + + if(tmp) { + node->cache = tmp; + node->cache_size = new_size; + } + else + return MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC; + } + + node->cache[ node->cache_length ] = entry; + node->cache_length++; + + return MCOBJECT_ASYNC_STATUS_OK; +} + + diff --git a/source/mycore/utils/mcobject_async.h b/source/mycore/utils/mcobject_async.h new file mode 100644 index 0000000..41252ff --- /dev/null +++ b/source/mycore/utils/mcobject_async.h @@ -0,0 +1,114 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCOBJECT_ASYNC_H +#define MyCORE_UTILS_MCOBJECT_ASYNC_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" +#include "mycore/utils/mcsync.h" + +enum mcobject_async_status { + MCOBJECT_ASYNC_STATUS_OK = 0, + MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION = 1, + MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION = 2, + MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION = 3, + MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION = 4, + MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID = 5, + MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC = 6 +} +typedef mcobject_async_status_t; + +struct mcobject_async_chunk { + unsigned char *begin; + size_t length; + size_t size; + + struct mcobject_async_chunk *next; + struct mcobject_async_chunk *prev; +} +typedef mcobject_async_chunk_t; + +struct mcobject_async_node { + mcobject_async_chunk_t *chunk; + + void **cache; + size_t cache_size; + size_t cache_length; +} +typedef mcobject_async_node_t; + +struct mcobject_async { + size_t origin_size; + size_t struct_size; + size_t struct_size_sn; + + mcobject_async_chunk_t **chunk_cache; + size_t chunk_cache_size; + size_t chunk_cache_length; + + mcobject_async_chunk_t **chunks; + size_t chunks_pos_size; + size_t chunks_pos_length; + size_t chunks_size; + size_t chunks_length; + + mcobject_async_node_t *nodes; + size_t nodes_length; + size_t nodes_size; + + size_t *nodes_cache; + size_t nodes_cache_length; + size_t nodes_cache_size; + + mcsync_t *mcsync; +} +typedef mcobject_async_t; + +mcobject_async_t * mcobject_async_create(void); +mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size); + +void mcobject_async_clean(mcobject_async_t *mcobj_async); +mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self); + +size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status); +void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx); +void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async); +void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx); + +void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status); +mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry); + +mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); +mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mcobject_async_h */ + + + + diff --git a/source/mycore/utils/mcsimple.c b/source/mycore/utils/mcsimple.c new file mode 100644 index 0000000..dbf9996 --- /dev/null +++ b/source/mycore/utils/mcsimple.c @@ -0,0 +1,125 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#include "mycore/utils/mcsimple.h" + +mcsimple_t * mcsimple_create(void) +{ + return mycore_calloc(1, sizeof(mcsimple_t)); +} + +void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size) +{ + mcsimple->struct_size = struct_size; + + mcsimple->list_pos_length_used = 0; + mcsimple->list_pos_length = 0; + mcsimple->list_pos_size = pos_size; + mcsimple->list = (uint8_t**)mycore_calloc(pos_size, sizeof(uint8_t*)); + + if(mcsimple->list == NULL) { + return; + } + + mcsimple->list_size = list_size * struct_size; + + if((mcsimple_init_list_entries(mcsimple, mcsimple->list_pos_length) == NULL)) { + return; + } +} + +void mcsimple_clean(mcsimple_t *mcsimple) +{ + mcsimple->list_length = 0; + mcsimple->list_pos_length = 0; +} + +mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self) +{ + if(mcsimple == NULL) + return NULL; + + if(mcsimple->list) { + for(size_t i = 0; i < mcsimple->list_pos_length_used; i++) { + if(mcsimple->list[i]) + mycore_free(mcsimple->list[i]); + } + + mycore_free(mcsimple->list); + } + + if(destroy_self) { + mycore_free(mcsimple); + return NULL; + } + + return mcsimple; +} + +uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos) +{ + if(mcsimple->list_pos_length >= mcsimple->list_pos_size) + { + size_t new_size = mcsimple->list_pos_size + 128; + uint8_t **list = (uint8_t**)mycore_realloc(mcsimple->list, mcsimple->list_pos_size * sizeof(uint8_t*)); + + if(list) { + mcsimple->list = list; + memset(&mcsimple->list[pos], 0, (new_size - mcsimple->list_pos_size) * sizeof(uint8_t*)); + + mcsimple->list_pos_size = new_size; + } + else + return NULL; + } + + mcsimple->list_length = 0; + + if(mcsimple->list[pos] == NULL) { + mcsimple->list_pos_length_used++; + mcsimple->list[pos] = (uint8_t*)mycore_malloc(mcsimple->list_size * sizeof(uint8_t)); + } + + return mcsimple->list[pos]; +} + +void * mcsimple_malloc(mcsimple_t *mcsimple) +{ + if(mcsimple->list_length >= mcsimple->list_size) + { + mcsimple->list_pos_length++; + if((mcsimple_init_list_entries(mcsimple, mcsimple->list_pos_length) == NULL)) { + return NULL; + } + } + + size_t current = mcsimple->list_length; + mcsimple->list_length += mcsimple->struct_size; + + return &mcsimple->list[mcsimple->list_pos_length][current]; +} + +void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos) +{ + pos *= mcsimple->struct_size; + return &mcsimple->list[ (pos / mcsimple->list_size) ][ (pos % mcsimple->list_size) ]; +} + + diff --git a/source/mycore/utils/mcsimple.h b/source/mycore/utils/mcsimple.h new file mode 100644 index 0000000..9eae399 --- /dev/null +++ b/source/mycore/utils/mcsimple.h @@ -0,0 +1,61 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCSIMPLE_H +#define MyCORE_UTILS_MCSIMPLE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mycore/myosi.h" + +struct mcsimple { + size_t struct_size; + + uint8_t **list; + + size_t list_pos_size; + size_t list_pos_length; + size_t list_pos_length_used; + size_t list_size; + size_t list_length; +} +typedef mcsimple_t; + + +mcsimple_t * mcsimple_create(void); +void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size); +void mcsimple_clean(mcsimple_t *mcsimple); +mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self); + +uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos); + +void * mcsimple_malloc(mcsimple_t *mcsimple); +void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_MCSIMPLE_H */ + diff --git a/source/mycore/utils/mcsync.c b/source/mycore/utils/mcsync.c new file mode 100644 index 0000000..e5e0399 --- /dev/null +++ b/source/mycore/utils/mcsync.c @@ -0,0 +1,99 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mcsync.h" + +mcsync_t * mcsync_create(void) +{ + return mycore_calloc(1, sizeof(mcsync_t)); +} + + + +mcsync_status_t mcsync_init(mcsync_t* mcsync) +{ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + /* spinlock */ + if((mcsync->spinlock = mcsync_spin_create()) == NULL) + return MCSYNC_STATUS_NOT_OK; + + mcsync_status_t status = mcsync_spin_init(mcsync->spinlock); + if(status) { + mcsync_spin_destroy(mcsync->spinlock); + return status; + } + + /* mutex */ + if((mcsync->mutex = mcsync_mutex_create()) == NULL) + return MCSYNC_STATUS_NOT_OK; + + if((status = mcsync_mutex_init(mcsync->mutex))) { + mcsync_spin_destroy(mcsync->spinlock); + mcsync_mutex_destroy(mcsync->mutex); + + return status; + } +#endif + + return MCSYNC_STATUS_OK; +} + +void mcsync_clean(mcsync_t* mcsync) +{ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + mcsync_spin_clean(mcsync->spinlock); + mcsync_mutex_clean(mcsync->mutex); +#endif +} + +mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self) +{ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(mcsync == NULL) + return NULL; + + mcsync_spin_destroy(mcsync->spinlock); + mcsync_mutex_destroy(mcsync->mutex); +#endif + if(destroy_self) { + mycore_free(mcsync); + return NULL; + } + + return mcsync; +} + +mcsync_status_t mcsync_lock(mcsync_t* mcsync) +{ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + return mcsync_spin_lock(mcsync->spinlock); +#else + return MCSYNC_STATUS_OK; +#endif +} + +mcsync_status_t mcsync_unlock(mcsync_t* mcsync) +{ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + return mcsync_spin_unlock(mcsync->spinlock); +#else + return MCSYNC_STATUS_OK; +#endif +} diff --git a/source/mycore/utils/mcsync.h b/source/mycore/utils/mcsync.h new file mode 100644 index 0000000..80fa896 --- /dev/null +++ b/source/mycore/utils/mcsync.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCSYNC_H +#define MyCORE_UTILS_MCSYNC_H +#pragma once + +#include "mycore/myosi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum mcsync_status { + MCSYNC_STATUS_OK = 0x00, + MCSYNC_STATUS_NOT_OK = 0x01, + MCSYNC_STATUS_ERROR_MEM_ALLOCATE = 0x02 +} +typedef mcsync_status_t; + +struct mcsync { + int* spinlock; + void* mutex; +} +typedef mcsync_t; + +mcsync_t * mcsync_create(void); +mcsync_status_t mcsync_init(mcsync_t* mcsync); +void mcsync_clean(mcsync_t* mcsync); +mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self); + +mcsync_status_t mcsync_lock(mcsync_t* mcsync); +mcsync_status_t mcsync_unlock(mcsync_t* mcsync); + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mcsync_status_t mcsync_spin_lock(void* spinlock); +mcsync_status_t mcsync_spin_unlock(void* spinlock); + +mcsync_status_t mcsync_mutex_lock(void* mutex); +mcsync_status_t mcsync_mutex_try_lock(void* mutex); +mcsync_status_t mcsync_mutex_unlock(void* mutex); + +void * mcsync_spin_create(void); +mcsync_status_t mcsync_spin_init(void* spinlock); +void mcsync_spin_clean(void* spinlock); +void mcsync_spin_destroy(void* spinlock); + +void * mcsync_mutex_create(void); +mcsync_status_t mcsync_mutex_init(void* mutex); +void mcsync_mutex_clean(void* mutex); +void mcsync_mutex_destroy(void* mutex); +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* mcsync_h */ diff --git a/source/mycore/utils/mctree.c b/source/mycore/utils/mctree.c new file mode 100644 index 0000000..6d5e281 --- /dev/null +++ b/source/mycore/utils/mctree.c @@ -0,0 +1,292 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/resources.h" +#include "mycore/utils/mctree.h" + +mctree_t * mctree_create(size_t start_size) +{ + mctree_t* mctree = (mctree_t*)mycore_malloc(sizeof(mctree_t)); + + if(mctree == NULL) + return NULL; + + mctree->nodes_size = start_size + 512; + mctree->nodes_length = start_size + 1; + mctree->nodes = (mctree_node_t*)mycore_calloc(mctree->nodes_size, sizeof(mctree_node_t)); + + if(mctree->nodes == NULL) { + mycore_free(mctree); + return NULL; + } + + mctree->start_size = start_size; + + return mctree; +} + +void mctree_clean(mctree_t* mctree) +{ + mctree->nodes_length = mctree->start_size + 1; + memset(mctree->nodes, 0, sizeof(mctree_node_t) * mctree->nodes_size); +} + +mctree_t * mctree_destroy(mctree_t* mctree) +{ + if(mctree == NULL) + return NULL; + + if(mctree->nodes) + mycore_free(mctree->nodes); + + mycore_free(mctree); + + return NULL; +} + +mctree_index_t __mtree_search_lowercase_to_start(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size) +{ + mctree_node_t* nodes = mctree->nodes; + + while (idx) + { + if(key_size == nodes[idx].str_size) { + if(mycore_strncasecmp(key, nodes[idx].str, key_size) == 0) { + return idx; + } + + idx = nodes[idx].child; + } + else if(key_size > nodes[idx].str_size) + { + if(key_size < nodes[ nodes[idx].next ].str_size) { + return 0; + } + + idx = nodes[idx].next; + } + else { + if(key_size > nodes[ nodes[idx].prev ].str_size) { + return 0; + } + + idx = nodes[idx].prev; + } + } + + return 0; +} + +mctree_index_t __mtree_search_to_start(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size) +{ + mctree_node_t* nodes = mctree->nodes; + + while (idx) + { + if(key_size == nodes[idx].str_size) { + if(memcmp((const void *)key, (const void *)(nodes[idx].str), key_size) == 0) { + return idx; + } + + idx = nodes[idx].child; + } + else if(key_size > nodes[idx].str_size) + { + if(key_size < nodes[ nodes[idx].next ].str_size) { + return 0; + } + + idx = nodes[idx].next; + } + else { + if(key_size > nodes[ nodes[idx].prev ].str_size) { + return 0; + } + + idx = nodes[idx].prev; + } + } + + return 0; +} + +mctree_index_t mctree_insert_child(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value) +{ + mctree_node_t* nodes = mctree->nodes; + mctree_index_t new_idx = mctree_node_get_free_id(mctree); + + nodes[idx].child = new_idx; + + nodes[new_idx].str = key; + nodes[new_idx].str_size = key_size; + nodes[new_idx].value = value; + + mctree_node_add(mctree); + + return new_idx; +} + +mctree_index_t mctree_insert_after(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value) +{ + mctree_node_t* nodes = mctree->nodes; + mctree_index_t new_idx = mctree_node_get_free_id(mctree); + + if(nodes[idx].next) { + nodes[ nodes[idx].next ].prev = new_idx; + nodes[new_idx].next = nodes[idx].next; + } + + nodes[idx].next = new_idx; + nodes[new_idx].prev = idx; + + nodes[new_idx].str = key; + nodes[new_idx].str_size = key_size; + nodes[new_idx].value = value; + + mctree_node_add(mctree); + + return new_idx; +} + +mctree_index_t mctree_insert_before(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value) +{ + mctree_node_t* nodes = mctree->nodes; + mctree_index_t new_idx = mctree_node_get_free_id(mctree); + + if(nodes[idx].prev) { + nodes[ nodes[idx].prev ].next = new_idx; + nodes[new_idx].prev = nodes[idx].prev; + } + + nodes[idx].prev = new_idx; + nodes[new_idx].next = idx; + + nodes[new_idx].str = key; + nodes[new_idx].str_size = key_size; + nodes[new_idx].value = value; + + mctree_node_add(mctree); + + return new_idx; +} + +mctree_index_t __mtree_insert_to_start(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert) +{ + mctree_node_t* nodes = mctree->nodes; + + while (idx) + { + if(key_size == nodes[idx].str_size) { + if(memcmp((const void *)key, (const void *)nodes[idx].str, key_size) == 0) + { + if(value) + nodes[idx].value = value; + + return idx; + } + + if(nodes[idx].child == 0) { + if(b_insert) + b_insert(key, key_size, &value); + + return mctree_insert_child(mctree, idx, key, key_size, value); + } + + idx = nodes[idx].child; + } + else if(key_size > nodes[idx].str_size) + { + if(nodes[idx].next == 0 || key_size < nodes[ nodes[idx].next ].str_size) { + if(b_insert) + b_insert(key, key_size, &value); + + return mctree_insert_after(mctree, idx, key, key_size, value); + } + + idx = nodes[idx].next; + } + else { + if(nodes[idx].prev == 0 || key_size > nodes[ nodes[idx].prev ].str_size) { + if(b_insert) + b_insert(key, key_size, &value); + + return mctree_insert_before(mctree, idx, key, key_size, value); + } + + idx = nodes[idx].prev; + } + } + + return 0; +} + +mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert) +{ + mctree_node_t* start = mctree->nodes; + + if(key_size > 0) { + mctree_index_t idx = mctree_make_first_idx(mctree, key, key_size); + + if(start[idx].child) { + return __mtree_insert_to_start(mctree, start[idx].child, key, key_size, value, b_insert); + } + else { + if(b_insert) + b_insert(key, key_size, &value); + + return mctree_insert_child(mctree, idx, key, key_size, value); + } + } + + return 0; +} + +mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size) +{ + mctree_node_t* start = mctree->nodes; + + if(key_size > 0) { + mctree_index_t idx = mctree_make_first_idx(mctree, key, key_size); + + if(start[idx].child) { + return __mtree_search_to_start(mctree, start[idx].child, key, key_size); + } + } + + return 0; +} + +mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size) +{ + mctree_node_t* start = mctree->nodes; + + if(key_size > 0) { + mctree_index_t idx = mctree_make_first_idx(mctree, key, key_size); + + if(start[idx].child) { + return __mtree_search_lowercase_to_start(mctree, start[idx].child, key, key_size); + } + } + + return 0; +} + + + diff --git a/source/mycore/utils/mctree.h b/source/mycore/utils/mctree.h new file mode 100644 index 0000000..2d848c3 --- /dev/null +++ b/source/mycore/utils/mctree.h @@ -0,0 +1,97 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MCTREE_H +#define MyCORE_UTILS_MCTREE_H +#pragma once + +#include "mycore/myosi.h" +#include "mycore/utils.h" + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define mctree_node_get_free_id(mctree) mctree->nodes_length + +#define mctree_node_clean(mctree, idx) \ + mctree->nodes[idx].str = NULL; \ + mctree->nodes[idx].value = NULL; \ + mctree->nodes[idx].child_count = 0; \ + mctree->nodes[idx].prev = 0; \ + mctree->nodes[idx].next = 0; \ + mctree->nodes[idx].child = 0 + +#define mctree_node_add(mctree) \ + mctree->nodes_length++; \ + if(mctree->nodes_length >= mctree->nodes_size) { \ + mctree->nodes_size = mctree->nodes_length + 4096; \ + mctree->nodes = (mctree_node_t*)mycore_realloc(mctree->nodes, \ + sizeof(mctree_node_t) * mctree->nodes_size); \ + } \ + mctree_node_clean(mctree, mctree->nodes_length) + +#define mctree_make_first_idx(mctree, key, size) \ + ((mycore_string_chars_lowercase_map[ (const unsigned char)(key[0]) ] + mycore_string_chars_lowercase_map[ (const unsigned char)(key[size - 1]) ]) % mctree->start_size) + 1 + + +typedef size_t mctree_index_t; + +struct mctree_node { + const char* str; + size_t str_size; + void* value; + + size_t child_count; + mctree_index_t prev; + mctree_index_t next; + mctree_index_t child; +} +typedef mctree_node_t; + +struct mctree_tree { + mctree_node_t* nodes; + size_t nodes_length; + size_t nodes_size; + + size_t start_size; +} +typedef mctree_t; + +typedef void (*mctree_before_insert_f)(const char* key, size_t key_size, void **value); + + +mctree_t * mctree_create(size_t start_size); +void mctree_clean(mctree_t* mctree); +mctree_t * mctree_destroy(mctree_t* mctree); + +mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert); +mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size); +mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* defined(__mhtml__mtree__) */ diff --git a/source/mycore/utils/mhash.c b/source/mycore/utils/mhash.c new file mode 100644 index 0000000..6d0f627 --- /dev/null +++ b/source/mycore/utils/mhash.c @@ -0,0 +1,275 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mhash.h" + +size_t mycore_utils_mhash_hash(const char* key, size_t key_size, size_t table_size) +{ + size_t hash, i; + + for(hash = i = 0; i < key_size; i++) + { + hash += key[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + + return hash % table_size; +} + +mycore_utils_mhash_t * mycore_utils_mhash_create(void) +{ + return mycore_calloc(1, sizeof(mycore_utils_mhash_t)); +} + +mystatus_t mycore_utils_mhash_init(mycore_utils_mhash_t* mhash, size_t table_size, size_t max_depth) +{ + mystatus_t status; + + mhash->mchar_obj = mchar_async_create(); + if(mhash->mchar_obj == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if((status = mchar_async_init(mhash->mchar_obj, 128, 4096))) + return status; + + /* nodest data for input char* */ + mhash->mchar_node = mchar_async_node_add(mhash->mchar_obj, &status); + if(status) + return status; + + if(table_size < 128) + table_size = 128; + + mhash->table = mycore_calloc(table_size, sizeof(mycore_utils_mhash_entry_t*)); + if(mhash->table == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if(max_depth < 1) + max_depth = 1; + + mhash->table_max_depth = max_depth; + mhash->table_size = table_size; + + return MyCORE_STATUS_OK; +} + +void mycore_utils_mhash_clean(mycore_utils_mhash_t* mhash) +{ + mchar_async_clean(mhash->mchar_obj); + memset(mhash->table, 0, (sizeof(mycore_utils_mhash_entry_t*) * mhash->table_size)); +} + +mycore_utils_mhash_t * mycore_utils_mhash_destroy(mycore_utils_mhash_t* mhash, bool self_destroy) +{ + if(mhash == NULL) + return NULL; + + if(mhash->table) { + mycore_free(mhash->table); + mhash->table = NULL; + } + + if(self_destroy) { + mycore_free(mhash->table); + return NULL; + } + + return mhash; +} + +mycore_utils_mhash_entry_t * mycore_utils_mhash_create_entry(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value) +{ + mycore_utils_mhash_entry_t *entry = (mycore_utils_mhash_entry_t*) + mchar_async_malloc(mhash->mchar_obj, mhash->mchar_node, sizeof(mycore_utils_mhash_entry_t)); + + entry->key = mchar_async_malloc(mhash->mchar_obj, mhash->mchar_node, (sizeof(char) * key_size) + 1); + + if(entry->key == NULL) { + mchar_async_free(mhash->mchar_obj, mhash->mchar_node, (char*)entry); + return NULL; + } + + memcpy(entry->key, key, (sizeof(char) * key_size)); + entry->key[key_size] = '\0'; + + entry->key_length = key_size; + entry->value = value; + entry->next = NULL; + + return entry; +} + +mycore_utils_mhash_entry_t * mycore_utils_mhash_add_with_choice(mycore_utils_mhash_t* mhash, const char* key, size_t key_size) +{ + if(key == NULL || key_size == 0) + return NULL; + + size_t hash_id = mycore_utils_mhash_hash(key, key_size, mhash->table_size); + + + mycore_utils_mhash_entry_t *entry; + + if(mhash->table[hash_id] == NULL) { + /* rebuild table if need */ + if(mhash->table_length >= (mhash->table_size - (mhash->table_size / 4))) { + mycore_utils_mhash_rebuld(mhash); + } + + mhash->table[hash_id] = mycore_utils_mhash_create_entry(mhash, key, key_size, NULL); + return mhash->table[hash_id]; + } + + size_t depth = 0; + entry = mhash->table[hash_id]; + + do { + if(entry->key_length == key_size) { + if(strncmp(entry->key, key, key_size) == 0) + return entry; + } + + if(entry->next == NULL) { + entry->next = mycore_utils_mhash_create_entry(mhash, key, key_size, NULL); + + if(depth > mhash->table_max_depth) { + mycore_utils_mhash_entry_t *entry_new = entry->next; + mycore_utils_mhash_rebuld(mhash); + + return entry_new; + } + + return entry->next; + } + + depth++; + entry = entry->next; + } + while(1); +} + +mycore_utils_mhash_entry_t * mycore_utils_mhash_add(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value) +{ + mycore_utils_mhash_entry_t *entry = mycore_utils_mhash_add_with_choice(mhash, key, key_size); + + if(entry) + entry->value = value; + + return entry; +} + +mycore_utils_mhash_entry_t * mycore_utils_mhash_search(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value) +{ + if(key == NULL || key_size == 0) + return NULL; + + size_t hash_id = mycore_utils_mhash_hash(key, key_size, mhash->table_size); + + mycore_utils_mhash_entry_t *entry = mhash->table[hash_id]; + + while(entry) { + if(entry->key_length == key_size) { + if(strncmp(entry->key, key, key_size) == 0) + return entry; + } + + entry = entry->next; + } + + return NULL; +} + +mycore_utils_mhash_entry_t * mycore_utils_mhash_entry_by_id(mycore_utils_mhash_t* mhash, size_t id) +{ + if(mhash->table_size > id) + return mhash->table[id]; + + return NULL; +} + +size_t mycore_utils_mhash_get_table_size(mycore_utils_mhash_t* mhash) +{ + return mhash->table_size; +} + +mycore_utils_mhash_entry_t * mycore_utils_mhash_rebuild_add_entry(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, mycore_utils_mhash_entry_t *ext_entry) +{ + if(key == NULL || key_size == 0) + return NULL; + + ext_entry->next = NULL; + + size_t hash_id = mycore_utils_mhash_hash(key, key_size, mhash->table_size); + + if(mhash->table[hash_id] == NULL) { + mhash->table[hash_id] = ext_entry; + return ext_entry; + } + + mycore_utils_mhash_entry_t *entry = mhash->table[hash_id]; + + do { + if(entry->next == NULL) { + entry->next = ext_entry; + break; + } + + entry = entry->next; + } + while(1); + + return ext_entry; +} + +mycore_utils_mhash_entry_t ** mycore_utils_mhash_rebuld(mycore_utils_mhash_t* mhash) +{ + mycore_utils_mhash_entry_t **table = mhash->table; + size_t size = mhash->table_size; + + mhash->table_size = mhash->table_size << 1; + mhash->table = mycore_calloc(mhash->table_size, sizeof(mycore_utils_mhash_entry_t*)); + + if(mhash->table == NULL) { + mhash->table = table; + mhash->table_size = size; + + return NULL; + } + + for(size_t i = 0; i < mhash->table_size; i++) { + mycore_utils_mhash_entry_t *entry = table[i]; + + while(entry) { + mycore_utils_mhash_rebuild_add_entry(mhash, entry->key, entry->key_length, entry); + + entry = entry->next; + } + } + + mycore_free(table); + + return mhash->table; +} + + diff --git a/source/mycore/utils/mhash.h b/source/mycore/utils/mhash.h new file mode 100644 index 0000000..c90a30c --- /dev/null +++ b/source/mycore/utils/mhash.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_MHASH_H +#define MyCORE_UTILS_MHASH_H + +#include + +#include "mycore/myosi.h" +#include "mycore/utils/mchar_async.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mycore_utils_mhash_entry mycore_utils_mhash_entry_t; + +struct mycore_utils_mhash_entry { + char* key; + size_t key_length; + + void *value; + + mycore_utils_mhash_entry_t* next; +}; + +struct mycore_utils_mhash { + mchar_async_t* mchar_obj; + size_t mchar_node; + + mycore_utils_mhash_entry_t** table; + size_t table_size; + size_t table_length; + + size_t table_max_depth; +} +typedef mycore_utils_mhash_t; + +mycore_utils_mhash_t * mycore_utils_mhash_create(void); +mystatus_t mycore_utils_mhash_init(mycore_utils_mhash_t* mhash, size_t table_size, size_t depth); +void mycore_utils_mhash_clean(mycore_utils_mhash_t* mhash); +mycore_utils_mhash_t * mycore_utils_mhash_destroy(mycore_utils_mhash_t* mhash, bool self_destroy); +mycore_utils_mhash_entry_t * mycore_utils_mhash_create_entry(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); + +mycore_utils_mhash_entry_t * mycore_utils_mhash_add(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); +mycore_utils_mhash_entry_t * mycore_utils_mhash_search(mycore_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); +mycore_utils_mhash_entry_t * mycore_utils_mhash_add_with_choice(mycore_utils_mhash_t* mhash, const char* key, size_t key_size); + +mycore_utils_mhash_entry_t * mycore_utils_mhash_entry_by_id(mycore_utils_mhash_t* mhash, size_t id); +size_t mycore_utils_mhash_get_table_size(mycore_utils_mhash_t* mhash); + +mycore_utils_mhash_entry_t ** mycore_utils_mhash_rebuld(mycore_utils_mhash_t* mhash); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyCORE_UTILS_MHASH_H */ diff --git a/source/mycore/utils/resources.h b/source/mycore/utils/resources.h new file mode 100644 index 0000000..da99a00 --- /dev/null +++ b/source/mycore/utils/resources.h @@ -0,0 +1,317 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyCORE_UTILS_RESOURCES_H +#define MyCORE_UTILS_RESOURCES_H +#pragma once + +#include + +#define MyCORE_STRING_MAP_CHAR_OTHER '\000' +#define MyCORE_STRING_MAP_CHAR_A_Z_a_z '\001' +#define MyCORE_STRING_MAP_CHAR_WHITESPACE '\002' + +static const unsigned char mycore_string_chars_num_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char mycore_string_chars_hex_map[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char mycore_string_chars_lowercase_map[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, + 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, + 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, + 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff +}; + +static const unsigned char mycore_string_chars_uppercase_map[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, + 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, + 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, + 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, + 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, + 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, + 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, + 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, + 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, + 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, + 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff +}; + +static const size_t replacement_character[] = { + 65533, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 8364, 129, 8218, 402, 8222, 8230, 8224, + 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, + 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, + 8482, 353, 8250, 339, 157, 382, 376 +}; + +static const size_t mycore_string_alphanumeric_character[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const size_t mycore_string_alpha_character[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, + 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff +}; + +static const unsigned char mycore_tokenizer_chars_map[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char mycore_string_hex_to_char_map[] = { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00 +}; + +static const char * mycore_string_char_to_two_hex_value[257] = { + "00", "01", "02", "03", "04", "05", "06", "07", + "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", + "10", "11", "12", "13", "14", "15", "16", "17", + "18", "19", "1A", "1B", "1C", "1D", "1E", "1F", + "20", "21", "22", "23", "24", "25", "26", "27", + "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", + "30", "31", "32", "33", "34", "35", "36", "37", + "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", + "40", "41", "42", "43", "44", "45", "46", "47", + "48", "49", "4A", "4B", "4C", "4D", "4E", "4F", + "50", "51", "52", "53", "54", "55", "56", "57", + "58", "59", "5A", "5B", "5C", "5D", "5E", "5F", + "60", "61", "62", "63", "64", "65", "66", "67", + "68", "69", "6A", "6B", "6C", "6D", "6E", "6F", + "70", "71", "72", "73", "74", "75", "76", "77", + "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", + "80", "81", "82", "83", "84", "85", "86", "87", + "88", "89", "8A", "8B", "8C", "8D", "8E", "8F", + "90", "91", "92", "93", "94", "95", "96", "97", + "98", "99", "9A", "9B", "9C", "9D", "9E", "9F", + "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", + "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF", + "B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", + "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", + "C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", + "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF", + "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", + "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", + "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", + "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF", + "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", + "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF", + NULL +}; + +#endif /* MyCORE_UTILS_RESOURCES_H */ diff --git a/source/mycss/Makefile.mk b/source/mycss/Makefile.mk index 3303402..51005aa 100644 --- a/source/mycss/Makefile.mk +++ b/source/mycss/Makefile.mk @@ -1,12 +1,13 @@ -find_files_h = $(wildcard $(SRCDIR)/mycss/$(dir)/*.h) -find_files_c = $(wildcard $(SRCDIR)/mycss/$(dir)/*.c) +mycss_dirs := . selectors namespace media values property declaration +mycss_objs := $(call MODEST_UTILS_OBJS,mycss,$(mycss_dirs)) -SUBDIRS := . selectors namespace media values property declaration -HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) -SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) +mycss_description := CSS parser and modules by https://drafts.csswg.org/ +mycss_dependencies := mycore myencoding myport -mycss_clone: MyCSS_DIR_$(SUBDIRS) +mycss_all: $(mycss_objs) -MyCSS_DIR_$(SUBDIRS): - mkdir -p $(INCLUDE_TMP)/mycss/$(patsubst MyCSS_DIR_%,%,$@) - cp $(SRCDIR)/mycss/$(patsubst MyCSS_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/mycss/$(patsubst MyCSS_DIR_%,%,$@)/ +mycss_clean: + rm -f $(mycss_objs) + +mycss_clone: + $(call MODEST_UTILS_HDRS_CLONE,mycss,$(mycss_dirs)) diff --git a/source/mycss/an_plus_b.c b/source/mycss/an_plus_b.c index c8b1b8f..038e0d6 100644 --- a/source/mycss/an_plus_b.c +++ b/source/mycss/an_plus_b.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,19 +19,19 @@ */ #include "mycss/an_plus_b.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" mycss_an_plus_b_t * mycss_an_plus_b_create(void) { - return (mycss_an_plus_b_t*)myhtml_calloc(1, sizeof(mycss_an_plus_b_t)); + return (mycss_an_plus_b_t*)mycore_calloc(1, sizeof(mycss_an_plus_b_t)); } -mycss_status_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb) +mystatus_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb) { return MyCSS_STATUS_OK; } -mycss_status_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb) +mystatus_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb) { return MyCSS_STATUS_OK; } @@ -42,7 +42,7 @@ mycss_an_plus_b_t * mycss_an_plus_b_destroy(mycss_an_plus_b_t* anb, bool self_de return NULL; if(self_destroy) { - myhtml_free(anb); + mycore_free(anb); return NULL; } @@ -91,7 +91,7 @@ void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry) //// An+B Serialization //// ///////////////////////////////////////////////////////// -void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycss_callback_serialization_f callback, void* context) +void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycore_callback_serialize_f callback, void* context) { char data[512]; @@ -137,10 +137,10 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool case MyCSS_TOKEN_TYPE_WHITESPACE: break; case MyCSS_TOKEN_TYPE_IDENT: { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); - if(myhtml_strncasecmp(str.data, "-n-", 3) == 0) + if(mycore_strncasecmp(str.data, "-n-", 3) == 0) { anb_entry->a = -1; @@ -149,7 +149,7 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } /* -n-* */ @@ -159,18 +159,18 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool anb_entry->is_broken = true; } - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_hyphen_n_hyphen_asterisk_end"); + MyCORE_DEBUG("mycss_an_plus_b_state_anb_hyphen_n_hyphen_asterisk_end"); entry->parser = entry->parser_switch; } - else if(myhtml_strncasecmp(str.data, "-n", 2) == 0) { - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_hyphen_n_end") + else if(mycore_strncasecmp(str.data, "-n", 2) == 0) { + MyCORE_DEBUG("mycss_an_plus_b_state_anb_hyphen_n_end"); anb_entry->a = -1; if(str.length == 2) { entry->parser = mycss_an_plus_b_state_anb_plus_n; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } @@ -182,14 +182,14 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool entry->parser = entry->parser_switch; } - else if(myhtml_strncasecmp(str.data, "n-", 2) == 0) + else if(mycore_strncasecmp(str.data, "n-", 2) == 0) { anb_entry->a = 1; if(str.length == 2) { entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } @@ -199,17 +199,17 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool anb_entry->is_broken = true; } - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n"); + MyCORE_DEBUG("mycss_an_plus_b_state_anb_n"); entry->parser = entry->parser_switch; } - else if(myhtml_strncasecmp(str.data, "n", 1) == 0) + else if(mycore_strncasecmp(str.data, "n", 1) == 0) { anb_entry->a = 1; if(str.length == 1) { entry->parser = mycss_an_plus_b_state_anb_plus_n; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } @@ -219,32 +219,32 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool anb_entry->is_broken = true; } - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n"); + MyCORE_DEBUG("mycss_an_plus_b_state_anb_n"); entry->parser = entry->parser_switch; } - else if(myhtml_strcasecmp(str.data, "even") == 0) { + else if(mycore_strcasecmp(str.data, "even") == 0) { anb_entry->a = 2; anb_entry->b = 0; - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_e_v_e_n") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_e_v_e_n"); entry->parser = entry->parser_switch; } - else if(myhtml_strcasecmp(str.data, "odd") == 0) { + else if(mycore_strcasecmp(str.data, "odd") == 0) { anb_entry->a = 2; anb_entry->b = 1; - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_o_d_d") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_o_d_d"); entry->parser = entry->parser_switch; } else { - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); mycss_an_plus_b_parser_expectations_error(entry); entry->parser = entry->parser_switch; return false; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); break; } case MyCSS_TOKEN_TYPE_DELIM: { @@ -261,31 +261,31 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool break; } case MyCSS_TOKEN_TYPE_NUMBER: { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); mycss_convert_data_to_integer(str.data, str.length, &anb_entry->b); - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_number") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_number"); entry->parser = entry->parser_switch; break; } case MyCSS_TOKEN_TYPE_DIMENSION: { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); size_t consumed_len = mycss_convert_data_to_integer(str.data, str.length, &anb_entry->a); - if(myhtml_strncasecmp(&str.data[consumed_len], "n-", 2) == 0) + if(mycore_strncasecmp(&str.data[consumed_len], "n-", 2) == 0) { size_t rem = str.length - consumed_len; if(rem == 2) { entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } @@ -295,17 +295,17 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool anb_entry->is_broken = true; } - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n_hyphen_asterisk_end") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_n_hyphen_asterisk_end"); entry->parser = entry->parser_switch; } - else if(myhtml_strncasecmp(&str.data[consumed_len], "n", 1) == 0) + else if(mycore_strncasecmp(&str.data[consumed_len], "n", 1) == 0) { size_t rem = (str.length - consumed_len) - 1; if(rem == 0) { entry->parser = mycss_an_plus_b_state_anb_plus_n; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } @@ -314,18 +314,18 @@ bool mycss_an_plus_b_state_anb(mycss_entry_t* entry, mycss_token_t* token, bool anb_entry->is_broken = true; } - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_n_end") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_n_end"); entry->parser = entry->parser_switch; } else { - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); mycss_an_plus_b_parser_expectations_error(entry); entry->parser = entry->parser_switch; return false; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); break; } default: { @@ -344,15 +344,15 @@ bool mycss_an_plus_b_state_anb_plus(mycss_entry_t* entry, mycss_token_t* token, switch (token->type) { case MyCSS_TOKEN_TYPE_IDENT: { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); - if(myhtml_strncasecmp(str.data, "n-", 2) == 0) + if(mycore_strncasecmp(str.data, "n-", 2) == 0) { if(str.length == 2) { entry->parser = mycss_an_plus_b_state_anb_plus_n_hyphen; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); return true; } @@ -362,22 +362,22 @@ bool mycss_an_plus_b_state_anb_plus(mycss_entry_t* entry, mycss_token_t* token, anb_entry->is_broken = true; } - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_hyphen_asterisk_end") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_plus_n_hyphen_asterisk_end"); entry->parser = entry->parser_switch; } - else if(myhtml_strncasecmp(str.data, "n", 1) == 0) { - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n") + else if(mycore_strncasecmp(str.data, "n", 1) == 0) { + MyCORE_DEBUG("mycss_an_plus_b_state_anb_plus_n"); entry->parser = mycss_an_plus_b_state_anb_plus_n; } else { - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); mycss_an_plus_b_parser_expectations_error(entry); entry->parser = entry->parser_switch; return false; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); break; } default: { @@ -399,9 +399,9 @@ bool mycss_an_plus_b_state_anb_plus_n_hyphen(mycss_entry_t* entry, mycss_token_t if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { /* begin from 0-9 */ - if(myhtml_string_chars_num_map[ (const unsigned char)(*token->data) ] != 0xff) + if(mycore_string_chars_num_map[ (const unsigned char)(*token->data) ] != 0xff) { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); long res; @@ -409,10 +409,10 @@ bool mycss_an_plus_b_state_anb_plus_n_hyphen(mycss_entry_t* entry, mycss_token_t anb_entry->b = -res; - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_hyphen_zero_hyphen_nine_end") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_plus_n_hyphen_zero_hyphen_nine_end"); entry->parser = entry->parser_switch; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } else { mycss_an_plus_b_parser_expectations_error(entry); @@ -454,15 +454,15 @@ bool mycss_an_plus_b_state_anb_plus_n(mycss_entry_t* entry, mycss_token_t* token case MyCSS_TOKEN_TYPE_NUMBER: { if(*token->data == '+' || *token->data == '-') { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); mycss_convert_data_to_integer(str.data, str.length, &anb_entry->b); - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_begin_plus_vertical_bar_hyphen") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_plus_n_begin_plus_vertical_bar_hyphen"); entry->parser = entry->parser_switch; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } else { mycss_an_plus_b_parser_expectations_error(entry); @@ -489,17 +489,17 @@ bool mycss_an_plus_b_state_anb_plus_n_plus(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { /* begin from 0-9 */ - if(myhtml_string_chars_num_map[ (const unsigned char)(*token->data) ] != 0xff) + if(mycore_string_chars_num_map[ (const unsigned char)(*token->data) ] != 0xff) { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); mycss_convert_data_to_integer(str.data, str.length, &anb_entry->b); - MyCSS_DEBUG_MESSAGE("mycss_an_plus_b_state_anb_plus_n_plus_zero_hyphen_nine_end") + MyCORE_DEBUG("mycss_an_plus_b_state_anb_plus_n_plus_zero_hyphen_nine_end"); entry->parser = entry->parser_switch; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } else { mycss_an_plus_b_parser_expectations_error(entry); diff --git a/source/mycss/an_plus_b.h b/source/mycss/an_plus_b.h index fd52aa8..7faa35c 100644 --- a/source/mycss/an_plus_b.h +++ b/source/mycss/an_plus_b.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,15 +45,15 @@ struct mycss_an_plus_b_entry { }; mycss_an_plus_b_t * mycss_an_plus_b_create(void); -mycss_status_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb); -mycss_status_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb); +mystatus_t mycss_an_plus_b_init(mycss_entry_t* entry, mycss_an_plus_b_t* anb); +mystatus_t mycss_an_plus_b_clean_all(mycss_an_plus_b_t* anb); mycss_an_plus_b_t * mycss_an_plus_b_destroy(mycss_an_plus_b_t* anb, bool self_destroy); mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry); void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry); mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy); -void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycss_callback_serialization_f callback, void* context); +void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycore_callback_serialize_f callback, void* context); void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry); diff --git a/source/mycss/api.h b/source/mycss/api.h index 9111bf5..9daef46 100644 --- a/source/mycss/api.h +++ b/source/mycss/api.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -36,10 +36,14 @@ */ #define MyCSS_VERSION_MAJOR 0 -#define MyCSS_VERSION_MINOR 0 -#define MyCSS_VERSION_PATCH 9 +#define MyCSS_VERSION_MINOR 1 +#define MyCSS_VERSION_PATCH 0 -#include "myhtml/api.h" +#include +#include +#include +#include +#include #ifdef __cplusplus extern "C" { @@ -52,7 +56,6 @@ extern "C" { // base /* Very important!!! - see modest/myosi.h:modest_status_tv */ enum mycss_status { MyCSS_STATUS_OK = 0x000000, @@ -185,7 +188,7 @@ mycss_create(void); * * @return MyCSS_STATUS_OK if successful, otherwise an error status value. */ -mycss_status_t +mystatus_t mycss_init(mycss_t* mycss); /** @@ -203,7 +206,7 @@ mycss_destroy(mycss_t* mycss, bool self_destroy); * Parsing CSS * * @param[in] previously created structure mycss_entry_t* - * @param[in] Now is not working! Coming Soon. Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Now is not working! Coming Soon. Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] CSS data * @param[in] CSS data size * @@ -211,8 +214,8 @@ mycss_destroy(mycss_t* mycss, bool self_destroy); * * @return MyCSS_STATUS_OK if successful, otherwise an error status */ -mycss_status_t -mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); +mystatus_t +mycss_parse(mycss_entry_t* entry, myencoding_t encoding, const char* css, size_t css_size); /** * Parsing CSS chunk. For End Parsing call mycss_parse_chunk_end function @@ -225,7 +228,7 @@ mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, s * * @return MyCSS_STATUS_OK if successful, otherwise an error status */ -mycss_status_t +mystatus_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); /** @@ -235,7 +238,7 @@ mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); * * @return MyCSS_STATUS_OK if successful, otherwise an error status */ -mycss_status_t +mystatus_t mycss_parse_chunk_end(mycss_entry_t* entry); /*********************************************************************************** @@ -260,7 +263,7 @@ mycss_entry_create(void); * * @return MyCSS_STATUS_OK if successful, otherwise an error status value. */ -mycss_status_t +mystatus_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); /** @@ -270,7 +273,7 @@ mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); * * @return MyCSS_STATUS_OK if successful, otherwise an error status value. */ -mycss_status_t +mystatus_t mycss_entry_clean_all(mycss_entry_t* entry); /** @@ -321,9 +324,9 @@ mycss_entry_token_count(mycss_entry_t* entry); * * @param[in] mycss_entry_t* * - * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + * @return mycore_incoming_buffer_t* if successful, otherwise an NULL value. */ -myhtml_incoming_buffer_t* +mycore_incoming_buffer_t* mycss_entry_incoming_buffer_current(mycss_entry_t* entry); /** @@ -332,9 +335,9 @@ mycss_entry_incoming_buffer_current(mycss_entry_t* entry); * * @param[in] mycss_entry_t* * - * @return myhtml_incoming_buffer_t* if successful, otherwise an NULL value. + * @return mycore_incoming_buffer_t* if successful, otherwise an NULL value. */ -myhtml_incoming_buffer_t* +mycore_incoming_buffer_t* mycss_entry_incoming_buffer_first(mycss_entry_t* entry); /*********************************************************************************** @@ -400,14 +403,14 @@ mycss_token_name_by_type(mycss_token_type_t type); * * @param[in] mycss_entry_t* * @param[in] mycss_token_t*, token from which data will be obtained - * @param[in] myhtml_string_t*, a pointer to the row in which the data will be written - * @param[in] initialization myhtml_string_t* object + * @param[in] mycore_string_t*, a pointer to the row in which the data will be written + * @param[in] initialization mycore_string_t* object * * @return length of processed data */ size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, - myhtml_string_t* str, bool init_string); + mycore_string_t* str, bool init_string); /*********************************************************************************** * @@ -424,20 +427,20 @@ mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, * @param[in] mycss_entry_t* * @param[in] Input character encoding. * See https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h - * myhtml_encoding_t + * myencoding_t * */ void -mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); +mycss_encoding_set(mycss_entry_t* entry, myencoding_t encoding); /** * Get character encoding for current stream * * @param[in] mycss_entry_t* * - * @return myhtml_encoding_t + * @return myencoding_t */ -myhtml_encoding_t +myencoding_t mycss_encoding_get(mycss_entry_t* entry); /** @@ -446,16 +449,16 @@ mycss_encoding_get(mycss_entry_t* entry); * See for information: * https://www.w3.org/TR/css-syntax-3/#get-an-encoding * https://www.w3.org/TR/css-syntax-3/#charset-rule - * myhtml_encoding_by_name in https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h + * myencoding_by_name in https://github.com/lexborisov/myhtml/blob/master/source/myhtml/api.h * - * If @charset rule is missing or encoding not found return MyHTML_ENCODING_UTF_8 by default + * If @charset rule is missing or encoding not found return MyENCODING_UTF_8 by default * * @param[in] css data stream * @param[in] css data stream size * - * @return myhtml_encoding_t + * @return myencoding_t */ -myhtml_encoding_t +myencoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); /*********************************************************************************** diff --git a/source/mycss/check.c b/source/mycss/check.c index fb2d051..ff1da93 100644 --- a/source/mycss/check.c +++ b/source/mycss/check.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -33,7 +33,7 @@ ///////////////////////////////////////////////////////// bool mycss_check_two_code_points_valid_escape_chunk(mycss_entry_t* entry, size_t css_offset) { - myhtml_incoming_buffer_t* buffer = entry->current_buffer; + mycore_incoming_buffer_t* buffer = entry->current_buffer; MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED @@ -51,7 +51,7 @@ bool mycss_check_two_code_points_valid_escape_chunk(mycss_entry_t* entry, size_t bool mycss_check_three_code_points_would_start_identifier_chunk(mycss_entry_t* entry, size_t css_offset) { - myhtml_incoming_buffer_t* buffer = entry->current_buffer; + mycore_incoming_buffer_t* buffer = entry->current_buffer; MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED const unsigned char *u_css = (const unsigned char*)buffer->data; @@ -82,7 +82,7 @@ bool mycss_check_three_code_points_would_start_identifier_chunk(mycss_entry_t* e bool mycss_check_three_code_points_would_start_number_chunk(mycss_entry_t* entry, size_t css_offset) { - myhtml_incoming_buffer_t* buffer = entry->current_buffer; + mycore_incoming_buffer_t* buffer = entry->current_buffer; MyCSS_CHECK_CHUNK_POSITION_AND_SET_IF_NEED diff --git a/source/mycss/check.h b/source/mycss/check.h index 1d0ab5c..057e229 100644 --- a/source/mycss/check.h +++ b/source/mycss/check.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/convert.c b/source/mycss/convert.c index c4e2959..a973d51 100644 --- a/source/mycss/convert.c +++ b/source/mycss/convert.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,9 +19,9 @@ */ #include "convert.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" -const char * mycss_convert_split_dimension_string(myhtml_string_t* str, double* value, bool* is_float) +const char * mycss_convert_split_dimension_string(mycore_string_t* str, double* value, bool* is_float) { size_t length = mycss_convert_data_to_double(str->data, str->length, value, is_float); return &str->data[length]; @@ -177,9 +177,9 @@ size_t mycss_convert_data_to_integer(const char* data, size_t size, long* return const unsigned char* u_data = (const unsigned char*)data; - while(offset < size && myhtml_string_chars_num_map[u_data[offset]] != 0xff) + while(offset < size && mycore_string_chars_num_map[u_data[offset]] != 0xff) { - res_num = myhtml_string_chars_num_map[ u_data[offset] ] + res_num * 10; + res_num = mycore_string_chars_num_map[ u_data[offset] ] + res_num * 10; ++offset; } @@ -200,9 +200,9 @@ size_t mycss_convert_hex_to_codepoint(const char *data, size_t size, size_t *cod while(length < size) { - if(myhtml_string_chars_hex_map[u_data[length]] != 0xff) { + if(mycore_string_chars_hex_map[u_data[length]] != 0xff) { *codepoint <<= 4; - *codepoint |= myhtml_string_chars_hex_map[ u_data[length] ]; + *codepoint |= mycore_string_chars_hex_map[ u_data[length] ]; --max_consumed; @@ -233,10 +233,10 @@ size_t mycss_convert_unicode_range_to_codepoint(const char *data, size_t size, s do { *start <<= 4; - *start |= myhtml_string_chars_hex_map[ 0x30 ]; // 0x30 == '0' + *start |= mycore_string_chars_hex_map[ 0x30 ]; // 0x30 == '0' *end <<= 4; - *end |= myhtml_string_chars_hex_map[ 0x46 ]; // 0x46 == 'F' + *end |= mycore_string_chars_hex_map[ 0x46 ]; // 0x46 == 'F' ++length; } diff --git a/source/mycss/convert.h b/source/mycss/convert.h index 5f89572..b311eae 100644 --- a/source/mycss/convert.h +++ b/source/mycss/convert.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,7 +30,7 @@ extern "C" { #include "mycss/entry.h" #include "myhtml/mystring.h" -const char * mycss_convert_split_dimension_string(myhtml_string_t* str, double* value, bool* is_float); +const char * mycss_convert_split_dimension_string(mycore_string_t* str, double* value, bool* is_float); size_t mycss_convert_data_to_integer(const char* data, size_t size, long* return_num); size_t mycss_convert_data_to_double(const char *data, size_t size, double *return_num, bool* is_float); diff --git a/source/mycss/declaration/default.c b/source/mycss/declaration/default.c index 9ef4ea1..1963ffc 100644 --- a/source/mycss/declaration/default.c +++ b/source/mycss/declaration/default.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/default.h b/source/mycss/declaration/default.h index 49cc968..8e3a32e 100644 --- a/source/mycss/declaration/default.h +++ b/source/mycss/declaration/default.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/default_entries.h b/source/mycss/declaration/default_entries.h index f1d0df5..5016ec3 100644 --- a/source/mycss/declaration/default_entries.h +++ b/source/mycss/declaration/default_entries.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/default_resources.h b/source/mycss/declaration/default_resources.h index 682e305..245b841 100644 --- a/source/mycss/declaration/default_resources.h +++ b/source/mycss/declaration/default_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/entry.c b/source/mycss/declaration/entry.c index 2d3c519..f743ead 100644 --- a/source/mycss/declaration/entry.c +++ b/source/mycss/declaration/entry.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,7 @@ #include "mycss/declaration/entry.h" #include "mycss/declaration/entry_destroy_resources.h" -mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status) +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, mystatus_t* status) { mycss_declaration_entry_t *dec_entry = mcobject_malloc(declaration->mcobject_entries, status); memset(dec_entry, 0, sizeof(mycss_declaration_entry_t)); diff --git a/source/mycss/declaration/entry.h b/source/mycss/declaration/entry.h index 4206fa1..9455adc 100644 --- a/source/mycss/declaration/entry.h +++ b/source/mycss/declaration/entry.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,7 +31,7 @@ extern "C" { #endif -mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, mystatus_t* status); void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); mycss_declaration_entry_t * mycss_declaration_entry_destroy(mycss_declaration_t* declaration, mycss_declaration_entry_t* decl_entry, bool self_destroy); diff --git a/source/mycss/declaration/entry_destroy.c b/source/mycss/declaration/entry_destroy.c index dae22a9..8bbf090 100644 --- a/source/mycss/declaration/entry_destroy.c +++ b/source/mycss/declaration/entry_destroy.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/entry_destroy.h b/source/mycss/declaration/entry_destroy.h index f946a75..38dac05 100644 --- a/source/mycss/declaration/entry_destroy.h +++ b/source/mycss/declaration/entry_destroy.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/entry_destroy_resources.h b/source/mycss/declaration/entry_destroy_resources.h index 6d21555..206fafe 100644 --- a/source/mycss/declaration/entry_destroy_resources.h +++ b/source/mycss/declaration/entry_destroy_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/init.c b/source/mycss/declaration/init.c index 056e14c..e2a9d0d 100644 --- a/source/mycss/declaration/init.c +++ b/source/mycss/declaration/init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,10 +23,10 @@ mycss_declaration_t * mycss_declaration_create(void) { - return (mycss_declaration_t*)myhtml_calloc(1, sizeof(mycss_declaration_t)); + return (mycss_declaration_t*)mycore_calloc(1, sizeof(mycss_declaration_t)); } -mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration) +mystatus_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration) { declaration->ref_entry = entry; declaration->entry = NULL; @@ -37,7 +37,7 @@ mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* if(declaration->mcobject_entries == NULL) return MyCSS_STATUS_ERROR_DECLARATION_ENTRY_CREATE; - myhtml_status_t myhtml_status = mcobject_init(declaration->mcobject_entries, 256, sizeof(mycss_declaration_entry_t)); + mystatus_t myhtml_status = mcobject_init(declaration->mcobject_entries, 256, sizeof(mycss_declaration_entry_t)); if(myhtml_status) return MyCSS_STATUS_ERROR_DECLARATION_ENTRY_INIT; @@ -78,7 +78,7 @@ mycss_declaration_t * mycss_declaration_destroy(mycss_declaration_t* declaration declaration->stack = mycss_stack_destroy(declaration->stack, true); if(self_destroy) { - myhtml_free(declaration); + mycore_free(declaration); return NULL; } @@ -106,7 +106,7 @@ mycss_token_type_t mycss_declaration_ending_token_type(mycss_declaration_t* decl return declaration->ending_token; } -mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status) +mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status) { if(data == NULL || data_size == 0) { if(out_status) @@ -137,7 +137,7 @@ mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declara /* parsing */ mycss_encoding_set(entry, encoding); - mycss_status_t status = mycss_tokenizer_chunk(entry, data, data_size); + mystatus_t status = mycss_tokenizer_chunk(entry, data, data_size); if(status != MyCSS_STATUS_OK) { if(out_status) *out_status = status; diff --git a/source/mycss/declaration/init.h b/source/mycss/declaration/init.h index a439e99..c03e50b 100644 --- a/source/mycss/declaration/init.h +++ b/source/mycss/declaration/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,18 +30,18 @@ extern "C" { #endif mycss_declaration_t * mycss_declaration_create(void); -mycss_status_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration); +mystatus_t mycss_declaration_init(mycss_entry_t* entry, mycss_declaration_t* declaration); void mycss_declaration_clean_all(mycss_declaration_t* declaration); void mycss_declaration_clean(mycss_declaration_t* declaration); mycss_declaration_t * mycss_declaration_destroy(mycss_declaration_t* declaration, bool self_destroy); void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry); -mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status); +mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, mystatus_t* status); void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry); void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry); -mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); +mycss_declaration_entry_t * mycss_declaration_parse(mycss_declaration_t* declaration, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status); mycss_token_type_t mycss_declaration_ending_token_type(mycss_declaration_t* declaration); void mycss_declaration_ending_token_type_set(mycss_declaration_t* declaration, mycss_token_type_t ending_token_type); diff --git a/source/mycss/declaration/myosi.h b/source/mycss/declaration/myosi.h index 2169cdf..ddf6727 100644 --- a/source/mycss/declaration/myosi.h +++ b/source/mycss/declaration/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ #include "mycss/stack.h" #include "mycss/values/units.h" #include "mycss/property/myosi.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mcobject.h" #ifdef __cplusplus extern "C" { diff --git a/source/mycss/declaration/parser.c b/source/mycss/declaration/parser.c index 74278ab..386ec5b 100644 --- a/source/mycss/declaration/parser.c +++ b/source/mycss/declaration/parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -38,7 +38,7 @@ void mycss_declaration_parser_ident(mycss_entry_t* entry, mycss_token_t* token) else mycss_declaration_entry_clean(dec_entry); - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); const mycss_property_index_static_entry_t *prop_entry = mycss_property_index_entry_by_name(str.data, str.length); @@ -53,7 +53,7 @@ void mycss_declaration_parser_ident(mycss_entry_t* entry, mycss_token_t* token) entry->parser = mycss_declaration_state_parse_error; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } void mycss_declaration_parser_end(mycss_entry_t* entry, mycss_token_t* token) diff --git a/source/mycss/declaration/parser.h b/source/mycss/declaration/parser.h index ee94963..fa8e3ea 100644 --- a/source/mycss/declaration/parser.h +++ b/source/mycss/declaration/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/serialization.c b/source/mycss/declaration/serialization.c index 9c2851a..5f29ec7 100644 --- a/source/mycss/declaration/serialization.c +++ b/source/mycss/declaration/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,7 @@ #include "mycss/declaration/serialization.h" #include "mycss/declaration/serialization_resources.h" -static void mycss_declaration_serialization_important_if_need(mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context) +static void mycss_declaration_serialization_important_if_need(mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context) { if(dec_entry->is_important) { callback(" !important", 11, context); @@ -29,7 +29,7 @@ static void mycss_declaration_serialization_important_if_need(mycss_declaration_ } bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -42,7 +42,7 @@ bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declarati } bool mycss_declaration_serialization_entry_only_value(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -52,7 +52,7 @@ bool mycss_declaration_serialization_entry_only_value(mycss_entry_t* entry, mycs bool mycss_declaration_serialization_entry_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL || property_type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY) return false; @@ -66,7 +66,7 @@ bool mycss_declaration_serialization_entry_by_type(mycss_entry_t* entry, mycss_d bool mycss_declaration_serialization_entry_only_value_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL || property_type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY) return false; @@ -76,7 +76,7 @@ bool mycss_declaration_serialization_entry_only_value_by_type(mycss_entry_t* ent void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(first_dec_entry == NULL) return; @@ -94,7 +94,7 @@ void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declara } bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -106,7 +106,7 @@ bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declarati } bool mycss_declaration_serialization_shorthand_four(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL || dec_entry->value == NULL) return false; @@ -146,7 +146,7 @@ bool mycss_declaration_serialization_shorthand_four(mycss_entry_t* entry, mycss_ } bool mycss_declaration_serialization_shorthand_two(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL || dec_entry->value == NULL) return false; @@ -172,7 +172,7 @@ bool mycss_declaration_serialization_shorthand_two(mycss_entry_t* entry, mycss_d } bool mycss_declaration_serialization_shorthand_two_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL || dec_entry->value == NULL) return false; @@ -195,7 +195,7 @@ bool mycss_declaration_serialization_shorthand_two_type(mycss_entry_t* entry, my } bool mycss_declaration_serialization_type_list(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -218,7 +218,7 @@ bool mycss_declaration_serialization_type_list(mycss_entry_t* entry, mycss_decla } bool mycss_declaration_serialization_text_decoration(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -255,7 +255,7 @@ bool mycss_declaration_serialization_text_decoration(mycss_entry_t* entry, mycss } bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -271,11 +271,11 @@ bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_dec callback(", ", 2, context); if(font_family->entries[i].type == MyCSS_VALUES_FONT_FAMILY_TYPE_GENERIC) { - mycss_property_serialization_value(font_family->entries[i].prop_type, NULL, callback, context); + mycss_property_serialization_value(font_family->entries[i].value.prop_type, NULL, callback, context); } else if(font_family->entries[i].type == MyCSS_VALUES_FONT_FAMILY_TYPE_NAME) { callback("\"", 1, context); - myhtml_string_t *str = &font_family->entries[i].str; + mycore_string_t *str = &font_family->entries[i].value.str; callback(str->data, str->length, context); callback("\"", 1, context); } @@ -286,7 +286,7 @@ bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_dec } bool mycss_declaration_serialization_font(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -345,7 +345,7 @@ bool mycss_declaration_serialization_font(mycss_entry_t* entry, mycss_declaratio } bool mycss_declaration_serialization_border_radius(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -427,7 +427,7 @@ bool mycss_declaration_serialization_border_radius(mycss_entry_t* entry, mycss_d } bool mycss_declaration_serialization_text_decoration_line(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -442,7 +442,7 @@ bool mycss_declaration_serialization_text_decoration_line(mycss_entry_t* entry, } bool mycss_declaration_serialization_text_decoration_skip(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -457,7 +457,7 @@ bool mycss_declaration_serialization_text_decoration_skip(mycss_entry_t* entry, } bool mycss_declaration_serialization_background(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -521,7 +521,7 @@ bool mycss_declaration_serialization_background(mycss_entry_t* entry, mycss_decl } bool mycss_declaration_serialization_background_image(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -544,7 +544,7 @@ bool mycss_declaration_serialization_background_image(mycss_entry_t* entry, mycs } bool mycss_declaration_serialization_background_repeat(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -574,7 +574,7 @@ bool mycss_declaration_serialization_background_repeat(mycss_entry_t* entry, myc } bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -587,23 +587,23 @@ bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, m if(position->one.type) { o_e = true; - mycss_property_serialization_value(position->one.type, position->one.length, callback, context); + mycss_property_serialization_value(position->one.type, position->one.value.length, callback, context); } if(position->two.type) { if(o_e) callback(" ", 1, context); else o_e = true; - mycss_property_serialization_value(position->two.type, position->two.length, callback, context); + mycss_property_serialization_value(position->two.type, position->two.value.length, callback, context); } if(position->three.type) { if(o_e) callback(" ", 1, context); else o_e = true; - mycss_property_serialization_value(position->three.type, position->three.length, callback, context); + mycss_property_serialization_value(position->three.type, position->three.value.length, callback, context); } if(position->four.type) { if(o_e) callback(" ", 1, context); - mycss_property_serialization_value(position->four.type, position->four.length, callback, context); + mycss_property_serialization_value(position->four.type, position->four.value.length, callback, context); } mycss_declaration_serialization_important_if_need(dec_entry, callback, context); @@ -612,7 +612,7 @@ bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, m } bool mycss_declaration_serialization_background_size(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; @@ -635,7 +635,7 @@ bool mycss_declaration_serialization_background_size(mycss_entry_t* entry, mycss } bool mycss_declaration_serialization_border_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { if(dec_entry == NULL) return false; diff --git a/source/mycss/declaration/serialization.h b/source/mycss/declaration/serialization.h index b6fe723..d561d48 100644 --- a/source/mycss/declaration/serialization.h +++ b/source/mycss/declaration/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,31 +32,31 @@ extern "C" { #endif typedef bool (*mycss_declaration_serialization_f)(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, - mycss_callback_serialization_f callback, void* context); + mycore_callback_serialize_f callback, void* context); -bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_entry_only_value(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_entry_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_entry_only_value_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycss_callback_serialization_f callback, void* context); +bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_entry_only_value(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_entry_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_entry_only_value_by_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_property_type_t property_type, mycore_callback_serialize_f callback, void* context); -bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_shorthand_four(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_shorthand_two(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_shorthand_two_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_type_list(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_border_radius(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_text_decoration(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_text_decoration_line(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_text_decoration_skip(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_font(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_image(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_repeat(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_background_size(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); -bool mycss_declaration_serialization_border_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context); +bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_shorthand_four(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_shorthand_two(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_shorthand_two_type(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_type_list(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_border_radius(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_text_decoration(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_text_decoration_line(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_text_decoration_skip(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_font_family(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_font(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_image(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_repeat(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_position(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_background_size(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); +bool mycss_declaration_serialization_border_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/declaration/serialization_resources.h b/source/mycss/declaration/serialization_resources.h index a9fa1a1..09ff31b 100644 --- a/source/mycss/declaration/serialization_resources.h +++ b/source/mycss/declaration/serialization_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/declaration/state.c b/source/mycss/declaration/state.c index 04f0512..aa81086 100644 --- a/source/mycss/declaration/state.c +++ b/source/mycss/declaration/state.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -99,11 +99,11 @@ bool mycss_declaration_state_colon_before_important(mycss_entry_t* entry, mycss_ bool mycss_declaration_state_colon_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response) { if(token->type == MyCSS_TOKEN_TYPE_IDENT) { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, true); - if(myhtml_strcmp(str.data, "important") == 0) { - myhtml_string_destroy(&str, false); + if(mycore_strcmp(str.data, "important") == 0) { + mycore_string_destroy(&str, false); entry->parser = mycss_declaration_state_colon_delim_after_important; (entry->declaration->entry_last)->is_important = true; @@ -111,7 +111,7 @@ bool mycss_declaration_state_colon_important(mycss_entry_t* entry, mycss_token_t return true; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); /* parse error */ entry->parser = mycss_declaration_state_parse_error; diff --git a/source/mycss/declaration/state.h b/source/mycss/declaration/state.h index 0884a21..85a5664 100644 --- a/source/mycss/declaration/state.h +++ b/source/mycss/declaration/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/entry.c b/source/mycss/entry.c index ba4c46e..85b5d27 100644 --- a/source/mycss/entry.c +++ b/source/mycss/entry.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,11 +23,13 @@ mycss_entry_t * mycss_entry_create(void) { - return (mycss_entry_t*)myhtml_calloc(1, sizeof(mycss_entry_t)); + return (mycss_entry_t*)mycore_calloc(1, sizeof(mycss_entry_t)); } -mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) +mystatus_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) { + mystatus_t status; + entry->mycss = mycss; entry->parser = NULL; entry->parser_switch = NULL; @@ -35,9 +37,21 @@ mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) entry->parser_ending_token = MyCSS_TOKEN_TYPE_UNDEF; // Other init - entry->mchar = mchar_async_create(128, (4096 * 5)); - entry->mchar_node_id = mchar_async_node_add(entry->mchar); - entry->mchar_value_node_id = mchar_async_node_add(entry->mchar); + entry->mchar = mchar_async_create(); + if(entry->mchar == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if((status = mchar_async_init(entry->mchar, 128, (4096 * 5)))) + return status; + + /* init data nodes for save input char* */ + entry->mchar_node_id = mchar_async_node_add(entry->mchar, &status); + if(status) + return status; + + entry->mchar_value_node_id = mchar_async_node_add(entry->mchar, &status); + if(status) + return status; entry->parser_list = mycss_entry_parser_list_create_and_init(128); @@ -49,7 +63,7 @@ mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) if(entry->mcobject_string_entries == NULL) return MyCSS_STATUS_ERROR_STRING_CREATE; - myhtml_status_t myhtml_status = mcobject_init(entry->mcobject_string_entries, 256, sizeof(myhtml_string_t)); + mystatus_t myhtml_status = mcobject_init(entry->mcobject_string_entries, 256, sizeof(mycore_string_t)); if(myhtml_status) return MyCSS_STATUS_ERROR_STRING_INIT; @@ -58,7 +72,7 @@ mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) if(entry->selectors == NULL) return MyCSS_STATUS_ERROR_SELECTORS_CREATE; - mycss_status_t status = mycss_selectors_init(entry, entry->selectors); + status = mycss_selectors_init(entry, entry->selectors); if(status != MyCSS_STATUS_OK) return status; @@ -103,7 +117,7 @@ mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) if(entry->mcobject_incoming_buffer == NULL) return MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_CREATE; - myhtml_status = mcobject_init(entry->mcobject_incoming_buffer, 256, sizeof(myhtml_incoming_buffer_t)); + myhtml_status = mcobject_init(entry->mcobject_incoming_buffer, 256, sizeof(mycore_incoming_buffer_t)); if(myhtml_status) return MyCSS_STATUS_ERROR_ENTRY_INCOMING_BUFFER_INIT; @@ -113,7 +127,7 @@ mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry) return MyCSS_STATUS_OK; } -mycss_status_t mycss_entry_clean(mycss_entry_t* entry) +mystatus_t mycss_entry_clean(mycss_entry_t* entry) { mcobject_clean(entry->mcobject_incoming_buffer); mycss_entry_parser_list_clean(entry->parser_list); @@ -138,7 +152,7 @@ mycss_status_t mycss_entry_clean(mycss_entry_t* entry) return MyCSS_STATUS_OK; } -mycss_status_t mycss_entry_clean_all(mycss_entry_t* entry) +mystatus_t mycss_entry_clean_all(mycss_entry_t* entry) { mcobject_clean(entry->mcobject_incoming_buffer); mchar_async_node_clean(entry->mchar, entry->mchar_node_id); @@ -189,12 +203,12 @@ mycss_entry_t * mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy) entry->mcobject_incoming_buffer = mcobject_destroy(entry->mcobject_incoming_buffer, true); if(entry->token) { - myhtml_free(entry->token); + mycore_free(entry->token); entry->token = NULL; } if(self_destroy) { - myhtml_free(entry); + mycore_free(entry); return NULL; } @@ -212,14 +226,14 @@ mycss_selectors_t * mycss_entry_selectors(mycss_entry_t* entry) return entry->selectors; } -myhtml_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size) +mycore_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size) { - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); if(str == NULL) return NULL; - myhtml_string_init(entry->mchar, entry->mchar_node_id, str, (string_size + 1)); + mycore_string_init(entry->mchar, entry->mchar_node_id, str, (string_size + 1)); return str; } @@ -237,12 +251,12 @@ size_t mycss_entry_token_count(mycss_entry_t* entry) return entry->token_counter; } -myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry) +mycore_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry) { return entry->current_buffer; } -myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry) +mycore_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry) { return entry->first_buffer; } @@ -275,17 +289,17 @@ void mycss_entry_parser_original_set(mycss_entry_t* entry, mycss_parser_token_f /* parser list */ mycss_entry_parser_list_t * mycss_entry_parser_list_create_and_init(size_t size) { - mycss_entry_parser_list_t* parser_list = myhtml_malloc(sizeof(mycss_entry_parser_list_t)); + mycss_entry_parser_list_t* parser_list = mycore_malloc(sizeof(mycss_entry_parser_list_t)); if(parser_list == NULL) return NULL; parser_list->length = 0; parser_list->size = size; - parser_list->list = myhtml_malloc(parser_list->size * sizeof(mycss_entry_parser_list_entry_t)); + parser_list->list = mycore_malloc(parser_list->size * sizeof(mycss_entry_parser_list_entry_t)); if(parser_list->list == NULL) { - myhtml_free(parser_list); + mycore_free(parser_list); return NULL; } @@ -303,19 +317,19 @@ mycss_entry_parser_list_t * mycss_entry_parser_list_destroy(mycss_entry_parser_l return NULL; if(parser_list->list) { - myhtml_free(parser_list->list); + mycore_free(parser_list->list); parser_list->list = NULL; } if(self_destroy) { - myhtml_free(parser_list); + mycore_free(parser_list); return NULL; } return parser_list; } -mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, +mystatus_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, mycss_parser_token_f parser_switch, mycss_token_type_t ending_token, bool is_local) { @@ -324,7 +338,7 @@ mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_t if(parser_list->length >= parser_list->size) { size_t new_size = parser_list->length + 1024; - mycss_entry_parser_list_entry_t *new_list = myhtml_realloc(parser_list->list, new_size * sizeof(mycss_entry_parser_list_entry_t)); + mycss_entry_parser_list_entry_t *new_list = mycore_realloc(parser_list->list, new_size * sizeof(mycss_entry_parser_list_entry_t)); if(new_list) { parser_list->size = new_size; diff --git a/source/mycss/entry.h b/source/mycss/entry.h index ebb104a..c0dab41 100644 --- a/source/mycss/entry.h +++ b/source/mycss/entry.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -40,8 +40,8 @@ extern "C" { #include "mycss/declaration/entry.h" #include "mycss/media/myosi.h" #include "mycss/media/init.h" -#include "myhtml/utils/mcobject.h" -#include "myhtml/utils/mchar_async.h" +#include "mycore/utils/mcobject.h" +#include "mycore/utils/mchar_async.h" struct mycss_entry_parser_list_entry { mycss_parser_token_f parser; @@ -83,12 +83,12 @@ struct mycss_entry { /* incoming buffer */ mcobject_t* mcobject_incoming_buffer; - myhtml_incoming_buffer_t* first_buffer; - myhtml_incoming_buffer_t* current_buffer; + mycore_incoming_buffer_t* first_buffer; + mycore_incoming_buffer_t* current_buffer; /* options */ mycss_entry_type_t type; - myhtml_encoding_t encoding; + myencoding_t encoding; /* tokenizer */ mycss_tokenizer_state_t state; @@ -112,9 +112,9 @@ struct mycss_entry { }; mycss_entry_t * mycss_entry_create(void); -mycss_status_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); -mycss_status_t mycss_entry_clean(mycss_entry_t* entry); -mycss_status_t mycss_entry_clean_all(mycss_entry_t* entry); +mystatus_t mycss_entry_init(mycss_t* mycss, mycss_entry_t* entry); +mystatus_t mycss_entry_clean(mycss_entry_t* entry); +mystatus_t mycss_entry_clean_all(mycss_entry_t* entry); mycss_entry_t * mycss_entry_destroy(mycss_entry_t* entry, bool self_destroy); void mycss_entry_end(mycss_entry_t* entry); @@ -125,10 +125,10 @@ mycss_selectors_t * mycss_entry_selectors(mycss_entry_t* entry); mycss_token_ready_callback_f mycss_entry_token_ready_callback(mycss_entry_t* entry, mycss_token_ready_callback_f callback_f); size_t mycss_entry_token_count(mycss_entry_t* entry); -myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry); -myhtml_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry); +mycore_incoming_buffer_t * mycss_entry_incoming_buffer_current(mycss_entry_t* entry); +mycore_incoming_buffer_t * mycss_entry_incoming_buffer_first(mycss_entry_t* entry); -myhtml_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size); +mycore_string_t * mycss_entry_string_create_and_init(mycss_entry_t* entry, size_t string_size); mycss_stylesheet_t * mycss_entry_stylesheet(mycss_entry_t* entry); mycss_selectors_list_t * mycss_entry_current_selectors_list(mycss_entry_t* entry); @@ -142,7 +142,7 @@ mycss_entry_parser_list_t * mycss_entry_parser_list_create_and_init(size_t size) void mycss_entry_parser_list_clean(mycss_entry_parser_list_t* parser_list); mycss_entry_parser_list_t * mycss_entry_parser_list_destroy(mycss_entry_parser_list_t* parser_list, bool self_destroy); -mycss_status_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, +mystatus_t mycss_entry_parser_list_push(mycss_entry_t* entry, mycss_parser_token_f parser_func, mycss_parser_token_f parser_switch, mycss_token_type_t ending_token, bool is_local); diff --git a/source/mycss/media/init.c b/source/mycss/media/init.c index eb82b9a..70b1afd 100644 --- a/source/mycss/media/init.c +++ b/source/mycss/media/init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,15 +22,15 @@ mycss_media_t * mycss_media_create(void) { - return (mycss_media_t*)myhtml_calloc(1, sizeof(mycss_media_t)); + return (mycss_media_t*)mycore_calloc(1, sizeof(mycss_media_t)); } -mycss_status_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media) +mystatus_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media) { return MyCSS_STATUS_OK; } -mycss_status_t mycss_media_clean_all(mycss_media_t* media) +mystatus_t mycss_media_clean_all(mycss_media_t* media) { return MyCSS_STATUS_OK; } @@ -41,7 +41,7 @@ mycss_media_t * mycss_media_destroy(mycss_media_t* media, bool self_destroy) return NULL; if(self_destroy) { - myhtml_free(media); + mycore_free(media); return NULL; } diff --git a/source/mycss/media/init.h b/source/mycss/media/init.h index 01f1d48..7023dba 100644 --- a/source/mycss/media/init.h +++ b/source/mycss/media/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,8 @@ extern "C" { #endif mycss_media_t * mycss_media_create(void); -mycss_status_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media); -mycss_status_t mycss_media_clean_all(mycss_media_t* media); +mystatus_t mycss_media_init(mycss_entry_t* entry, mycss_media_t* media); +mystatus_t mycss_media_clean_all(mycss_media_t* media); mycss_media_t * mycss_media_destroy(mycss_media_t* media, bool self_destroy); #ifdef __cplusplus diff --git a/source/mycss/media/myosi.h b/source/mycss/media/myosi.h index 10a55af..3b2489a 100644 --- a/source/mycss/media/myosi.h +++ b/source/mycss/media/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,6 +32,7 @@ typedef struct mycss_media mycss_media_t; struct mycss_media { + mystatus_t error; }; diff --git a/source/mycss/media/state.h b/source/mycss/media/state.h index aeda0e4..60629c9 100644 --- a/source/mycss/media/state.h +++ b/source/mycss/media/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/mycss.c b/source/mycss/mycss.c index ab307ff..f0d3e89 100644 --- a/source/mycss/mycss.c +++ b/source/mycss/mycss.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,12 +23,12 @@ mycss_t * mycss_create(void) { - return (mycss_t*)myhtml_calloc(1, sizeof(mycss_t)); + return (mycss_t*)mycore_calloc(1, sizeof(mycss_t)); } -mycss_status_t mycss_init(mycss_t* mycss) +mystatus_t mycss_init(mycss_t* mycss) { - mycss_status_t status = mycss_tokenizer_state_init(mycss); + mystatus_t status = mycss_tokenizer_state_init(mycss); if(status != MyCSS_STATUS_OK) return status; @@ -44,14 +44,14 @@ mycss_t * mycss_destroy(mycss_t* mycss, bool self_destroy) mycss_tokenizer_state_destroy(mycss); if(self_destroy) { - myhtml_free(mycss); + mycore_free(mycss); return NULL; } return mycss; } -mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size) +mystatus_t mycss_parse(mycss_entry_t* entry, myencoding_t encoding, const char* css, size_t css_size) { mycss_entry_clean(entry); @@ -65,7 +65,7 @@ mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, con /* and parse css */ mycss_encoding_set(entry, encoding); - mycss_status_t status = mycss_tokenizer_chunk(entry, css, css_size); + mystatus_t status = mycss_tokenizer_chunk(entry, css, css_size); if(status != MyCSS_STATUS_OK) return status; @@ -74,7 +74,7 @@ mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, con return status; } -mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size) +mystatus_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size) { if(entry->type & MyCSS_ENTRY_TYPE_END) { mycss_entry_clean_all(entry); @@ -89,9 +89,9 @@ mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t c return mycss_tokenizer_chunk(entry, css, css_size); } -mycss_status_t mycss_parse_chunk_end(mycss_entry_t* entry) +mystatus_t mycss_parse_chunk_end(mycss_entry_t* entry) { - mycss_status_t status = mycss_tokenizer_end(entry); + mystatus_t status = mycss_tokenizer_end(entry); mycss_entry_end(entry); return status; @@ -129,10 +129,10 @@ const char * mycss_token_name_by_type(mycss_token_type_t type) return mycss_token_type_description[type]; } -size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool init_string, bool case_insensitive) +size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str, bool init_string, bool case_insensitive) { if(init_string) - myhtml_string_init(entry->mchar, entry->mchar_node_id, str, (token->length + 4)); + mycore_string_init(entry->mchar, entry->mchar_node_id, str, (token->length + 4)); mycss_string_res_t out_res; mycss_string_res_clean(&out_res); @@ -140,7 +140,7 @@ size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, my out_res.encoding = entry->encoding; out_res.case_insensitive = case_insensitive; - myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(entry->current_buffer, token->begin); + mycore_incoming_buffer_t *buffer = mycore_incoming_buffer_find_by_position(entry->current_buffer, token->begin); size_t relative_begin = token->begin - buffer->offset; // if token data length in one buffer then print them all at once @@ -175,30 +175,30 @@ size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, my return token->length; } -myhtml_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token) +mycore_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token) { - return myhtml_incoming_buffer_find_by_position(entry->current_buffer, token->begin); + return mycore_incoming_buffer_find_by_position(entry->current_buffer, token->begin); } // encoding -void mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding) +void mycss_encoding_set(mycss_entry_t* entry, myencoding_t encoding) { entry->encoding = encoding; } -myhtml_encoding_t mycss_encoding_get(mycss_entry_t* entry) +myencoding_t mycss_encoding_get(mycss_entry_t* entry) { return entry->encoding; } -myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size) +myencoding_t mycss_encoding_check_charset_rule(const char* css, size_t size) { if(size < 15) - return MyHTML_ENCODING_UTF_8; + return MyENCODING_UTF_8; if(strncmp("@charset \"", css, 10)) - return MyHTML_ENCODING_UTF_8; + return MyENCODING_UTF_8; size_t begin = 10; size_t length = begin; @@ -209,12 +209,12 @@ myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size ++length; if(length >= size || css[length] != ';') - return MyHTML_ENCODING_UTF_8; + return MyENCODING_UTF_8; size_t name_len = (length - begin) - 1; - myhtml_encoding_t encoding; - if(myhtml_encoding_by_name(&css[begin], name_len, &encoding)) + myencoding_t encoding; + if(myencoding_by_name(&css[begin], name_len, &encoding)) return encoding; break; @@ -223,7 +223,7 @@ myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size ++length; } - return MyHTML_ENCODING_UTF_8; + return MyENCODING_UTF_8; } diff --git a/source/mycss/mycss.h b/source/mycss/mycss.h index 167af74..e4a1d8a 100644 --- a/source/mycss/mycss.h +++ b/source/mycss/mycss.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,51 +26,37 @@ extern "C" { #endif -#ifdef MyCSS_DEBUG - #define MyCSS_DEBUG_MESSAGE(format, ...) \ - myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) -#else - #define MyCSS_DEBUG_MESSAGE(format, ...) -#endif - -#ifdef DEBUG_MODE -#define MyHTML_DEBUG_ERROR(format, ...) \ -myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) -#else -#define MyHTML_DEBUG_ERROR(format, ...) -#endif - #include "mycss/myosi.h" #include "mycss/entry.h" #include "mycss/tokenizer.h" #include "myhtml/myhtml.h" -#include "myhtml/utils/mcobject_async.h" +#include "mycore/utils/mcobject_async.h" struct mycss { mycss_tokenizer_state_f* parse_state_func; }; mycss_t * mycss_create(void); -mycss_status_t mycss_init(mycss_t* mycss); +mystatus_t mycss_init(mycss_t* mycss); mycss_t * mycss_destroy(mycss_t* mycss, bool self_destroy); -mycss_status_t mycss_parse(mycss_entry_t* entry, myhtml_encoding_t encoding, const char* css, size_t css_size); -mycss_status_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); -mycss_status_t mycss_parse_chunk_end(mycss_entry_t* entry); +mystatus_t mycss_parse(mycss_entry_t* entry, myencoding_t encoding, const char* css, size_t css_size); +mystatus_t mycss_parse_chunk(mycss_entry_t* entry, const char* css, size_t css_size); +mystatus_t mycss_parse_chunk_end(mycss_entry_t* entry); size_t mycss_token_begin(mycss_token_t* token); size_t mycss_token_length(mycss_token_t* token); size_t mycss_token_position(mycss_token_t* token, size_t *return_length); mycss_token_type_t mycss_token_type(mycss_token_t* token); const char * mycss_token_name_by_type(mycss_token_type_t type); -size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool init_string, bool case_insensitive); +size_t mycss_token_data_to_string(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str, bool init_string, bool case_insensitive); -myhtml_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token); +mycore_incoming_buffer_t * mycss_token_buffer_first(mycss_entry_t* entry, mycss_token_t* token); // encoding -void mycss_encoding_set(mycss_entry_t* entry, myhtml_encoding_t encoding); -myhtml_encoding_t mycss_encoding_get(mycss_entry_t* entry); -myhtml_encoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); +void mycss_encoding_set(mycss_entry_t* entry, myencoding_t encoding); +myencoding_t mycss_encoding_get(mycss_entry_t* entry); +myencoding_t mycss_encoding_check_charset_rule(const char* css, size_t size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/myosi.h b/source/mycss/myosi.h index e6588e5..f6eaffb 100644 --- a/source/mycss/myosi.h +++ b/source/mycss/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,12 @@ #define MyHTML_MyCSS_MYOSI_H #pragma once +#define MyCSS_VERSION_MAJOR 0 +#define MyCSS_VERSION_MINOR 1 +#define MyCSS_VERSION_PATCH 0 + +#define MyCSS_VERSION_STRING MyCORE_STR(MyCSS_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyCSS_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyCSS_VERSION_PATCH) + #ifdef __cplusplus extern "C" { #endif @@ -31,7 +37,7 @@ extern "C" { // base /* Very important!!! - see modest/myosi.h:modest_status_t + see modest/myosi.h:mystatus_t */ enum mycss_status { MyCSS_STATUS_OK = 0x000000, @@ -260,10 +266,9 @@ typedef struct mycss_string_res mycss_string_res_t; typedef size_t (*mycss_tokenizer_state_f)(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size); typedef mycss_token_t * (*mycss_token_ready_callback_f)(mycss_entry_t* entry, mycss_token_t* token); -typedef size_t (*mycss_string_process_state_f)(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +typedef size_t (*mycss_string_process_state_f)(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); typedef bool (*mycss_parser_token_f)(mycss_entry_t* entry, mycss_token_t* token, bool last_response); typedef bool (*mycss_an_plus_b_state_f)(mycss_entry_t* entry, mycss_an_plus_b_t* anb, mycss_an_plus_b_entry_t* anb_entry, mycss_token_t* token); -typedef void (*mycss_callback_serialization_f)(const char* buffer, size_t size, void* ctx); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/mystring.c b/source/mycss/mystring.c index 3dac2e0..f9e549b 100644 --- a/source/mycss/mystring.c +++ b/source/mycss/mystring.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,8 +20,8 @@ #include "mycss/mystring.h" #include "mycss/tokenizer_resource.h" -#include "myhtml/utils/resources.h" -#include "myhtml/encoding.h" +#include "mycore/utils/resources.h" +#include "myencoding/encoding.h" static const mycss_string_process_state_f mycss_string_state_list_map[] = { mycss_string_process_state_data, mycss_string_process_state_escaped @@ -31,47 +31,47 @@ static const mycss_string_process_state_f mycss_string_state_list_map_utf_8[] = mycss_string_process_state_data_utf_8, mycss_string_process_state_escaped_utf_8 }; -void mycss_string_append_codepoint_to_string(myhtml_string_t* str, size_t code_point) +void mycss_string_append_codepoint_to_string(mycore_string_t* str, size_t code_point) { if((str->length + 4) >= str->size) { - myhtml_string_realloc(str, (str->size + 8)); + mycore_string_realloc(str, (str->size + 8)); } // If this number is zero if(code_point == 0) { - str->length += myhtml_string_raw_set_replacement_character(str, str->length); + str->length += mycore_string_raw_set_replacement_character(str, str->length); } else if(code_point >= 0xD800 && code_point <= 0xDFFF) { - str->length += myhtml_string_raw_set_replacement_character(str, str->length); + str->length += mycore_string_raw_set_replacement_character(str, str->length); } // maximum allowed code point else if(code_point > 0x10FFFF) { - str->length += myhtml_string_raw_set_replacement_character(str, str->length); + str->length += mycore_string_raw_set_replacement_character(str, str->length); } else - str->length += myhtml_encoding_codepoint_to_ascii_utf_8(code_point, &str->data[str->length]); + str->length += myencoding_codepoint_to_ascii_utf_8(code_point, &str->data[str->length]); } -size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +size_t mycss_string_process_state_escaped(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) { const unsigned char *u_data = (const unsigned char*)data; - myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(out_res->encoding); - myhtml_encoding_result_t *encoding_res = &out_res->encoding_res; + myencoding_custom_f func = myencoding_get_function_by_id(out_res->encoding); + myencoding_result_t *encoding_res = &out_res->encoding_res; char convert_data[4] = {0}; while(length < size) { - enum myhtml_encoding_status encoding_status = func(u_data[length], encoding_res); + myencoding_status_t encoding_status = func(u_data[length], encoding_res); - if(encoding_status == MyHTML_ENCODING_STATUS_OK) + if(encoding_status == MyENCODING_STATUS_OK) { - myhtml_encoding_codepoint_to_ascii_utf_8(encoding_res->result, convert_data); + myencoding_codepoint_to_ascii_utf_8(encoding_res->result, convert_data); - if(myhtml_string_chars_hex_map[(unsigned char)convert_data[0]] != 0xff) { + if(mycore_string_chars_hex_map[(unsigned char)convert_data[0]] != 0xff) { out_res->escaped.code_point <<= 4; - out_res->escaped.code_point |= myhtml_string_chars_hex_map[ (unsigned char)convert_data[0] ]; + out_res->escaped.code_point |= mycore_string_chars_hex_map[ (unsigned char)convert_data[0] ]; ++out_res->escaped.consumed; @@ -96,15 +96,15 @@ size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data return length; } -size_t mycss_string_process_state_escaped_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +size_t mycss_string_process_state_escaped_utf_8(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) { const unsigned char *u_data = (const unsigned char*)data; while(length < size) { - if(myhtml_string_chars_hex_map[u_data[length]] != 0xff) { + if(mycore_string_chars_hex_map[u_data[length]] != 0xff) { out_res->escaped.code_point <<= 4; - out_res->escaped.code_point |= myhtml_string_chars_hex_map[ u_data[length] ]; + out_res->escaped.code_point |= mycore_string_chars_hex_map[ u_data[length] ]; ++out_res->escaped.consumed; @@ -137,30 +137,30 @@ void mycss_string_escaped_res_clean(mycss_string_escaped_res_t* res) void mycss_string_res_clean(mycss_string_res_t* res) { memset(res, 0, sizeof(mycss_string_res_t)); - memset(&res->encoding_res, 0, sizeof(myhtml_encoding_result_t)); + memset(&res->encoding_res, 0, sizeof(myencoding_result_t)); } -size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +size_t mycss_string_process_state_data(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) { char *str_data = str->data; unsigned const char* u_str_data = (unsigned const char*)data; - myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(out_res->encoding); - myhtml_encoding_result_t *encoding_res = &out_res->encoding_res; + myencoding_custom_f func = myencoding_get_function_by_id(out_res->encoding); + myencoding_result_t *encoding_res = &out_res->encoding_res; while(length < size) { - enum myhtml_encoding_status encoding_status = func(u_str_data[length], encoding_res); + myencoding_status_t encoding_status = func(u_str_data[length], encoding_res); - if(encoding_status == MyHTML_ENCODING_STATUS_OK) + if(encoding_status == MyENCODING_STATUS_OK) { if((str->length + 4) >= str->size) { - myhtml_string_realloc(str, (str->size + 16)); + mycore_string_realloc(str, (str->size + 16)); str_data = str->data; } - size_t len = myhtml_encoding_codepoint_to_ascii_utf_8(encoding_res->result, &str_data[str->length]); + size_t len = myencoding_codepoint_to_ascii_utf_8(encoding_res->result, &str_data[str->length]); if(len == 1) { if(str_data[str->length] == '\\') { @@ -180,7 +180,7 @@ size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, s str_data[str->length] = '\n'; } else if(str_data[str->length] == '\0') { - myhtml_string_raw_set_replacement_character(str, str->length); + mycore_string_raw_set_replacement_character(str, str->length); str->length += 2; } } @@ -194,7 +194,7 @@ size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, s return length; } -size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +size_t mycss_string_process_state_data_utf_8(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) { char *str_data = str->data; @@ -208,7 +208,7 @@ size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* d } if(str->length >= str->size) { - myhtml_string_realloc(str, (str->size + 16)); + mycore_string_realloc(str, (str->size + 16)); str_data = str->data; } @@ -224,7 +224,7 @@ size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* d str_data[str->length] = '\n'; } else if(data[length] == '\0') { - myhtml_string_raw_set_replacement_character(str, str->length); + mycore_string_raw_set_replacement_character(str, str->length); str->length += 2; } else @@ -237,9 +237,9 @@ size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* d return length; } -size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) +size_t mycss_string_data_process(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res) { - if(out_res->encoding == MyHTML_ENCODING_UTF_8) { + if(out_res->encoding == MyENCODING_UTF_8) { while(length < size) { length = mycss_string_state_list_map_utf_8[ out_res->state ](str, data, length, size, out_res); } @@ -253,7 +253,7 @@ size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t return length; } -void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out_res) +void mycss_string_data_process_end(mycore_string_t* str, mycss_string_res_t *out_res) { if(out_res->state == MyCSS_STRING_PROCESS_STATE_ESCAPED) { mycss_string_append_codepoint_to_string(str, out_res->escaped.code_point); @@ -264,7 +264,7 @@ void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out } if(str->length >= str->size) - myhtml_string_realloc(str, (str->size + 2)); + mycore_string_realloc(str, (str->size + 2)); str->data[str->length] = '\0'; @@ -272,7 +272,7 @@ void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out unsigned char *u_data = (unsigned char*)str->data; for(size_t i = 0; i < str->length; i++) - u_data[i] = myhtml_string_chars_lowercase_map[u_data[i]]; + u_data[i] = mycore_string_chars_lowercase_map[u_data[i]]; } } diff --git a/source/mycss/mystring.h b/source/mycss/mystring.h index 883b080..63a5d85 100644 --- a/source/mycss/mystring.h +++ b/source/mycss/mystring.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,9 +27,10 @@ extern "C" { #endif #include "mycss/myosi.h" -#include "myhtml/incoming.h" -#include "myhtml/mystring.h" - +#include "mycore/incoming.h" +#include "mycore/mystring.h" +#include "myencoding/encoding.h" + enum mycss_string_process_state { MyCSS_STRING_PROCESS_STATE_DATA = 0x00, MyCSS_STRING_PROCESS_STATE_ESCAPED = 0x01, @@ -46,18 +47,18 @@ struct mycss_string_res { mycss_string_escaped_res_t escaped; mycss_string_process_state_t state; - myhtml_encoding_t encoding; - myhtml_encoding_result_t encoding_res; + myencoding_t encoding; + myencoding_result_t encoding_res; bool case_insensitive; }; -size_t mycss_string_data_process(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -void mycss_string_data_process_end(myhtml_string_t* str, mycss_string_res_t *out_res); +size_t mycss_string_data_process(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +void mycss_string_data_process_end(mycore_string_t* str, mycss_string_res_t *out_res); -size_t mycss_string_process_state_data(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -size_t mycss_string_process_state_data_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -size_t mycss_string_process_state_escaped(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); -size_t mycss_string_process_state_escaped_utf_8(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_data(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_data_utf_8(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); +size_t mycss_string_process_state_escaped_utf_8(mycore_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res); void mycss_string_res_clean(mycss_string_res_t* res); void mycss_string_escaped_res_clean(mycss_string_escaped_res_t* res); diff --git a/source/mycss/namespace/init.c b/source/mycss/namespace/init.c index 017449f..419a3d1 100644 --- a/source/mycss/namespace/init.c +++ b/source/mycss/namespace/init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,17 +22,17 @@ mycss_namespace_t * mycss_namespace_create(void) { - return (mycss_namespace_t*)myhtml_calloc(1, sizeof(mycss_namespace_t)); + return (mycss_namespace_t*)mycore_calloc(1, sizeof(mycss_namespace_t)); } -mycss_status_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns) +mystatus_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns) { /* Objects Namespace */ ns->mcobject_entries = mcobject_create(); if(ns->mcobject_entries == NULL) return MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_CREATE; - myhtml_status_t myhtml_status = mcobject_init(ns->mcobject_entries, 256, sizeof(mycss_namespace_entry_t)); + mystatus_t myhtml_status = mcobject_init(ns->mcobject_entries, 256, sizeof(mycss_namespace_entry_t)); if(myhtml_status) return MyCSS_STATUS_ERROR_NAMESPACE_ENTRIES_INIT; @@ -44,7 +44,7 @@ void mycss_namespace_clean(mycss_namespace_t* ns) ns->entry = NULL; } -mycss_status_t mycss_namespace_clean_all(mycss_namespace_t* ns) +mystatus_t mycss_namespace_clean_all(mycss_namespace_t* ns) { mcobject_clean(ns->mcobject_entries); ns->entry = NULL; @@ -60,7 +60,7 @@ mycss_namespace_t * mycss_namespace_destroy(mycss_namespace_t* ns, bool self_des ns->mcobject_entries = mcobject_destroy(ns->mcobject_entries, true); if(self_destroy) { - myhtml_free(ns); + mycore_free(ns); return NULL; } @@ -80,17 +80,17 @@ void mycss_namespace_entry_clean(mycss_namespace_entry_t* ns_entry) mycss_namespace_entry_t * mycss_namespace_entry_destroy(mycss_namespace_entry_t* ns_entry, mycss_entry_t* entry, bool self_destroy) { if(ns_entry->name) { - myhtml_string_destroy(ns_entry->name, false); + mycore_string_destroy(ns_entry->name, false); mcobject_free(entry->mcobject_string_entries, ns_entry->name); } if(ns_entry->url) { - myhtml_string_destroy(ns_entry->url, false); + mycore_string_destroy(ns_entry->url, false); mcobject_free(entry->mcobject_string_entries, ns_entry->url); } if(self_destroy) { - myhtml_free(ns_entry); + mycore_free(ns_entry); return NULL; } @@ -110,7 +110,7 @@ void mycss_namespace_entry_append_to_current(mycss_namespace_t* ns, mycss_namesp ns->entry_last = ns_entry; } -mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) +mystatus_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) { ns_stylesheet->name_tree = mctree_create(14); if(ns_stylesheet->name_tree == NULL) @@ -135,7 +135,7 @@ mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_ if(ns_stylesheet->entry_any.name == NULL) return MyCSS_STATUS_ERROR_STRING_CREATE; - myhtml_string_append(ns_stylesheet->entry_any.name, "*", 1); + mycore_string_append(ns_stylesheet->entry_any.name, "*", 1); ns_stylesheet->entry_any.ns_id = MyHTML_NAMESPACE_ANY; mycss_namespace_stylesheet_init_default(ns_stylesheet, entry, NULL, 0, MyHTML_NAMESPACE_ANY); @@ -143,7 +143,7 @@ mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_ return MyCSS_STATUS_OK; } -mycss_status_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) +mystatus_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) { mctree_clean(ns_stylesheet->name_tree); ns_stylesheet->ns_id_counter = 0; @@ -167,32 +167,32 @@ mycss_namespace_stylesheet_t * mycss_namespace_stylesheet_destroy(mycss_namespac } ns_stylesheet->name_tree = mctree_destroy(ns_stylesheet->name_tree); - ns_stylesheet->entry_undef.name = myhtml_string_destroy(ns_stylesheet->entry_undef.name, false); - ns_stylesheet->entry_any.name = myhtml_string_destroy(ns_stylesheet->entry_any.name, false); + ns_stylesheet->entry_undef.name = mycore_string_destroy(ns_stylesheet->entry_undef.name, false); + ns_stylesheet->entry_any.name = mycore_string_destroy(ns_stylesheet->entry_any.name, false); if(self_destroy) { - myhtml_free(ns_stylesheet); + mycore_free(ns_stylesheet); return NULL; } return ns_stylesheet; } -mycss_status_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns) +mystatus_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns) { - myhtml_string_t *str = ns_stylesheet->entry_default->url; + mycore_string_t *str = ns_stylesheet->entry_default->url; if(str == NULL) { str = mcobject_malloc(entry->mcobject_string_entries, NULL); - myhtml_string_init(entry->mchar, entry->mchar_node_id, str, (url_length + 1)); + mycore_string_init(entry->mchar, entry->mchar_node_id, str, (url_length + 1)); ns_stylesheet->entry_default->url = str; } else - myhtml_string_clean(str); + mycore_string_clean(str); if(url && url_length) { - myhtml_string_append(str, url, url_length); + mycore_string_append(str, url, url_length); ns_stylesheet->entry_default->ns_id = myhtml_namespace_id_by_url(url, url_length); } else @@ -226,10 +226,10 @@ void mycss_namespace_stylesheet_append_default(mycss_namespace_stylesheet_t* ns_ void mycss_namespace_stylesheet_destroy_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry) { - myhtml_string_t *str = ns_stylesheet->entry_default->url; + mycore_string_t *str = ns_stylesheet->entry_default->url; if(str) { - myhtml_string_destroy(str, false); + mycore_string_destroy(str, false); mcobject_free(entry->mcobject_string_entries, str); ns_stylesheet->entry_default->url = NULL; diff --git a/source/mycss/namespace/init.h b/source/mycss/namespace/init.h index 528e8a3..ccc27e2 100644 --- a/source/mycss/namespace/init.h +++ b/source/mycss/namespace/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,16 +31,16 @@ extern "C" { #include "myhtml/mynamespace.h" mycss_namespace_t * mycss_namespace_create(void); -mycss_status_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns); +mystatus_t mycss_namespace_init(mycss_entry_t* entry, mycss_namespace_t* ns); void mycss_namespace_clean(mycss_namespace_t* ns); -mycss_status_t mycss_namespace_clean_all(mycss_namespace_t* ns); +mystatus_t mycss_namespace_clean_all(mycss_namespace_t* ns); mycss_namespace_t * mycss_namespace_destroy(mycss_namespace_t* ns, bool self_destroy); -mycss_status_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); -mycss_status_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mystatus_t mycss_namespace_stylesheet_init(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); +mystatus_t mycss_namespace_stylesheet_clean(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); mycss_namespace_stylesheet_t * mycss_namespace_stylesheet_destroy(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, bool self_destroy); -mycss_status_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns); +mystatus_t mycss_namespace_stylesheet_init_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry, const char* url, size_t url_length, myhtml_namespace_t def_ns); void mycss_namespace_stylesheet_append_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_namespace_entry_t* ns_entry); void mycss_namespace_stylesheet_destroy_default(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_entry_t* entry); diff --git a/source/mycss/namespace/myosi.h b/source/mycss/namespace/myosi.h index 884605f..7d96e16 100644 --- a/source/mycss/namespace/myosi.h +++ b/source/mycss/namespace/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,16 +28,16 @@ extern "C" { #include "mycss/myosi.h" #include "myhtml/mystring.h" -#include "myhtml/utils/mctree.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mctree.h" +#include "mycore/utils/mcobject.h" typedef struct mycss_namespace mycss_namespace_t; typedef struct mycss_namespace_entry mycss_namespace_entry_t; typedef struct mycss_namespace_stylesheet mycss_namespace_stylesheet_t; struct mycss_namespace_entry { - myhtml_string_t* name; - myhtml_string_t* url; + mycore_string_t* name; + mycore_string_t* url; myhtml_namespace_t ns_id; size_t mctree_id; diff --git a/source/mycss/namespace/parser.c b/source/mycss/namespace/parser.c index c442316..5dd9499 100644 --- a/source/mycss/namespace/parser.c +++ b/source/mycss/namespace/parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,7 +31,7 @@ void mycss_namespace_parser_begin(mycss_entry_t* entry) void mycss_namespace_parser_name(mycss_entry_t* entry, mycss_token_t* token) { - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); entry->ns->entry_last->name = str; @@ -39,7 +39,7 @@ void mycss_namespace_parser_name(mycss_entry_t* entry, mycss_token_t* token) void mycss_namespace_parser_url(mycss_entry_t* entry, mycss_token_t* token) { - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); entry->ns->entry_last->url = str; @@ -49,11 +49,11 @@ void mycss_namespace_parser_end(mycss_entry_t* entry, mycss_token_t* token) { mycss_namespace_entry_t *ns_entry = entry->ns->entry_last; - myhtml_string_t *str_url = entry->ns->entry_last->url; + mycore_string_t *str_url = entry->ns->entry_last->url; ns_entry->ns_id = myhtml_namespace_id_by_url(str_url->data, str_url->length); if(ns_entry->name) { - myhtml_string_t *str = ns_entry->name; + mycore_string_t *str = ns_entry->name; ns_entry->mctree_id = mctree_insert(entry->ns->ns_stylesheet->name_tree, str->data, str->length, (void*)ns_entry, NULL); diff --git a/source/mycss/namespace/parser.h b/source/mycss/namespace/parser.h index 630e39a..40b06dd 100644 --- a/source/mycss/namespace/parser.h +++ b/source/mycss/namespace/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,7 +29,7 @@ extern "C" { #include "mycss/entry.h" #include "mycss/namespace/myosi.h" #include "myhtml/mynamespace.h" -#include "myhtml/utils/mctree.h" +#include "mycore/utils/mctree.h" void mycss_namespace_parser_begin(mycss_entry_t* entry); diff --git a/source/mycss/namespace/serialization.c b/source/mycss/namespace/serialization.c index 1dc60d1..2743b06 100644 --- a/source/mycss/namespace/serialization.c +++ b/source/mycss/namespace/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "mycss/namespace/serialization.h" -void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_callback_serialization_f callback, void* context) +void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycore_callback_serialize_f callback, void* context) { mycss_namespace_entry_t* ns_entry = ns_stylesheet->entry_first; @@ -43,13 +43,13 @@ void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_s } } -void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycss_callback_serialization_f callback, void* context, bool with_vbar) +void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycore_callback_serialize_f callback, void* context, bool with_vbar) { if(ns_entry->name && ns_entry->name->length) { callback(ns_entry->name->data, ns_entry->name->length, context); } else if(ns_entry->ns_id == MyHTML_NAMESPACE_ANY) - return; //fprintf(fh, "*"); + return; else if(ns_entry->ns_id == MyHTML_NAMESPACE_UNDEF) { /* some print */ } diff --git a/source/mycss/namespace/serialization.h b/source/mycss/namespace/serialization.h index 1e87f3e..d11fa65 100644 --- a/source/mycss/namespace/serialization.h +++ b/source/mycss/namespace/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,8 @@ extern "C" { #endif -void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_callback_serialization_f callback, void* context); -void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycss_callback_serialization_f callback, void* context, bool with_vbar); +void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycore_callback_serialize_f callback, void* context); +void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycore_callback_serialize_f callback, void* context, bool with_vbar); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/namespace/state.c b/source/mycss/namespace/state.c index 9cf7208..11faeca 100644 --- a/source/mycss/namespace/state.c +++ b/source/mycss/namespace/state.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,10 +23,10 @@ bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response) { if(token->type == MyCSS_TOKEN_TYPE_AT_KEYWORD) { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, true); - if(myhtml_strcmp(str.data, "namespace") == 0) { + if(mycore_strcmp(str.data, "namespace") == 0) { entry->parser = mycss_namespace_state_namespace_namespace; } else { @@ -34,7 +34,7 @@ bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, entry->parser = mycss_parser_token; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } else { mycss_namespace_parser_expectations_error(entry, token); @@ -110,7 +110,7 @@ bool mycss_namespace_state_namespace_namespace_ident_string(mycss_entry_t* entry if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { mycss_namespace_parser_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_ident_string_semicolon") + MyCORE_DEBUG("mycss_namespace_state_namespace_namespace_ident_string_semicolon"); entry->parser = mycss_parser_token; } else { @@ -129,7 +129,7 @@ bool mycss_namespace_state_namespace_namespace_ident_url(mycss_entry_t* entry, m if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { mycss_namespace_parser_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_ident_url_semicolon") + MyCORE_DEBUG("mycss_namespace_state_namespace_namespace_ident_url_semicolon"); entry->parser = mycss_parser_token; } else { @@ -148,7 +148,7 @@ bool mycss_namespace_state_namespace_namespace_string(mycss_entry_t* entry, mycs if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { mycss_namespace_parser_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_string_semicolon") + MyCORE_DEBUG("mycss_namespace_state_namespace_namespace_string_semicolon"); entry->parser = mycss_parser_token; } else { @@ -167,7 +167,7 @@ bool mycss_namespace_state_namespace_namespace_url(mycss_entry_t* entry, mycss_t if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) { mycss_namespace_parser_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_namespace_state_namespace_namespace_url_semicolon") + MyCORE_DEBUG("mycss_namespace_state_namespace_namespace_url_semicolon"); entry->parser = mycss_parser_token; } else { diff --git a/source/mycss/namespace/state.h b/source/mycss/namespace/state.h index ec7f031..715644c 100644 --- a/source/mycss/namespace/state.h +++ b/source/mycss/namespace/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,7 +29,7 @@ extern "C" { #include "mycss/entry.h" #include "mycss/namespace/myosi.h" #include "mycss/namespace/parser.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" bool mycss_namespace_state_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_namespace_state_namespace_namespace(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/source/mycss/parser.c b/source/mycss/parser.c index 2844e6a..76860f1 100644 --- a/source/mycss/parser.c +++ b/source/mycss/parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -43,10 +43,10 @@ bool mycss_parser_token(mycss_entry_t* entry, mycss_token_t* token, bool last_re break; case MyCSS_TOKEN_TYPE_AT_KEYWORD: { - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, true); - if(myhtml_strcmp(str.data, "namespace") == 0) { + if(mycore_strcmp(str.data, "namespace") == 0) { mycss_namespace_t *ns = entry->ns; ns->ns_stylesheet = &entry->stylesheet->ns_stylesheet; @@ -58,7 +58,7 @@ bool mycss_parser_token(mycss_entry_t* entry, mycss_token_t* token, bool last_re entry->parser = mycss_parser_token_drop_at_rule; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); mycss_entry_parser_list_push(entry, mycss_parser_token, entry->parser_switch, MyCSS_TOKEN_TYPE_UNDEF, false); break; diff --git a/source/mycss/parser.h b/source/mycss/parser.h index bec7eb5..28e6fbc 100644 --- a/source/mycss/parser.h +++ b/source/mycss/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -35,7 +35,7 @@ extern "C" { #include "mycss/selectors/state.h" #include "mycss/selectors/parser.h" #include "mycss/declaration/state.h" -#include "myhtml/incoming.h" +#include "mycore/incoming.h" mycss_token_t * mycss_parser_token_ready_callback_function(mycss_entry_t* entry, mycss_token_t* token); diff --git a/source/mycss/property/const.h b/source/mycss/property/const.h index cd430ea..8881359 100644 --- a/source/mycss/property/const.h +++ b/source/mycss/property/const.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/property/init.c b/source/mycss/property/init.c index 3b8169b..551018e 100644 --- a/source/mycss/property/init.c +++ b/source/mycss/property/init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,22 +20,22 @@ #include "mycss/property/init.h" #include "mycss/property/resources.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" const mycss_property_index_static_entry_t * mycss_property_index_entry_by_name(const char* name, size_t length) { if(length == 0) return NULL; - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_PROPERTY_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; while (mycss_property_index_static_for_search[idx].name) { if(mycss_property_index_static_for_search[idx].name_length == length) { - if(myhtml_strncasecmp(mycss_property_index_static_for_search[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_property_index_static_for_search[idx].name, name, length) == 0) return &mycss_property_index_static_for_search[idx]; if(mycss_property_index_static_for_search[idx].next) @@ -69,15 +69,15 @@ const mycss_property_value_index_static_entry_t * mycss_property_value_index_ent if(length == 0) return NULL; - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_PROPERTY_VALUE_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; while (mycss_property_value_index_static_for_search[idx].name) { if(mycss_property_value_index_static_for_search[idx].name_length == length) { - if(myhtml_strncasecmp(mycss_property_value_index_static_for_search[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_property_value_index_static_for_search[idx].name, name, length) == 0) return &mycss_property_value_index_static_for_search[idx]; if(mycss_property_value_index_static_for_search[idx].next) diff --git a/source/mycss/property/init.h b/source/mycss/property/init.h index f63d37d..7470203 100644 --- a/source/mycss/property/init.h +++ b/source/mycss/property/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,7 +25,7 @@ #include "mycss/property/myosi.h" #include "mycss/property/parser.h" #include "mycss/values/serialization.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #ifdef __cplusplus extern "C" { diff --git a/source/mycss/property/myosi.h b/source/mycss/property/myosi.h index f1e50e3..6a626e2 100644 --- a/source/mycss/property/myosi.h +++ b/source/mycss/property/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/property/parser.c b/source/mycss/property/parser.c index 4bb81b2..5899cbd 100644 --- a/source/mycss/property/parser.c +++ b/source/mycss/property/parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "mycss/property/parser.h" -bool mycss_property_parser_destroy_string(myhtml_string_t* str, bool return_value) +bool mycss_property_parser_destroy_string(mycore_string_t* str, bool return_value) { mycss_property_shared_destroy_string(str); return return_value; @@ -47,7 +47,7 @@ bool mycss_property_parser_width(mycss_entry_t* entry, mycss_token_t* token, boo if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; if(mycss_property_shared_width(entry, token, &declr_entry->value, &declr_entry->value_type, &str)) { @@ -62,7 +62,7 @@ bool mycss_property_parser_height(mycss_entry_t* entry, mycss_token_t* token, bo if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; if(mycss_property_shared_height(entry, token, &declr_entry->value, &declr_entry->value_type, &str)) @@ -76,7 +76,7 @@ bool mycss_property_parser_max_width(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length_percentage(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -116,7 +116,7 @@ bool mycss_property_parser_min_width(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length_percentage(entry, token, &dec_entry->value, &dec_entry->value_type, &str) || @@ -134,7 +134,7 @@ bool mycss_property_parser_min_height(mycss_entry_t* entry, mycss_token_t* token } /* padding */ -mycss_declaration_entry_t * mycss_property_parser_padding_shared(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str) +mycss_declaration_entry_t * mycss_property_parser_padding_shared(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str) { void *value = NULL; unsigned int value_type = 0; @@ -173,7 +173,7 @@ bool mycss_property_parser_padding(mycss_entry_t* entry, mycss_token_t* token, b return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(value->one == NULL) { @@ -212,7 +212,7 @@ bool mycss_property_parser_padding_X(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length_percentage(entry, token, &dec_entry->value, &dec_entry->value_type, &str) || @@ -266,7 +266,7 @@ bool mycss_property_parser_padding_inline_end(mycss_entry_t* entry, mycss_token_ } /* margin */ -mycss_declaration_entry_t * mycss_property_parser_margin_shared(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str) +mycss_declaration_entry_t * mycss_property_parser_margin_shared(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str) { void *value = NULL; unsigned int value_type = 0; @@ -306,7 +306,7 @@ bool mycss_property_parser_margin(mycss_entry_t* entry, mycss_token_t* token, bo return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(value->one == NULL) { @@ -345,7 +345,7 @@ bool mycss_property_parser_margin_X(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length(entry, token, &dec_entry->value, &dec_entry->value_type, &str) || @@ -405,7 +405,7 @@ bool mycss_property_parser_display(mycss_entry_t* entry, mycss_token_t* token, b if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(token->type == MyCSS_TOKEN_TYPE_IDENT) { @@ -459,7 +459,7 @@ bool mycss_property_parser_display(mycss_entry_t* entry, mycss_token_t* token, b } /* border */ -mycss_declaration_entry_t * mycss_property_parser_border_width_shared(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str) +mycss_declaration_entry_t * mycss_property_parser_border_width_shared(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str) { void *value = NULL; unsigned int value_type = 0; @@ -478,7 +478,7 @@ mycss_declaration_entry_t * mycss_property_parser_border_width_shared(mycss_entr } static mycss_declaration_entry_t * mycss_property_parser_border_color_shared(mycss_entry_t* entry, mycss_token_t* token, - myhtml_string_t* str, mycss_parser_token_f return_parser, + mycore_string_t* str, mycss_parser_token_f return_parser, unsigned int type) { void *value = NULL; @@ -504,7 +504,7 @@ static mycss_declaration_entry_t * mycss_property_parser_border_color_shared(myc return NULL; } -mycss_declaration_entry_t * mycss_property_parser_border_style_shared(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str) +mycss_declaration_entry_t * mycss_property_parser_border_style_shared(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str) { unsigned int value_type = 0; @@ -542,7 +542,7 @@ bool mycss_property_parser_border_top(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; unsigned int value_type = 0; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; @@ -658,7 +658,7 @@ bool mycss_property_parser_border_width(mycss_entry_t* entry, mycss_token_t* tok return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(value->one == NULL) { @@ -697,7 +697,7 @@ bool mycss_property_parser_border_top_width(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; if(mycss_property_shared_line_width(entry, token, &declr_entry->value, &declr_entry->value_type, &str)) { @@ -764,7 +764,7 @@ bool mycss_property_parser_border_style(mycss_entry_t* entry, mycss_token_t* tok return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(value->one == NULL) { @@ -803,7 +803,7 @@ bool mycss_property_parser_border_top_style(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; if(mycss_property_shared_line_style(entry, token, &declr_entry->value_type, &str)) { @@ -850,7 +850,7 @@ bool mycss_property_parser_border_inline_end_style(mycss_entry_t* entry, mycss_t } /* border radius */ -static mycss_declaration_entry_t * mycss_property_parser_border_radius_shared(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str, bool is_first) +static mycss_declaration_entry_t * mycss_property_parser_border_radius_shared(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str, bool is_first) { void *value = NULL; unsigned int value_type = 0; @@ -878,7 +878,7 @@ static mycss_declaration_entry_t * mycss_property_parser_border_radius_shared(my } static bool mycss_property_parser_border_radius_two_shared(mycss_entry_t* entry, mycss_token_t* token, - mycss_values_shorthand_two_type_t *short_two_type, myhtml_string_t* str) + mycss_values_shorthand_two_type_t *short_two_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, &short_two_type->two, &short_two_type->type_two, str)) { return true; @@ -899,7 +899,7 @@ bool mycss_property_parser_border_radius_two(mycss_entry_t* entry, mycss_token_t return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(((mycss_values_shorthand_two_type_t*)(value->one->value))->two == NULL) { @@ -983,7 +983,7 @@ bool mycss_property_parser_border_radius(mycss_entry_t* entry, mycss_token_t* to return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(value->one == NULL) { @@ -1053,7 +1053,7 @@ bool mycss_property_parser_border_top_right_radius(mycss_entry_t* entry, mycss_t return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; if(short_two_type->one == NULL) { @@ -1096,7 +1096,7 @@ bool mycss_property_parser_border_color(mycss_entry_t* entry, mycss_token_t* tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; mycss_values_shorthand_four_t *value = dec_entry->value; @@ -1208,7 +1208,7 @@ bool mycss_property_parser_box_sizing(mycss_entry_t* entry, mycss_token_t* token if(token->type != MyCSS_TOKEN_TYPE_IDENT) return mycss_property_shared_switch_to_parse_error(entry); - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_token_data_to_string(entry, token, &str, true, false); mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; @@ -1236,7 +1236,7 @@ bool mycss_property_parser_vertical_align(mycss_entry_t* entry, mycss_token_t* t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length_percentage(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -1278,7 +1278,7 @@ bool mycss_property_parser_line_height(mycss_entry_t* entry, mycss_token_t* toke if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_line_height(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -1293,7 +1293,7 @@ bool mycss_property_parser_color(mycss_entry_t* entry, mycss_token_t* token, boo if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; bool parser_changed = false; @@ -1330,7 +1330,7 @@ bool mycss_property_parser_position(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1364,7 +1364,7 @@ bool mycss_property_parser_z_index(mycss_entry_t* entry, mycss_token_t* token, b if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_number(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -1400,7 +1400,7 @@ bool mycss_property_parser_cursor(mycss_entry_t* entry, mycss_token_t* token, bo if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1465,7 +1465,7 @@ bool mycss_property_parser_float(mycss_entry_t* entry, mycss_token_t* token, boo if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1500,7 +1500,7 @@ bool mycss_property_parser_float_displace(mycss_entry_t* entry, mycss_token_t* t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1533,7 +1533,7 @@ bool mycss_property_parser_top(mycss_entry_t* entry, mycss_token_t* token, bool if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length_percentage(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -1584,7 +1584,7 @@ bool mycss_property_parser_clear(mycss_entry_t* entry, mycss_token_t* token, boo if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1616,7 +1616,7 @@ bool mycss_property_parser_clear_after(mycss_entry_t* entry, mycss_token_t* toke if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1656,7 +1656,7 @@ bool mycss_property_parser_overflow(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1690,7 +1690,7 @@ bool mycss_property_parser_overflow_wrap(mycss_entry_t* entry, mycss_token_t* to if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1732,7 +1732,7 @@ bool mycss_property_parser_visibility(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -1764,7 +1764,7 @@ bool mycss_property_parser_font_weight(mycss_entry_t* entry, mycss_token_t* toke if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_font_weight(entry, token, &dec_entry->value_type, &str)) @@ -1778,7 +1778,7 @@ bool mycss_property_parser_font_size(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_font_size(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -1792,7 +1792,7 @@ bool mycss_property_parser_font_size_adjust(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_number(entry, token, &dec_entry->value, &dec_entry->value_type, &str)) @@ -1827,7 +1827,7 @@ bool mycss_property_parser_font_stretch(mycss_entry_t* entry, mycss_token_t* tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_font_stretch(entry, token, &dec_entry->value_type, &str)) @@ -1841,7 +1841,7 @@ bool mycss_property_parser_font_style(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_font_style(entry, token, &dec_entry->value_type, &str)) @@ -1874,7 +1874,7 @@ bool mycss_property_parser_font_family(mycss_entry_t* entry, mycss_token_t* toke if(mycss_property_shared_check_declaration_end(entry, token)) return true; - myhtml_string_t str = {0}; bool dont_destroy_str; + mycore_string_t str = {0}; bool dont_destroy_str; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_font_family(entry, token, &dec_entry->value, &dec_entry->value_type, &dont_destroy_str, &str)) { @@ -1921,7 +1921,7 @@ bool mycss_property_parser_font_step_wait_family(mycss_entry_t* entry, mycss_tok if(dec_entry->value == NULL) return mycss_property_shared_switch_to_parse_error(entry); - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_values_font_t *font = (mycss_values_font_t*)dec_entry->value; void *value = NULL; @@ -1967,7 +1967,7 @@ bool mycss_property_parser_font_step_wait_line_height(mycss_entry_t* entry, mycs void *value = NULL; unsigned int value_type = 0; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_values_font_t *font = (mycss_values_font_t*)dec_entry->value; if(mycss_property_shared_line_height(entry, token, &value, &value_type, &str)) { @@ -2010,7 +2010,7 @@ bool mycss_property_parser_font_step_after_size(mycss_entry_t* entry, mycss_toke unsigned int value_type = 0; bool dont_destroy_str; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_values_font_t *font = (mycss_values_font_t*)dec_entry->value; if(mycss_property_shared_font_family(entry, token, &value, &value_type, &dont_destroy_str, &str)) { @@ -2038,7 +2038,7 @@ bool mycss_property_parser_font_step_one(mycss_entry_t* entry, mycss_token_t* to if(mycss_property_shared_check_declaration_end(entry, token)) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(dec_entry->value == NULL) @@ -2120,7 +2120,7 @@ bool mycss_property_parser_font(mycss_entry_t* entry, mycss_token_t* token, bool if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; dec_entry->value = mycss_values_create(entry, sizeof(mycss_values_font_t)); @@ -2206,7 +2206,7 @@ bool mycss_property_parser_text_align(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2242,7 +2242,7 @@ bool mycss_property_parser_text_align_all(mycss_entry_t* entry, mycss_token_t* t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2277,7 +2277,7 @@ bool mycss_property_parser_text_align_last(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2313,7 +2313,7 @@ bool mycss_property_parser_white_space(mycss_entry_t* entry, mycss_token_t* toke if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2346,7 +2346,7 @@ bool mycss_property_parser_text_transform(mycss_entry_t* entry, mycss_token_t* t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2379,7 +2379,7 @@ bool mycss_property_parser_word_break(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2410,7 +2410,7 @@ bool mycss_property_parser_line_break(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2442,7 +2442,7 @@ bool mycss_property_parser_tab_size(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_number(entry, token, &dec_entry->value, &dec_entry->value_type, &str) || @@ -2460,7 +2460,7 @@ bool mycss_property_parser_hyphens(mycss_entry_t* entry, mycss_token_t* token, b if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2496,7 +2496,7 @@ bool mycss_property_parser_text_justify(mycss_entry_t* entry, mycss_token_t* tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2528,7 +2528,7 @@ bool mycss_property_parser_word_spacing(mycss_entry_t* entry, mycss_token_t* tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length_percentage(entry, token, &dec_entry->value, &dec_entry->value_type, &str) || @@ -2546,7 +2546,7 @@ bool mycss_property_parser_letter_spacing(mycss_entry_t* entry, mycss_token_t* t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_length(entry, token, &dec_entry->value, &dec_entry->value_type, &str) || @@ -2564,7 +2564,7 @@ bool mycss_property_parser_direction(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2594,7 +2594,7 @@ bool mycss_property_parser_unicode_bidi(mycss_entry_t* entry, mycss_token_t* tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2628,7 +2628,7 @@ bool mycss_property_parser_writing_mode(mycss_entry_t* entry, mycss_token_t* tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2661,7 +2661,7 @@ bool mycss_property_parser_text_orientation(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) @@ -2692,7 +2692,7 @@ bool mycss_property_parser_glyph_orientation_vertical(mycss_entry_t* entry, mycs if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(token->type != MyCSS_TOKEN_TYPE_IDENT) diff --git a/source/mycss/property/parser.h b/source/mycss/property/parser.h index 0140e9f..43917c0 100644 --- a/source/mycss/property/parser.h +++ b/source/mycss/property/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -34,7 +34,7 @@ extern "C" { /* custom added */ bool mycss_property_parser_background_position_check(mycss_values_background_position_t *position); -bool mycss_property_parser_destroy_string(myhtml_string_t* str, bool return_value); +bool mycss_property_parser_destroy_string(mycore_string_t* str, bool return_value); bool mycss_property_parser_switcher_to_find_important(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_property_parser_text_decoration_line_not_none(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_property_parser_text_decoration_line_after(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/source/mycss/property/parser_background.c b/source/mycss/property/parser_background.c index c86612e..0900ca7 100644 --- a/source/mycss/property/parser_background.c +++ b/source/mycss/property/parser_background.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -292,9 +292,9 @@ static bool mycss_property_parser_background_check_position(mycss_entry_t* entry pos_entry->type = value_type; if(value_type == MyCSS_PROPERTY_VALUE__LENGTH) - pos_entry->length = value; + pos_entry->value.length = value; else if(value_type == MyCSS_PROPERTY_VALUE__PERCENTAGE) - pos_entry->percentage = value; + pos_entry->value.percentage = value; return true; } @@ -304,7 +304,7 @@ static bool mycss_property_parser_background_step_size_height(mycss_entry_t* ent if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; mycss_values_background_t *background = mycss_values_background_list_current_entry(dec_entry->value); @@ -319,7 +319,7 @@ static bool mycss_property_parser_background_step_size_height(mycss_entry_t* ent if(value) { bg_entry->height = mycss_values_create(entry, sizeof(mycss_values_type_length_percentage_entry_t)); - bg_entry->height->percentage = value; + bg_entry->height->value.percentage = value; bg_entry->height->type = value_type; } else if(value_type == MyCSS_PROPERTY_BACKGROUND_SIZE_AUTO) @@ -343,7 +343,7 @@ bool mycss_property_parser_background_step_size(mycss_entry_t* entry, mycss_toke if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; mycss_values_background_t *background = mycss_values_background_list_current_entry(dec_entry->value); @@ -362,7 +362,7 @@ bool mycss_property_parser_background_step_size(mycss_entry_t* entry, mycss_toke if(value) { bg_entry->width = mycss_values_create(entry, sizeof(mycss_values_type_length_percentage_entry_t)); - bg_entry->width->percentage = value; + bg_entry->width->value.percentage = value; bg_entry->width->type = value_type; entry->parser = mycss_property_parser_background_step_size_height; @@ -396,7 +396,7 @@ static bool mycss_property_parser_background_step_position(mycss_entry_t* entry, return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; void* value = NULL; @@ -421,7 +421,7 @@ static bool mycss_property_parser_background_step_repeat_wait_two(mycss_entry_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; mycss_values_background_t *background = mycss_values_background_list_current_entry(dec_entry->value); @@ -457,7 +457,7 @@ bool mycss_property_parser_background(mycss_entry_t* entry, mycss_token_t* token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_values_image_t stat_image; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; @@ -695,7 +695,7 @@ bool mycss_property_parser_background_attachment(mycss_entry_t* entry, mycss_tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value_type = 0; @@ -745,7 +745,7 @@ bool mycss_property_parser_background_clip(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value_type = 0; @@ -795,7 +795,7 @@ bool mycss_property_parser_background_image(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_values_image_t stat_image; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; @@ -873,7 +873,7 @@ bool mycss_property_parser_background_origin(mycss_entry_t* entry, mycss_token_t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value_type = 0; @@ -906,7 +906,7 @@ bool mycss_property_parser_background_position(mycss_entry_t* entry, mycss_token if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; void* value = NULL; @@ -934,9 +934,9 @@ bool mycss_property_parser_background_position(mycss_entry_t* entry, mycss_token pos_entry->type = value_type; if(value_type == MyCSS_PROPERTY_VALUE__LENGTH) - pos_entry->length = value; + pos_entry->value.length = value; else if(value_type == MyCSS_PROPERTY_VALUE__PERCENTAGE) - pos_entry->percentage = value; + pos_entry->value.percentage = value; return mycss_property_parser_destroy_string(&str, true); } @@ -990,7 +990,7 @@ static bool mycss_property_parser_background_repeat_wait_two(mycss_entry_t* entr return true; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value_type = 0; @@ -1023,7 +1023,7 @@ bool mycss_property_parser_background_repeat(mycss_entry_t* entry, mycss_token_t if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value_type = 0; @@ -1077,7 +1077,7 @@ static bool mycss_property_parser_background_size_height(mycss_entry_t* entry, m if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; void *value = NULL; @@ -1090,7 +1090,7 @@ static bool mycss_property_parser_background_size_height(mycss_entry_t* entry, m if(value) { bg_entry->height = mycss_values_create(entry, sizeof(mycss_values_type_length_percentage_entry_t)); - bg_entry->height->percentage = value; + bg_entry->height->value.percentage = value; bg_entry->height->type = value_type; entry->parser = mycss_property_parser_background_size_end; @@ -1116,7 +1116,7 @@ bool mycss_property_parser_background_size(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; void *value = NULL; @@ -1131,7 +1131,7 @@ bool mycss_property_parser_background_size(mycss_entry_t* entry, mycss_token_t* if(value) { bg_entry->width = mycss_values_create(entry, sizeof(mycss_values_type_length_percentage_entry_t)); - bg_entry->width->percentage = value; + bg_entry->width->value.percentage = value; bg_entry->width->type = value_type; entry->parser = mycss_property_parser_background_size_height; diff --git a/source/mycss/property/parser_image.c b/source/mycss/property/parser_image.c index 159a046..751a719 100644 --- a/source/mycss/property/parser_image.c +++ b/source/mycss/property/parser_image.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -56,11 +56,11 @@ bool mycss_property_parser_image_function_image(mycss_entry_t* entry, mycss_toke if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_image_image_t *image_image = image->ii; + mycss_values_image_image_t *image_image = image->value.ii; void *value = NULL; unsigned int value_type = 0; @@ -82,7 +82,7 @@ bool mycss_property_parser_image_function_image(mycss_entry_t* entry, mycss_toke if(token->type == MyCSS_TOKEN_TYPE_STRING) { - myhtml_string_t *ns_str = mycss_values_create(entry, sizeof(myhtml_string_t)); + mycore_string_t *ns_str = mycss_values_create(entry, sizeof(mycore_string_t)); mycss_token_data_to_string(entry, token, ns_str, true, false); image_image->str = ns_str; @@ -134,11 +134,11 @@ bool mycss_property_parser_image_function_image_color(mycss_entry_t* entry, mycs if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_image_image_t *image_image = image->ii; + mycss_values_image_image_t *image_image = image->value.ii; void *value = NULL; unsigned int value_type = 0; @@ -186,11 +186,11 @@ bool mycss_property_parser_image_function_image_set(mycss_entry_t* entry, mycss_ if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_image_image_set_t *ii_set = image->ii_set; + mycss_values_image_image_set_t *ii_set = image->value.ii_set; void *value = NULL; unsigned int value_type = 0; @@ -214,7 +214,7 @@ bool mycss_property_parser_image_function_image_set(mycss_entry_t* entry, mycss_ if(token->type == MyCSS_TOKEN_TYPE_STRING) { - myhtml_string_t *ns_str = mycss_values_create(entry, sizeof(myhtml_string_t)); + mycore_string_t *ns_str = mycss_values_create(entry, sizeof(mycore_string_t)); mycss_token_data_to_string(entry, token, ns_str, true, false); mycss_values_image_image_set_option_t *ii_entry = mycss_property_parser_image_function_get_next_option(entry, ii_set); @@ -233,11 +233,11 @@ bool mycss_property_parser_image_function_image_set_resolution(mycss_entry_t* en if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_image_image_set_t *ii_set = image->ii_set; + mycss_values_image_image_set_t *ii_set = image->value.ii_set; void *value = NULL; unsigned int value_type = 0; @@ -282,7 +282,7 @@ bool mycss_property_parser_image_function_string(mycss_entry_t* entry, mycss_tok mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_element_t *element = image->element; + mycss_values_element_t *element = image->value.element; void *value = &element->custom_ident; @@ -336,9 +336,9 @@ bool mycss_property_parser_image_function_string_wait_ident(mycss_entry_t* entry mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_element_t *element = image->element; + mycss_values_element_t *element = image->value.element; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_token_data_to_string(entry, token, &str, true, false); element->type = mycss_property_value_type_by_name(str.data, str.length); @@ -370,9 +370,9 @@ bool mycss_property_parser_image_function_cross_fade(mycss_entry_t* entry, mycss mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_cross_fade_t *cross_fade = image->cross_fade; + mycss_values_cross_fade_t *cross_fade = image->value.cross_fade; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; void *value = NULL; unsigned int value_type = 0; @@ -411,9 +411,9 @@ bool mycss_property_parser_image_function_cross_fade_mixing_after_percentage(myc mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_cross_fade_t *cross_fade = image->cross_fade; + mycss_values_cross_fade_t *cross_fade = image->value.cross_fade; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; void *value = NULL; unsigned int value_type = 0; @@ -465,9 +465,9 @@ bool mycss_property_parser_image_function_cross_fade_final(mycss_entry_t* entry, mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; mycss_values_image_t *image = (mycss_values_image_t*)declr_entry->value; - mycss_values_cross_fade_t *cross_fade = image->cross_fade; + mycss_values_cross_fade_t *cross_fade = image->value.cross_fade; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; void *value = NULL; unsigned int value_type = 0; diff --git a/source/mycss/property/parser_text_decoration.c b/source/mycss/property/parser_text_decoration.c index 3e021f7..824796b 100644 --- a/source/mycss/property/parser_text_decoration.c +++ b/source/mycss/property/parser_text_decoration.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -54,7 +54,7 @@ bool mycss_property_parser_text_decoration(mycss_entry_t* entry, mycss_token_t* if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; mycss_values_text_decoration_t *text_decoration; @@ -208,7 +208,7 @@ bool mycss_property_parser_text_decoration_color(mycss_entry_t* entry, mycss_tok if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE) return true; - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; bool parser_changed = false; @@ -247,7 +247,7 @@ bool mycss_property_parser_text_decoration_skip(mycss_entry_t* entry, mycss_toke if(token->type != MyCSS_TOKEN_TYPE_IDENT) return mycss_property_shared_switch_to_parse_error(entry); - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value = 0; @@ -278,7 +278,7 @@ bool mycss_property_parser_text_decoration_skip_not_none(mycss_entry_t* entry, m return false; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_text_decoration_skip(entry, token, (unsigned int*)dec_entry->value, &dec_entry->value_type, &str, false)) @@ -309,7 +309,7 @@ bool mycss_property_parser_text_decoration_style(mycss_entry_t* entry, mycss_tok if(token->type != MyCSS_TOKEN_TYPE_IDENT) return mycss_property_shared_switch_to_parse_error(entry); - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_text_decoration_style(entry, token, &dec_entry->value_type, &str)) @@ -326,7 +326,7 @@ bool mycss_property_parser_text_decoration_line(mycss_entry_t* entry, mycss_toke if(token->type != MyCSS_TOKEN_TYPE_IDENT) return mycss_property_shared_switch_to_parse_error(entry); - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; unsigned int value = 0; @@ -358,7 +358,7 @@ bool mycss_property_parser_text_decoration_line_not_none(mycss_entry_t* entry, m return false; } - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last; if(mycss_property_shared_text_decoration_line(entry, token, (unsigned int*)dec_entry->value, &dec_entry->value_type, &str, false)) diff --git a/source/mycss/property/parser_url.c b/source/mycss/property/parser_url.c index aebfa6f..3fe2c70 100644 --- a/source/mycss/property/parser_url.c +++ b/source/mycss/property/parser_url.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -55,7 +55,7 @@ bool mycss_property_parser_url_string(mycss_entry_t* entry, mycss_token_t* token return false; } - myhtml_string_t *str = mycss_values_create(entry, sizeof(myhtml_string_t)); + mycore_string_t *str = mycss_values_create(entry, sizeof(mycore_string_t)); mycss_token_data_to_string(entry, token, str, true, false); mycss_declaration_entry_t* declr_entry = entry->declaration->entry_last; diff --git a/source/mycss/property/resources.h b/source/mycss/property/resources.h index dd9d86a..b42e068 100644 --- a/source/mycss/property/resources.h +++ b/source/mycss/property/resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/property/resources_name.h b/source/mycss/property/resources_name.h index ad25497..45a04de 100644 --- a/source/mycss/property/resources_name.h +++ b/source/mycss/property/resources_name.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/property/serialization.c b/source/mycss/property/serialization.c index 8e7f8de..a48c581 100644 --- a/source/mycss/property/serialization.c +++ b/source/mycss/property/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,7 +21,7 @@ #include "mycss/property/serialization.h" #include "mycss/property/resources_name.h" -void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycss_callback_serialization_f callback, void* context) +void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycore_callback_serialize_f callback, void* context) { if(prop_type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY) return; @@ -30,7 +30,7 @@ void mycss_property_serialization_type_name(mycss_property_type_t prop_type, myc callback(name, strlen(name), context); } -void mycss_property_serialization_value(unsigned int value_type, void* value, mycss_callback_serialization_f callback, void* context) +void mycss_property_serialization_value(unsigned int value_type, void* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) { if(value_type < MyCSS_PROPERTY_VALUE_LAST_ENTRY) { diff --git a/source/mycss/property/serialization.h b/source/mycss/property/serialization.h index 2f1abb7..26f79f4 100644 --- a/source/mycss/property/serialization.h +++ b/source/mycss/property/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,8 +30,8 @@ extern "C" { #endif -void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycss_callback_serialization_f callback, void* context); -void mycss_property_serialization_value(unsigned int value_type, void* value, mycss_callback_serialization_f callback, void* context); +void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycore_callback_serialize_f callback, void* context); +void mycss_property_serialization_value(unsigned int value_type, void* value, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/property/shared.c b/source/mycss/property/shared.c index 25b77b4..a780368 100644 --- a/source/mycss/property/shared.c +++ b/source/mycss/property/shared.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -52,7 +52,7 @@ bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_tok return false; } -bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_NUMBER) return false; @@ -66,9 +66,9 @@ bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, vo mycss_convert_data_to_double(str->data, str->length, &return_num, &length->is_float); if(length->is_float) - length->f = (float)return_num; + length->value.f = (float)return_num; else - length->i = (int)return_num; + length->value.i = (int)return_num; *value = length; *value_type = MyCSS_PROPERTY_VALUE__NUMBER; @@ -76,7 +76,7 @@ bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, vo return true; } -bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_DIMENSION && token->type != MyCSS_TOKEN_TYPE_NUMBER) return false; @@ -96,9 +96,9 @@ bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, vo mycss_values_length_t *length = mycss_values_create(entry, sizeof(mycss_values_length_t)); if(is_float) - length->f = (float)return_num; + length->value.f = (float)return_num; else - length->i = (int)return_num; + length->value.i = (int)return_num; length->is_float = is_float; length->type = type; @@ -109,7 +109,7 @@ bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, vo return true; } -bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_DIMENSION) return false; @@ -135,9 +135,9 @@ bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token mycss_values_resolution_t *resolution = mycss_values_create(entry, sizeof(mycss_values_resolution_t)); if(is_float) - resolution->f = (float)return_num; + resolution->value.f = (float)return_num; else - resolution->i = (int)return_num; + resolution->value.i = (int)return_num; resolution->is_float = is_float; resolution->type = type; @@ -173,7 +173,7 @@ bool mycss_property_shared_custom_ident(mycss_entry_t* entry, mycss_token_t* tok return true; } -bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_PERCENTAGE) return false; @@ -187,9 +187,9 @@ bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token mycss_convert_data_to_double(str->data, str->length, &return_num, &length->is_float); if(length->is_float) - length->f = (float)return_num; + length->value.f = (float)return_num; else - length->i = (int)return_num; + length->value.i = (int)return_num; *value = length; *value_type = MyCSS_PROPERTY_VALUE__PERCENTAGE; @@ -197,13 +197,13 @@ bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token return true; } -bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { return mycss_property_shared_length(entry, token, value, value_type, str) || mycss_property_shared_percentage(entry, token, value, value_type, str); } -bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str, bool* parser_changed) +bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed) { switch (token->type) { case MyCSS_TOKEN_TYPE_FUNCTION: @@ -238,8 +238,8 @@ bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, voi if(color_entry) { mycss_values_color_t *color = mycss_values_create(entry, sizeof(mycss_values_color_t)); - color->name_id = color_entry->type; - color->type = MyCSS_VALUES_COLOR_TYPE_NAMED; + color->value.name_id = color_entry->type; + color->type = MyCSS_VALUES_COLOR_TYPE_NAMED; *value = color; *value_type = MyCSS_PROPERTY_VALUE__COLOR; @@ -261,7 +261,7 @@ bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, voi } bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, - unsigned int* value_type, myhtml_string_t* str, bool with_global) + unsigned int* value_type, mycore_string_t* str, bool with_global) { if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); @@ -334,7 +334,7 @@ bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_toke } bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, - unsigned int* value_type, myhtml_string_t* str, bool with_global) + unsigned int* value_type, mycore_string_t* str, bool with_global) { if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); @@ -385,7 +385,7 @@ bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_toke return false; } -bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); @@ -413,7 +413,7 @@ bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_tok return false; } -bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -437,7 +437,7 @@ bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, u return true; } -unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str) +unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return MyCSS_PROPERTY_TYPE_UNDEF; @@ -448,7 +448,7 @@ unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_to return mycss_property_value_type_by_name(str->data, str->length); } -bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, myhtml_string_t* str) +bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -464,7 +464,7 @@ bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* to return false; } -bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, value, value_type, str)) return true; @@ -493,7 +493,7 @@ bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, voi return true; } -bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, value, value_type, str)) return true; @@ -522,7 +522,7 @@ bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, vo return true; } -bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length(entry, token, value, value_type, str)) return true; @@ -553,7 +553,7 @@ bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token return true; } -bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, value, value_type, str) || mycss_property_shared_number(entry, token, value, value_type, str)) @@ -584,7 +584,7 @@ bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* toke return false; } -bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -619,12 +619,12 @@ bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token return true; } -void mycss_property_shared_destroy_string(myhtml_string_t* str) +void mycss_property_shared_destroy_string(mycore_string_t* str) { - myhtml_string_destroy(str, false); + mycore_string_destroy(str, false); } -bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -675,7 +675,7 @@ static mycss_values_font_family_entry_t * mycss_property_shared_font_family_chec return ff_entry; } -bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool* dont_destroy_str, myhtml_string_t* str) +bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool* dont_destroy_str, mycore_string_t* str) { *dont_destroy_str = false; @@ -696,7 +696,7 @@ bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* toke mycss_values_font_family_entry_t *ff_entry = mycss_property_shared_font_family_check(entry, value); ff_entry->type = MyCSS_VALUES_FONT_FAMILY_TYPE_GENERIC; - ff_entry->prop_type = family_type; + ff_entry->value.prop_type = family_type; return true; } @@ -724,7 +724,7 @@ bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* toke mycss_values_font_family_entry_t *ff_entry = mycss_property_shared_font_family_check(entry, value); ff_entry->type = MyCSS_VALUES_FONT_FAMILY_TYPE_NAME; - ff_entry->str = *str; + ff_entry->value.str = *str; *dont_destroy_str = true; return true; @@ -732,7 +732,7 @@ bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* toke } } -bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT && token->type != MyCSS_TOKEN_TYPE_NUMBER) return false; @@ -769,7 +769,7 @@ bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* toke return false; } -bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, value, value_type, str)) return true; @@ -805,7 +805,7 @@ bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, return false; } -bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -838,7 +838,7 @@ bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* tok return false; } -bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -865,11 +865,11 @@ bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token return false; } -bool mycss_property_shared_url(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_url(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type == MyCSS_TOKEN_TYPE_URL) { - myhtml_string_t *new_str = mycss_values_create(entry, sizeof(myhtml_string_t)); + mycore_string_t *new_str = mycss_values_create(entry, sizeof(mycore_string_t)); mycss_token_data_to_string(entry, token, new_str, true, false); *value = new_str; @@ -887,7 +887,7 @@ bool mycss_property_shared_url(mycss_entry_t* entry, mycss_token_t* token, void* if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); - if(myhtml_strcasecmp(str->data, "url")) + if(mycore_strcasecmp(str->data, "url")) return false; entry->parser = mycss_property_parser_url_string; @@ -896,7 +896,7 @@ bool mycss_property_shared_url(mycss_entry_t* entry, mycss_token_t* token, void* return true; } -bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str, bool* parser_changed) +bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed) { if(token->type == MyCSS_TOKEN_TYPE_URL) { @@ -945,7 +945,7 @@ bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, voi return true; } -bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -968,7 +968,7 @@ bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_tok return false; } -bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -993,7 +993,7 @@ bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_tok return false; } -bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -1017,7 +1017,7 @@ bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_tok return false; } -bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, value, value_type, str)) return true; @@ -1046,7 +1046,7 @@ bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token return false; } -bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_IDENT) return false; @@ -1070,7 +1070,7 @@ bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* return false; } -bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str) { if(mycss_property_shared_length_percentage(entry, token, value, value_type, str)) return true; @@ -1104,7 +1104,7 @@ bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* -bool mycss_property_shared_function_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_function_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_FUNCTION) return false; @@ -1115,7 +1115,7 @@ bool mycss_property_shared_function_image(mycss_entry_t* entry, mycss_token_t* t if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); - if(myhtml_strcasecmp(str->data, "image")) + if(mycore_strcasecmp(str->data, "image")) return false; entry->parser = NULL; @@ -1124,7 +1124,7 @@ bool mycss_property_shared_function_image(mycss_entry_t* entry, mycss_token_t* t return true; } -bool mycss_property_shared_function_image_set(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_function_image_set(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_FUNCTION) return false; @@ -1135,7 +1135,7 @@ bool mycss_property_shared_function_image_set(mycss_entry_t* entry, mycss_token_ if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); - if(myhtml_strcasecmp(str->data, "image-set")) + if(mycore_strcasecmp(str->data, "image-set")) return false; entry->parser = NULL; @@ -1144,7 +1144,7 @@ bool mycss_property_shared_function_image_set(mycss_entry_t* entry, mycss_token_ return true; } -bool mycss_property_shared_element(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_property_shared_element(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_FUNCTION) return false; @@ -1155,7 +1155,7 @@ bool mycss_property_shared_element(mycss_entry_t* entry, mycss_token_t* token, v if(str->data == NULL) mycss_token_data_to_string(entry, token, str, true, false); - if(myhtml_strcasecmp(str->data, "cross-fade")) + if(mycore_strcasecmp(str->data, "cross-fade")) return false; entry->parser = NULL; diff --git a/source/mycss/property/shared.h b/source/mycss/property/shared.h index f36def3..3f04201 100644 --- a/source/mycss/property/shared.h +++ b/source/mycss/property/shared.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ #include "mycss/values/values.h" #include "mycss/values/color.h" #include "mycss/values/image.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #ifdef __cplusplus extern "C" { @@ -37,42 +37,42 @@ bool mycss_property_shared_switch_to_find_important(mycss_entry_t* entry); bool mycss_property_shared_switch_to_parse_error(mycss_entry_t* entry); bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_token_t* token); -bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); +bool mycss_property_shared_number(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_length_percentage(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_resolution(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); bool mycss_property_shared_custom_ident(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type); -bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str, bool* parser_changed); -bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, myhtml_string_t* str); -bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, myhtml_string_t* str); -bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, myhtml_string_t* str, bool with_global); -bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, myhtml_string_t* str, bool with_global); +bool mycss_property_shared_color(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed); +bool mycss_property_shared_default(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +unsigned int mycss_property_shared_get_value_type(mycss_entry_t* entry, mycss_token_t* token, mycore_string_t* str); +bool mycss_property_shared_by_value_type(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, unsigned int check_type, mycore_string_t* str); +bool mycss_property_shared_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_line_height(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_line_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_text_decoration_skip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, mycore_string_t* str, bool with_global); +bool mycss_property_shared_text_decoration_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_text_decoration_line(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value, unsigned int* value_type, mycore_string_t* str, bool with_global); -bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool *dont_destroy_str, myhtml_string_t* str); +bool mycss_property_shared_font_ends(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_weight(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_size(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_stretch(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_style(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_font_family(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, bool *dont_destroy_str, mycore_string_t* str); -bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str, bool* parser_changed); +bool mycss_property_shared_image(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str, bool* parser_changed); -bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, myhtml_string_t* str); -bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, myhtml_string_t* str); +bool mycss_property_shared_background_repeat_one(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_repeat_two(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_attachment(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_position(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_clip(mycss_entry_t* entry, mycss_token_t* token, unsigned int* value_type, mycore_string_t* str); +bool mycss_property_shared_background_size(mycss_entry_t* entry, mycss_token_t* token, void* value, unsigned int* value_type, mycore_string_t* str); -void mycss_property_shared_destroy_string(myhtml_string_t* str); +void mycss_property_shared_destroy_string(mycore_string_t* str); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/selectors/function.c b/source/mycss/selectors/function.c index 19187d9..d291f9d 100644 --- a/source/mycss/selectors/function.c +++ b/source/mycss/selectors/function.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "mycss/selectors/function.h" #include "mycss/selectors/function_resource.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" ///////////////////////////////////////////////////////// //// Functions for a find Begin Function @@ -28,15 +28,15 @@ ///////////////////////////////////////////////////////// const mycss_selectots_function_begin_entry_t * mycss_function_begin_entry_by_name(const char* name, size_t length) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_SELECTORS_FUNCTION_NAME_STATIC_SIZE) + 1; while (mycss_selectors_function_begin_map_index[idx].name) { if(mycss_selectors_function_begin_map_index[idx].length == length) { - if(myhtml_strncasecmp(mycss_selectors_function_begin_map_index[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_selectors_function_begin_map_index[idx].name, name, length) == 0) return &mycss_selectors_function_begin_map_index[idx]; if(mycss_selectors_function_begin_map_index[idx].next) diff --git a/source/mycss/selectors/function.h b/source/mycss/selectors/function.h index beea322..7bf4f09 100644 --- a/source/mycss/selectors/function.h +++ b/source/mycss/selectors/function.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/function_parser.c b/source/mycss/selectors/function_parser.c index 3850954..7aa9e34 100644 --- a/source/mycss/selectors/function_parser.c +++ b/source/mycss/selectors/function_parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -257,24 +257,24 @@ bool mycss_selectors_function_parser_nth_with_selectors_need_of(mycss_entry_t* e mycss_selectors_t *selectors = entry->selectors; mycss_selectors_entry_t *selector = selectors->entry_last; - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); mycss_an_plus_b_entry_t *anb = mycss_selector_value_an_plus_b(selector->value); - if(myhtml_strcasecmp(str.data, "of") != 0) { + if(mycore_strcasecmp(str.data, "of") != 0) { if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; anb->of = NULL; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); entry->parser = mycss_selectors_function_parser_state_drop_component_value; return true; } - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); /* create and switch entry, and create selector */ mycss_selectors_list_t *current_list = selectors->list_last; @@ -407,16 +407,16 @@ bool mycss_selectors_function_parser_drop(mycss_entry_t* entry, mycss_token_t* t mycss_selectors_function_drop_type_t drop_val = mycss_selector_value_drop(selector->value); - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); - if(myhtml_strcasecmp(str.data ,"active") == 0) { + if(mycore_strcasecmp(str.data ,"active") == 0) { drop_val |= MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE; } - else if(myhtml_strcasecmp(str.data ,"valid") == 0) { + else if(mycore_strcasecmp(str.data ,"valid") == 0) { drop_val |= MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID; } - else if(myhtml_strcasecmp(str.data ,"invalid") == 0) { + else if(mycore_strcasecmp(str.data ,"invalid") == 0) { drop_val |= MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID; } else { @@ -426,7 +426,7 @@ bool mycss_selectors_function_parser_drop(mycss_entry_t* entry, mycss_token_t* t selector->value = (void*)drop_val; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); entry->parser = mycss_selectors_function_parser_drop_after; } diff --git a/source/mycss/selectors/function_parser.h b/source/mycss/selectors/function_parser.h index a0e67c2..8005872 100644 --- a/source/mycss/selectors/function_parser.h +++ b/source/mycss/selectors/function_parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/function_resource.h b/source/mycss/selectors/function_resource.h index a3a369e..67c48ac 100644 --- a/source/mycss/selectors/function_resource.h +++ b/source/mycss/selectors/function_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/init.c b/source/mycss/selectors/init.c index 8abffc3..4cec9cd 100644 --- a/source/mycss/selectors/init.c +++ b/source/mycss/selectors/init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,10 +23,10 @@ mycss_selectors_t * mycss_selectors_create(void) { - return (mycss_selectors_t*)myhtml_calloc(1, sizeof(mycss_selectors_t)); + return (mycss_selectors_t*)mycore_calloc(1, sizeof(mycss_selectors_t)); } -mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors) +mystatus_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors) { selectors->ref_entry = entry; selectors->entry = NULL; @@ -40,7 +40,7 @@ mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* sel if(selectors->mcobject_entries == NULL) return MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_CREATE; - myhtml_status_t myhtml_status = mcobject_init(selectors->mcobject_entries, 256, sizeof(mycss_selectors_entry_t)); + mystatus_t myhtml_status = mcobject_init(selectors->mcobject_entries, 256, sizeof(mycss_selectors_entry_t)); if(myhtml_status) return MyCSS_STATUS_ERROR_SELECTORS_ENTRIES_INIT; @@ -65,7 +65,7 @@ void mycss_selectors_clean(mycss_selectors_t* selectors) selectors->combinator = NULL; } -mycss_status_t mycss_selectors_clean_all(mycss_selectors_t* selectors) +mystatus_t mycss_selectors_clean_all(mycss_selectors_t* selectors) { selectors->entry = NULL; selectors->entry_last = NULL; @@ -88,7 +88,7 @@ mycss_selectors_t * mycss_selectors_destroy(mycss_selectors_t* selectors, bool s selectors->mcobject_list_entries = mcobject_destroy(selectors->mcobject_list_entries, true); if(self_destroy) { - myhtml_free(selectors); + mycore_free(selectors); return NULL; } @@ -111,7 +111,7 @@ mycss_token_t * mycss_selectors_parse_token_callback(mycss_entry_t* entry, mycss return entry->token; } -mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status) +mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status) { mycss_entry_t *entry = selectors->ref_entry; @@ -131,7 +131,7 @@ mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* se /* parsing */ mycss_encoding_set(entry, encoding); - mycss_status_t status = mycss_tokenizer_chunk(entry, data, data_size); + mystatus_t status = mycss_tokenizer_chunk(entry, data, data_size); if(status != MyCSS_STATUS_OK) { if(out_status) *out_status = status; @@ -150,7 +150,7 @@ mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* se return NULL; } -mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status) +mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status) { return mycss_selectors_parse_by_function(selectors, mycss_selectors_state_complex_selector_list, encoding, data, data_size, out_status); } @@ -177,7 +177,7 @@ mycss_selectors_entry_t * mycss_selectors_entry_destroy(mycss_selectors_t* selec return NULL; if(selector->key) { - myhtml_string_destroy(selector->key, false); + mycore_string_destroy(selector->key, false); mcobject_free(selectors->ref_entry->mcobject_string_entries, selector->key); } diff --git a/source/mycss/selectors/init.h b/source/mycss/selectors/init.h index 6fb47d9..629bafa 100644 --- a/source/mycss/selectors/init.h +++ b/source/mycss/selectors/init.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,9 +31,9 @@ extern "C" { #include "mycss/selectors/list.h" mycss_selectors_t * mycss_selectors_create(void); -mycss_status_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors); +mystatus_t mycss_selectors_init(mycss_entry_t* entry, mycss_selectors_t* selectors); void mycss_selectors_clean(mycss_selectors_t* selectors); -mycss_status_t mycss_selectors_clean_all(mycss_selectors_t* selectors); +mystatus_t mycss_selectors_clean_all(mycss_selectors_t* selectors); mycss_selectors_t * mycss_selectors_destroy(mycss_selectors_t* selectors, bool self_destroy); void mycss_selectors_entry_clean(mycss_selectors_entry_t* sel_entry); @@ -41,8 +41,8 @@ mycss_selectors_entry_t * mycss_selectors_entry_destroy(mycss_selectors_t* selec void * mycss_selectors_entry_value_destroy(mycss_entry_t* entry, mycss_selectors_entry_t* selector_entry, bool destroy_self); -mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); -mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myhtml_encoding_t encoding, const char* data, size_t data_size, mycss_status_t* out_status); +mycss_selectors_list_t * mycss_selectors_parse(mycss_selectors_t* selectors, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status); +mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* selectors, mycss_parser_token_f func, myencoding_t encoding, const char* data, size_t data_size, mystatus_t* out_status); mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector); diff --git a/source/mycss/selectors/list.c b/source/mycss/selectors/list.c index 4676dfe..454c7d3 100644 --- a/source/mycss/selectors/list.c +++ b/source/mycss/selectors/list.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/list.h b/source/mycss/selectors/list.h index 73bcc2c..e19fb33 100644 --- a/source/mycss/selectors/list.h +++ b/source/mycss/selectors/list.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/myosi.h b/source/mycss/selectors/myosi.h index e3d7e36..3df9c38 100644 --- a/source/mycss/selectors/myosi.h +++ b/source/mycss/selectors/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -36,7 +36,7 @@ typedef struct mycss_selectors_specificity mycss_selectors_specificity_t; #include "mycss/mystring.h" #include "mycss/namespace/myosi.h" #include "mycss/declaration/myosi.h" -#include "myhtml/utils/mcobject.h" +#include "mycore/utils/mcobject.h" typedef bool (*mycss_selectors_state_f)(mycss_entry_t* entry, mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_token_t* token); typedef void (*mycss_callback_selector_done_f)(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); @@ -218,7 +218,7 @@ struct mycss_selectors_entry { mycss_namespace_entry_t* ns_entry; - myhtml_string_t* key; + mycore_string_t* key; void* value; mycss_selectors_combinator_t combinator; diff --git a/source/mycss/selectors/myosi_resource.h b/source/mycss/selectors/myosi_resource.h index 70a0b6a..21baa67 100644 --- a/source/mycss/selectors/myosi_resource.h +++ b/source/mycss/selectors/myosi_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/parser.c b/source/mycss/selectors/parser.c index 316b667..688f458 100644 --- a/source/mycss/selectors/parser.c +++ b/source/mycss/selectors/parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -39,7 +39,7 @@ void mycss_selectors_parser_selector_ident_type(mycss_entry_t* entry, mycss_toke { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); /* set default namespace */ @@ -58,7 +58,7 @@ void mycss_selectors_parser_selector_ident_attr(mycss_entry_t* entry, mycss_toke { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); /* set default namespace */ @@ -77,7 +77,7 @@ void mycss_selectors_parser_selector_id(mycss_entry_t* entry, mycss_token_t* tok { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); /* set default namespace */ @@ -97,7 +97,7 @@ void mycss_selectors_parser_selector_class(mycss_entry_t* entry, mycss_token_t* { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); /* set default namespace */ @@ -120,10 +120,10 @@ void mycss_selectors_parser_selector_class(mycss_entry_t* entry, mycss_token_t* void mycss_selectors_parser_selector_namespace(mycss_entry_t* entry, mycss_token_t* token) { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = selector->key; + mycore_string_t *str = selector->key; if(str == NULL || str->length == 0) { - myhtml_string_destroy(str, 0); + mycore_string_destroy(str, 0); selector->key = NULL; @@ -134,7 +134,7 @@ void mycss_selectors_parser_selector_namespace(mycss_entry_t* entry, mycss_token } if(str->length == 1 && *str->data == '*') { - myhtml_string_destroy(str, 0); + mycore_string_destroy(str, 0); selector->key = NULL; @@ -150,7 +150,7 @@ void mycss_selectors_parser_selector_namespace(mycss_entry_t* entry, mycss_token if(selector->ns_entry == NULL) mycss_selectors_parser_expectations_error(entry, token); - myhtml_string_destroy(str, 0); + mycore_string_destroy(str, 0); selector->key = NULL; } @@ -178,7 +178,7 @@ void mycss_selectors_parser_selector_after_namespace(mycss_entry_t* entry, mycss { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, true); selector->key = str; @@ -209,7 +209,7 @@ void mycss_selectors_parser_selector_value(mycss_entry_t* entry, mycss_token_t* mycss_selectors_entry_t *selector = entry->selectors->entry_last; mycss_selectors_object_attribute_t *attr = selector->value; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, false); attr->value = str; @@ -229,7 +229,7 @@ void mycss_selectors_parser_selector_pseudo_class(mycss_entry_t* entry, mycss_to { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, true); selector->sub_type = mycss_pseudo_class_by_name(str->data, str->length); @@ -259,7 +259,7 @@ void mycss_selectors_parser_selector_pseudo_class_function(mycss_entry_t* entry, { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, true); selector->key = str; @@ -303,7 +303,7 @@ void mycss_selectors_parser_selector_pseudo_element(mycss_entry_t* entry, mycss_ { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, true); selector->key = str; @@ -325,7 +325,7 @@ void mycss_selectors_parser_selector_pseudo_element_function(mycss_entry_t* entr { mycss_selectors_entry_t *selector = entry->selectors->entry_last; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); mycss_token_data_to_string(entry, token, str, true, true); selector->key = str; @@ -373,7 +373,7 @@ void mycss_selectors_parser_bad_token(mycss_entry_t* entry, mycss_token_t* token if((selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) == 0) { selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); selector->key = str; mycss_token_data_to_string(entry, token, selector->key, true, false); diff --git a/source/mycss/selectors/parser.h b/source/mycss/selectors/parser.h index 78b7898..afe734a 100644 --- a/source/mycss/selectors/parser.h +++ b/source/mycss/selectors/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/pseudo.c b/source/mycss/selectors/pseudo.c index 4488a4d..39b2790 100644 --- a/source/mycss/selectors/pseudo.c +++ b/source/mycss/selectors/pseudo.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "mycss/selectors/pseudo.h" #include "mycss/selectors/pseudo_resource.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" ///////////////////////////////////////////////////////// //// Functions for a find Begin Function @@ -28,15 +28,15 @@ ///////////////////////////////////////////////////////// const mycss_selectots_pseudo_begin_entry_t * mycss_pseudo_begin_entry_by_name(const char* name, size_t length, size_t static_size, const mycss_selectots_pseudo_begin_entry_t* pseudo) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % static_size) + 1; while (pseudo[idx].name) { if(pseudo[idx].length == length) { - if(myhtml_strncasecmp(pseudo[idx].name, name, length) == 0) + if(mycore_strncasecmp(pseudo[idx].name, name, length) == 0) return &pseudo[idx]; if(pseudo[idx].next) diff --git a/source/mycss/selectors/pseudo.h b/source/mycss/selectors/pseudo.h index 84f3e83..8c53ab1 100644 --- a/source/mycss/selectors/pseudo.h +++ b/source/mycss/selectors/pseudo.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/pseudo_resource.h b/source/mycss/selectors/pseudo_resource.h index 4bb9994..9a8ce37 100644 --- a/source/mycss/selectors/pseudo_resource.h +++ b/source/mycss/selectors/pseudo_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/selectors/serialization.c b/source/mycss/selectors/serialization.c index 00933ad..f451dcd 100644 --- a/source/mycss/selectors/serialization.c +++ b/source/mycss/selectors/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,13 +22,13 @@ #include "mycss/selectors/myosi_resource.h" void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { while(selector) { if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_DESCENDANT) callback(" ", 1, context); else if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_UNDEF) { - /* fprintf(fh, "") */ + /* "" */ } else { callback(" ", 1, context); @@ -46,7 +46,7 @@ void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_sel } bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { while(selectors_list) { for(size_t i = 0; i < selectors_list->entries_list_length; i++) @@ -78,7 +78,7 @@ bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_sele } bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, - mycss_callback_serialization_f callback, void* context) + mycore_callback_serialize_f callback, void* context) { switch(selector->type) { case MyCSS_SELECTORS_TYPE_ELEMENT: { @@ -114,7 +114,7 @@ bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_ /* value */ if(mycss_selector_value_attribute(selector->value)->value) { - myhtml_string_t *str_value = mycss_selector_value_attribute(selector->value)->value; + mycore_string_t *str_value = mycss_selector_value_attribute(selector->value)->value; callback(str_value->data, str_value->length, context); } @@ -203,7 +203,7 @@ bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR: { if(selector->value) { - myhtml_string_t *str_fname = mycss_selector_value_string(selector->value); + mycore_string_t *str_fname = mycss_selector_value_string(selector->value); callback(str_fname->data, str_fname->length, context); } diff --git a/source/mycss/selectors/serialization.h b/source/mycss/selectors/serialization.h index 7d9d0cc..338278e 100644 --- a/source/mycss/selectors/serialization.h +++ b/source/mycss/selectors/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,9 +30,9 @@ extern "C" { #include "mycss/namespace/serialization.h" #include "mycss/declaration/serialization.h" -void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context); -bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, mycss_callback_serialization_f callback, void* context); -bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context); +void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycore_callback_serialize_f callback, void* context); +bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, mycore_callback_serialize_f callback, void* context); +bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/selectors/state.c b/source/mycss/selectors/state.c index fe91022..191ee75 100644 --- a/source/mycss/selectors/state.c +++ b/source/mycss/selectors/state.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -132,24 +132,24 @@ bool mycss_selectors_state_combinator(mycss_entry_t* entry, mycss_token_t* token switch (token->type) { case MyCSS_TOKEN_TYPE_COLUMN: { *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_COLUMN; - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_column") + MyCORE_DEBUG("mycss_selectors_state_combinator_column"); entry->parser = entry->parser_switch; break; } case MyCSS_TOKEN_TYPE_DELIM: { if(*token->data == '+') { *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_NEXT_SIBLING; - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_plus") + MyCORE_DEBUG("mycss_selectors_state_combinator_plus"); entry->parser = entry->parser_switch; } else if(*token->data == '>') { *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_CHILD; - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_greater_than") + MyCORE_DEBUG("mycss_selectors_state_combinator_greater_than"); entry->parser = mycss_selectors_state_combinator_greater_than; } else if(*token->data == '~') { *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_FOLLOWING_SIBLING; - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_tilde") + MyCORE_DEBUG("mycss_selectors_state_combinator_tilde"); entry->parser = entry->parser_switch; } else { @@ -175,7 +175,7 @@ bool mycss_selectors_state_combinator_greater_than(mycss_entry_t* entry, mycss_t if(token->type == MyCSS_TOKEN_TYPE_DELIM) { if(*token->data == '>') { *entry->selectors->combinator = MyCSS_SELECTORS_COMBINATOR_DESCENDANT; - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_combinator_greater_than_greater_than") + MyCORE_DEBUG("mycss_selectors_state_combinator_greater_than_greater_than"); entry->parser = entry->parser_switch; } else { @@ -573,7 +573,7 @@ bool mycss_selectors_state_simple_selector(mycss_entry_t* entry, mycss_token_t* switch (token->type) { case MyCSS_TOKEN_TYPE_IDENT: { mycss_selectors_parser_selector_ident_type(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_ident") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_ident"); entry->parser = mycss_selectors_state_simple_selector_ident; break; @@ -582,7 +582,7 @@ bool mycss_selectors_state_simple_selector(mycss_entry_t* entry, mycss_token_t* // HAND_EDIT_BEGIN if(*token->data == '*') { mycss_selectors_parser_selector_ident_type(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_asterisk") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_asterisk"); entry->parser = mycss_selectors_state_simple_selector_ident; } @@ -613,7 +613,7 @@ bool mycss_selectors_state_simple_selector(mycss_entry_t* entry, mycss_token_t* } case MyCSS_TOKEN_TYPE_HASH: { mycss_selectors_parser_selector_id(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_hash") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_hash"); entry->parser = entry->parser_switch; break; } @@ -772,7 +772,7 @@ bool mycss_selectors_state_simple_selector_left_bracket_ident(mycss_entry_t* ent } case MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET: { mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_left_bracket_ident_right_bracket") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_left_bracket_ident_right_bracket"); entry->parser = entry->parser_switch; break; } @@ -815,7 +815,7 @@ bool mycss_selectors_state_simple_selector_colon(mycss_entry_t* entry, mycss_tok switch (token->type) { case MyCSS_TOKEN_TYPE_IDENT: { mycss_selectors_parser_selector_pseudo_class(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_ident") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_colon_ident"); entry->parser = entry->parser_switch; break; } @@ -841,7 +841,7 @@ bool mycss_selectors_state_simple_selector_colon_colon(mycss_entry_t* entry, myc { if(token->type == MyCSS_TOKEN_TYPE_IDENT) { mycss_selectors_parser_selector_pseudo_element(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_colon_ident") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_colon_colon_ident"); entry->parser = entry->parser_switch; } else if(token->type == MyCSS_TOKEN_TYPE_FUNCTION) { @@ -860,7 +860,7 @@ bool mycss_selectors_state_simple_selector_colon_colon_function(mycss_entry_t* e { if(token->type == MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS) { mycss_selectors_parser_selector_pseudo_element_function_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_colon_function_right_parenthesis") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_colon_colon_function_right_parenthesis"); entry->parser = entry->parser_switch; } else { @@ -876,7 +876,7 @@ bool mycss_selectors_state_simple_selector_colon_function(mycss_entry_t* entry, { if(token->type == MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS) { mycss_selectors_parser_selector_pseudo_class_function_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_colon_function_right_parenthesis") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_colon_function_right_parenthesis"); entry->parser = entry->parser_switch; } else { @@ -893,7 +893,7 @@ bool mycss_selectors_state_simple_selector_full_stop(mycss_entry_t* entry, mycss { if(token->type == MyCSS_TOKEN_TYPE_IDENT) { mycss_selectors_parser_selector_class(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_full_stop_ident") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_full_stop_ident"); entry->parser = entry->parser_switch; } else { @@ -910,14 +910,14 @@ bool mycss_selectors_state_simple_selector_vertical_bar(mycss_entry_t* entry, my if(token->type == MyCSS_TOKEN_TYPE_IDENT) { mycss_selectors_parser_selector_after_namespace(entry, token); mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_vertical_bar_ident") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_vertical_bar_ident"); entry->parser = entry->parser_switch; } else if(token->type == MyCSS_TOKEN_TYPE_DELIM) { if(*token->data == '*') { mycss_selectors_parser_selector_after_namespace(entry, token); mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_vertical_bar_asterisk") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_vertical_bar_asterisk"); entry->parser = entry->parser_switch; } else { @@ -964,14 +964,14 @@ bool mycss_selectors_state_simple_selector_ident_vertical_bar(mycss_entry_t* ent if(token->type == MyCSS_TOKEN_TYPE_IDENT) { mycss_selectors_parser_selector_after_namespace(entry, token); mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_ident_vertical_bar_ident") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_ident_vertical_bar_ident"); entry->parser = entry->parser_switch; } else if(token->type == MyCSS_TOKEN_TYPE_DELIM) { if(*token->data == '*') { mycss_selectors_parser_selector_after_namespace(entry, token); mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_simple_selector_ident_vertical_bar_asterisk") + MyCORE_DEBUG("mycss_selectors_state_simple_selector_ident_vertical_bar_asterisk"); entry->parser = entry->parser_switch; } else { @@ -1064,7 +1064,7 @@ bool mycss_selectors_state_left_bracket_after_wq_name_attr(mycss_entry_t* entry, } case MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET: { mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_shared_after_wq_name_attr_right_bracket") + MyCORE_DEBUG("mycss_selectors_state_shared_after_wq_name_attr_right_bracket"); entry->parser = entry->parser_switch; break; } @@ -1089,7 +1089,7 @@ bool mycss_selectors_state_shared_after_attr_modifier(mycss_entry_t* entry, mycs if(token->type == MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET) { mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_shared_after_attr_modifier_right_bracket") + MyCORE_DEBUG("mycss_selectors_state_shared_after_attr_modifier_right_bracket"); entry->parser = entry->parser_switch; } else { @@ -1119,7 +1119,7 @@ bool mycss_selectors_state_shared_after_attribute_value(mycss_entry_t* entry, my } else if(token->type == MyCSS_TOKEN_TYPE_RIGHT_SQUARE_BRACKET) { mycss_selectors_parser_selector_end(entry, token); - MyCSS_DEBUG_MESSAGE("mycss_selectors_state_shared_after_attribute_value_right_bracket") + MyCORE_DEBUG("mycss_selectors_state_shared_after_attribute_value_right_bracket"); entry->parser = entry->parser_switch; } else { diff --git a/source/mycss/selectors/state.h b/source/mycss/selectors/state.h index 2cea842..0555a95 100644 --- a/source/mycss/selectors/state.h +++ b/source/mycss/selectors/state.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,7 +29,7 @@ extern "C" { #include "mycss/entry.h" #include "mycss/selectors/myosi.h" #include "mycss/selectors/parser.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" void mycss_selectors_state_end(mycss_entry_t* entry); bool mycss_selectors_state_function_skip_all(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/source/mycss/selectors/value.c b/source/mycss/selectors/value.c index f72c101..d0f0588 100644 --- a/source/mycss/selectors/value.c +++ b/source/mycss/selectors/value.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -47,7 +47,7 @@ mycss_selectors_object_attribute_t * mycss_selectors_value_attribute_create(mycs ///////////////////////////////////////////////////////// void * mycss_selectors_value_undef_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) { - myhtml_string_destroy(mycss_selector_value_string(value), false); + mycore_string_destroy(mycss_selector_value_string(value), false); mcobject_free(entry->mcobject_string_entries, value); return NULL; @@ -55,7 +55,7 @@ void * mycss_selectors_value_undef_destroy(mycss_entry_t* entry, mycss_selectors void * mycss_selectors_value_id_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) { - myhtml_string_destroy(mycss_selector_value_string(value), false); + mycore_string_destroy(mycss_selector_value_string(value), false); if(self_destroy) { mcobject_free(entry->mcobject_string_entries, value); @@ -67,7 +67,7 @@ void * mycss_selectors_value_id_destroy(mycss_entry_t* entry, mycss_selectors_ty void * mycss_selectors_value_class_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) { - myhtml_string_destroy(mycss_selector_value_string(value), false); + mycore_string_destroy(mycss_selector_value_string(value), false); if(self_destroy) { mcobject_free(entry->mcobject_string_entries, value); @@ -79,7 +79,7 @@ void * mycss_selectors_value_class_destroy(mycss_entry_t* entry, mycss_selectors void * mycss_selectors_value_element_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) { - myhtml_string_destroy(mycss_selector_value_string(value), false); + mycore_string_destroy(mycss_selector_value_string(value), false); if(self_destroy) { mcobject_free(entry->mcobject_string_entries, value); @@ -92,7 +92,7 @@ void * mycss_selectors_value_element_destroy(mycss_entry_t* entry, mycss_selecto void * mycss_selectors_value_attribute_destroy(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy) { if(mycss_selector_value_attribute(value)->value) { - myhtml_string_destroy(mycss_selector_value_attribute(value)->value, false); + mycore_string_destroy(mycss_selector_value_attribute(value)->value, false); mcobject_free(entry->mcobject_string_entries, mycss_selector_value_attribute(value)->value); } @@ -128,10 +128,10 @@ void * mycss_selectors_value_pseudo_class_function_current_create(mycss_entry_t* void * mycss_selectors_value_pseudo_class_function_dir_create(mycss_entry_t* entry, bool set_clean) { - myhtml_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); + mycore_string_t *str = mcobject_malloc(entry->mcobject_string_entries, NULL); if(set_clean) - myhtml_string_clean_all(str); + mycore_string_clean_all(str); return str; } @@ -154,7 +154,7 @@ void * mycss_selectors_value_pseudo_class_function_lang_create(mycss_entry_t* en if(set_clean) { lang->next = NULL; - myhtml_string_clean_all(&lang->str); + mycore_string_clean_all(&lang->str); } return lang; @@ -227,7 +227,7 @@ void * mycss_selectors_value_pseudo_class_function_current_destroy(mycss_entry_t void * mycss_selectors_value_pseudo_class_function_dir_destroy(mycss_entry_t* entry, void* value, bool self_destroy) { - return myhtml_string_destroy(value, self_destroy); + return mycore_string_destroy(value, self_destroy); } void * mycss_selectors_value_pseudo_class_function_drop_destroy(mycss_entry_t* entry, void* value, bool self_destroy) @@ -253,7 +253,7 @@ void * mycss_selectors_value_pseudo_class_function_lang_destroy(mycss_entry_t* e mycss_selectors_value_lang_t *lang_entry = mycss_selector_value_lang(value); while(lang_entry) { - myhtml_string_destroy(&lang_entry->str, false); + mycore_string_destroy(&lang_entry->str, false); lang_entry = lang_entry->next; } diff --git a/source/mycss/selectors/value.h b/source/mycss/selectors/value.h index cd71770..8fd23f7 100644 --- a/source/mycss/selectors/value.h +++ b/source/mycss/selectors/value.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ #pragma once #define mycss_selector_value_attribute(obj) ((mycss_selectors_object_attribute_t*)(obj)) -#define mycss_selector_value_string(obj) ((myhtml_string_t*)(obj)) +#define mycss_selector_value_string(obj) ((mycore_string_t*)(obj)) #define mycss_selector_value_an_plus_b(obj) ((mycss_an_plus_b_entry_t*)(obj)) #define mycss_selector_value_drop(obj) ((mycss_selectors_function_drop_type_t)(obj)) #define mycss_selector_value_lang(obj) ((mycss_selectors_value_lang_t*)(obj)) @@ -36,13 +36,13 @@ extern "C" { #include "mycss/entry.h" #include "mycss/selectors/myosi.h" -#include "myhtml/utils/mchar_async.h" +#include "mycore/utils/mchar_async.h" typedef void * (*mycss_selectors_value_destroy_f)(mycss_entry_t* entry, mycss_selectors_type_t type, int sub_type, void* value, bool self_destroy); typedef void * (*mycss_selectors_value_function_destroy_f)(mycss_entry_t* entry, void* value, bool self_destroy); struct mycss_selectors_value_attribute { - myhtml_string_t* value; + mycore_string_t* value; mycss_selectors_match_t match; mycss_selectors_mod_t mod; @@ -50,7 +50,7 @@ struct mycss_selectors_value_attribute { typedef mycss_selectors_object_attribute_t; struct mycss_selectors_value_lang { - myhtml_string_t str; + mycore_string_t str; struct mycss_selectors_value_lang* next; } typedef mycss_selectors_value_lang_t; diff --git a/source/mycss/selectors/value_resource.h b/source/mycss/selectors/value_resource.h index 328fd62..c2e0eb2 100644 --- a/source/mycss/selectors/value_resource.h +++ b/source/mycss/selectors/value_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/stack.c b/source/mycss/stack.c index 9e0928b..d2bea18 100644 --- a/source/mycss/stack.c +++ b/source/mycss/stack.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,14 +22,14 @@ mycss_stack_t * mycss_stack_create(void) { - return myhtml_calloc(1, sizeof(mycss_stack_t)); + return mycore_calloc(1, sizeof(mycss_stack_t)); } -mycss_status_t mycss_stack_init(mycss_stack_t *stack, size_t size) +mystatus_t mycss_stack_init(mycss_stack_t *stack, size_t size) { stack->entries_size = size; stack->entries_length = 0; - stack->entries = (mycss_stack_entry_t*)myhtml_calloc(stack->entries_size, sizeof(mycss_stack_entry_t)); + stack->entries = (mycss_stack_entry_t*)mycore_calloc(stack->entries_size, sizeof(mycss_stack_entry_t)); if(stack->entries == NULL) return MyCSS_STATUS_ERROR_MEMORY_ALLOCATION; @@ -48,24 +48,24 @@ mycss_stack_t * mycss_stack_destroy(mycss_stack_t *stack, bool self_destroy) return NULL; if(stack->entries) { - myhtml_free(stack->entries); + mycore_free(stack->entries); stack->entries = NULL; } if(self_destroy) { - myhtml_free(stack); + mycore_free(stack); return NULL; } return stack; } -mycss_status_t mycss_stack_push(mycss_stack_t *stack, void* value, mycss_parser_token_f parser) +mystatus_t mycss_stack_push(mycss_stack_t *stack, void* value, mycss_parser_token_f parser) { if(stack->entries_length >= stack->entries_size) { size_t new_size = stack->entries_length << 1; - mycss_stack_entry_t *entries = (mycss_stack_entry_t*)myhtml_realloc(stack->entries, + mycss_stack_entry_t *entries = (mycss_stack_entry_t*)mycore_realloc(stack->entries, sizeof(mycss_stack_entry_t) * new_size); if(entries) { diff --git a/source/mycss/stack.h b/source/mycss/stack.h index cf5140a..e03334e 100644 --- a/source/mycss/stack.h +++ b/source/mycss/stack.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -42,11 +42,11 @@ struct mycss_stack { typedef mycss_stack_t; mycss_stack_t * mycss_stack_create(void); -mycss_status_t mycss_stack_init(mycss_stack_t *stack, size_t size); +mystatus_t mycss_stack_init(mycss_stack_t *stack, size_t size); void mycss_stack_clean(mycss_stack_t *stack); mycss_stack_t * mycss_stack_destroy(mycss_stack_t *stack, bool self_destroy); -mycss_status_t mycss_stack_push(mycss_stack_t *stack, void* value, mycss_parser_token_f parser); +mystatus_t mycss_stack_push(mycss_stack_t *stack, void* value, mycss_parser_token_f parser); mycss_stack_entry_t * mycss_stack_pop(mycss_stack_t *stack); mycss_stack_entry_t * mycss_stack_current(mycss_stack_t *stack); diff --git a/source/mycss/stylesheet.c b/source/mycss/stylesheet.c index dc998c0..8990026 100644 --- a/source/mycss/stylesheet.c +++ b/source/mycss/stylesheet.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,23 +22,23 @@ mycss_stylesheet_t * mycss_stylesheet_create(void) { - return (mycss_stylesheet_t*)myhtml_calloc(1, sizeof(mycss_stylesheet_t)); + return (mycss_stylesheet_t*)mycore_calloc(1, sizeof(mycss_stylesheet_t)); } -mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry) +mystatus_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry) { stylesheet->entry = entry; - mycss_status_t status = mycss_namespace_stylesheet_init(&stylesheet->ns_stylesheet, entry); + mystatus_t status = mycss_namespace_stylesheet_init(&stylesheet->ns_stylesheet, entry); if(status != MyCSS_STATUS_OK) return status; return MyCSS_STATUS_OK; } -mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet) +mystatus_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet) { - mycss_status_t status = mycss_namespace_stylesheet_clean(&stylesheet->ns_stylesheet, stylesheet->entry); + mystatus_t status = mycss_namespace_stylesheet_clean(&stylesheet->ns_stylesheet, stylesheet->entry); if(status != MyCSS_STATUS_OK) return status; @@ -52,7 +52,7 @@ mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bo mycss_namespace_stylesheet_destroy(&stylesheet->ns_stylesheet, stylesheet->entry, false); if(self_destroy) { - myhtml_free(stylesheet); + mycore_free(stylesheet); return NULL; } @@ -60,7 +60,7 @@ mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bo } /* print */ -void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycss_callback_serialization_f callback, void* context) +void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycore_callback_serialize_f callback, void* context) { mycss_selectors_serialization_list(stylesheet->entry->selectors, stylesheet->sel_list_first, callback, context); } diff --git a/source/mycss/stylesheet.h b/source/mycss/stylesheet.h index dd7d8a9..c4dafa1 100644 --- a/source/mycss/stylesheet.h +++ b/source/mycss/stylesheet.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,11 +45,11 @@ struct mycss_stylesheet { }; mycss_stylesheet_t * mycss_stylesheet_create(void); -mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry); -mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet); +mystatus_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry_t* entry); +mystatus_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet); mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy); -void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycss_callback_serialization_f callback, void* context); +void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/tokenizer.c b/source/mycss/tokenizer.c index 522c60d..5f2c03b 100644 --- a/source/mycss/tokenizer.c +++ b/source/mycss/tokenizer.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,11 +20,11 @@ #include "mycss/tokenizer.h" #include "mycss/tokenizer_resource.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" -mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length) +mystatus_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length) { - entry->current_buffer = myhtml_incoming_buffer_add(entry->current_buffer, entry->mcobject_incoming_buffer, + entry->current_buffer = mycore_incoming_buffer_add(entry->current_buffer, entry->mcobject_incoming_buffer, css, css_length); if(entry->current_buffer == NULL) @@ -35,7 +35,7 @@ mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size entry->first_buffer = entry->current_buffer; if(entry->token == NULL) { - entry->token = (mycss_token_t*)myhtml_calloc(1, sizeof(mycss_token_t)); + entry->token = (mycss_token_t*)mycore_calloc(1, sizeof(mycss_token_t)); if(entry->token == NULL) return MyCSS_STATUS_ERROR_TOKENIZER_TOKEN_ALLOCATION; @@ -44,7 +44,7 @@ mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size return mycss_tokenizer_process(entry, css, css_length); } -mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length) +mystatus_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length) { /* Why use utf-8 when the declaration says utf-16? @@ -57,16 +57,16 @@ mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, si As well, this mimics the behavior of HTML’s attribute. */ - if(entry->encoding == MyHTML_ENCODING_UTF_16LE || entry->encoding == MyHTML_ENCODING_UTF_16BE) - entry->encoding = MyHTML_ENCODING_UTF_8; + if(entry->encoding == MyENCODING_UTF_16LE || entry->encoding == MyENCODING_UTF_16BE) + entry->encoding = MyENCODING_UTF_8; mycss_t* mycss = entry->mycss; mycss_tokenizer_state_f* state_f = mycss->parse_state_func; - myhtml_incoming_buffer_t *current = entry->current_buffer; + mycore_incoming_buffer_t *current = entry->current_buffer; do { - myhtml_incoming_buffer_t *mt = entry->current_buffer; + mycore_incoming_buffer_t *mt = entry->current_buffer; mt->length = 0; while (mt->length < mt->size) { @@ -82,14 +82,14 @@ mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, si return MyCSS_STATUS_OK; } -mycss_status_t mycss_tokenizer_end(mycss_entry_t* entry) +mystatus_t mycss_tokenizer_end(mycss_entry_t* entry) { mycss_t* mycss = entry->mycss; mycss_tokenizer_state_f* state_f = mycss->parse_state_func; if(entry->state != MyCSS_TOKENIZER_STATE_DATA) { - myhtml_incoming_buffer_t *mt = entry->current_buffer; + mycore_incoming_buffer_t *mt = entry->current_buffer; size_t end_state = (MyCSS_TOKENIZER_STATE_LAST_ENTRY + entry->state); mt->length = state_f[end_state](entry, entry->token, mt->data, mt->length, mt->size); @@ -116,7 +116,7 @@ size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entr if(css_offset >= css_minus_offset) return css_offset; - myhtml_incoming_buffer_t *buffer = entry->current_buffer; + mycore_incoming_buffer_t *buffer = entry->current_buffer; size_t need = (css_minus_offset - css_offset); size_t position = buffer->offset - need; @@ -134,11 +134,11 @@ size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entr size_t mycss_tokenizer_token_strcasecmp(mycss_entry_t* entry, mycss_token_t* token, const char* to, size_t to_length) { - myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(entry->current_buffer, token->begin); + mycore_incoming_buffer_t *buffer = mycore_incoming_buffer_find_by_position(entry->current_buffer, token->begin); size_t token_offset = token->begin - buffer->offset; - return myhtml_incoming_buffer_escaped_case_cmp(&buffer, to, to_length, &token_offset); + return mycore_incoming_buffer_escaped_case_cmp(&buffer, to, to_length, &token_offset); } ////////////////////// @@ -668,7 +668,7 @@ size_t mycss_tokenizer_state_solidus_comment_end(mycss_entry_t* entry, mycss_tok if(css[css_offset] == '/') { if(css_offset == 0) { - myhtml_incoming_buffer_t *buffer = entry->current_buffer->prev; + mycore_incoming_buffer_t *buffer = entry->current_buffer->prev; while(buffer && buffer->size == 0) buffer = buffer->prev; @@ -1052,7 +1052,7 @@ size_t mycss_tokenizer_state_letter_u(mycss_entry_t* entry, mycss_token_t* token return css_offset; } - if(myhtml_string_chars_hex_map[ (const unsigned char)(css[css_offset]) ] != 0xff || + if(mycore_string_chars_hex_map[ (const unsigned char)(css[css_offset]) ] != 0xff || css[css_offset] == '?') { token->begin += 2; @@ -1075,7 +1075,7 @@ size_t mycss_tokenizer_state_letter_u(mycss_entry_t* entry, mycss_token_t* token size_t mycss_tokenizer_state_letter_u_next(mycss_entry_t* entry, mycss_token_t* token, const char* css, size_t css_offset, size_t css_size) { - if(myhtml_string_chars_hex_map[ (const unsigned char)(css[css_offset]) ] != 0xff || + if(mycore_string_chars_hex_map[ (const unsigned char)(css[css_offset]) ] != 0xff || css[css_offset] == '?') { token->begin += 2; @@ -1186,9 +1186,9 @@ size_t mycss_tokenizer_state_delim_single_code_point(mycss_entry_t* entry, mycss //// init tokenizer //// ///////////////////////////////////////////////////////// -mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss) +mystatus_t mycss_tokenizer_state_init(mycss_t* mycss) { - mycss->parse_state_func = (mycss_tokenizer_state_f*)myhtml_calloc((MyCSS_TOKENIZER_STATE_LAST_ENTRY * 2), sizeof(mycss_tokenizer_state_f)); + mycss->parse_state_func = (mycss_tokenizer_state_f*)mycore_calloc((MyCSS_TOKENIZER_STATE_LAST_ENTRY * 2), sizeof(mycss_tokenizer_state_f)); if(mycss->parse_state_func == NULL) return MyCSS_STATUS_ERROR_TOKENIZER_STATE_ALLOCATION; @@ -1361,7 +1361,7 @@ mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss) void mycss_tokenizer_state_destroy(mycss_t* mycss) { if(mycss->parse_state_func) { - free(mycss->parse_state_func); + mycore_free(mycss->parse_state_func); mycss->parse_state_func = NULL; } } diff --git a/source/mycss/tokenizer.h b/source/mycss/tokenizer.h index a712ad3..8caf24b 100644 --- a/source/mycss/tokenizer.h +++ b/source/mycss/tokenizer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -33,7 +33,7 @@ extern "C" { #include "mycss/tokenizer_global.h" #include "mycss/tokenizer_end.h" -#include "myhtml/incoming.h" +#include "mycore/incoming.h" #define MyCSS_TOKEN_READY_CALLBACK_FUNCTION(ENTRY, TOKEN) \ ++ENTRY->token_counter; \ @@ -53,12 +53,12 @@ struct mycss_token { const char* data; }; -mycss_status_t mycss_tokenizer_state_init(mycss_t* mycss); +mystatus_t mycss_tokenizer_state_init(mycss_t* mycss); void mycss_tokenizer_state_destroy(mycss_t* mycss); -mycss_status_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length); -mycss_status_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length); -mycss_status_t mycss_tokenizer_end(mycss_entry_t* entry); +mystatus_t mycss_tokenizer_chunk(mycss_entry_t* entry, const char* css, size_t css_length); +mystatus_t mycss_tokenizer_process(mycss_entry_t* entry, const char* css, size_t css_length); +mystatus_t mycss_tokenizer_end(mycss_entry_t* entry); size_t mycss_tokenizer_run_state_single(mycss_entry_t* entry, mycss_tokenizer_state_t state, const char* css, size_t css_offset, size_t css_size); size_t mycss_tokenizer_state_set_current_buffer_for_continue(mycss_entry_t* entry, size_t css_offset, size_t css_minus_offset); diff --git a/source/mycss/tokenizer_end.c b/source/mycss/tokenizer_end.c index ba5c1f2..d722f48 100644 --- a/source/mycss/tokenizer_end.c +++ b/source/mycss/tokenizer_end.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/tokenizer_end.h b/source/mycss/tokenizer_end.h index 590f1e0..27e4370 100644 --- a/source/mycss/tokenizer_end.h +++ b/source/mycss/tokenizer_end.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/tokenizer_global.c b/source/mycss/tokenizer_global.c index 6edb86b..9b1fdea 100644 --- a/source/mycss/tokenizer_global.c +++ b/source/mycss/tokenizer_global.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "mycss/tokenizer_global.h" #include "mycss/tokenizer_resource.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" ///////////////////////////////////////////////////////// //// Global back @@ -676,7 +676,7 @@ size_t mycss_tokenizer_global_state_unicode_range(mycss_entry_t* entry, mycss_to while(css_offset < css_size) { - if(myhtml_string_chars_hex_map[ u_css[css_offset] ] != 0xff) + if(mycore_string_chars_hex_map[ u_css[css_offset] ] != 0xff) { entry->help_counter++; @@ -758,7 +758,7 @@ size_t mycss_tokenizer_global_state_unicode_range_minus(mycss_entry_t* entry, my while(css_offset < css_size) { - if(myhtml_string_chars_hex_map[ u_css[css_offset] ] != 0xff) + if(mycore_string_chars_hex_map[ u_css[css_offset] ] != 0xff) { entry->help_counter++; diff --git a/source/mycss/tokenizer_global.h b/source/mycss/tokenizer_global.h index 37327d6..5ba51c5 100644 --- a/source/mycss/tokenizer_global.h +++ b/source/mycss/tokenizer_global.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/tokenizer_resource.h b/source/mycss/tokenizer_resource.h index 623a904..4d39109 100644 --- a/source/mycss/tokenizer_resource.h +++ b/source/mycss/tokenizer_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/color.c b/source/mycss/values/color.c index cb22714..4a161f0 100644 --- a/source/mycss/values/color.c +++ b/source/mycss/values/color.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,19 +20,19 @@ #include "mycss/values/color.h" #include "mycss/values/color_resources.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" const mycss_values_color_index_static_entry_t * mycss_values_color_index_entry_by_name(const char* name, size_t length) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_COLOR_NAME_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; while (mycss_values_color_name_index_static_for_search[idx].name) { if(mycss_values_color_name_index_static_for_search[idx].name_length == length) { - if(myhtml_strncasecmp(mycss_values_color_name_index_static_for_search[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_values_color_name_index_static_for_search[idx].name, name, length) == 0) return &mycss_values_color_name_index_static_for_search[idx]; if(mycss_values_color_name_index_static_for_search[idx].next) @@ -80,15 +80,15 @@ const char * mycss_values_color_name_by_id(mycss_values_color_id_t color_id, siz const mycss_values_color_function_index_static_entry_t * mycss_values_color_function_index_entry_by_name(const char* name, size_t length) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_COLOR_FUNCTION_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; while (mycss_values_color_function_index_static_for_search[idx].name) { if(mycss_values_color_function_index_static_for_search[idx].name_length == length) { - if(myhtml_strncasecmp(mycss_values_color_function_index_static_for_search[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_values_color_function_index_static_for_search[idx].name, name, length) == 0) return &mycss_values_color_function_index_static_for_search[idx]; if(mycss_values_color_function_index_static_for_search[idx].next) diff --git a/source/mycss/values/color.h b/source/mycss/values/color.h index 1220c77..2819a39 100644 --- a/source/mycss/values/color.h +++ b/source/mycss/values/color.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/color_const.h b/source/mycss/values/color_const.h index fb28243..0c614b8 100644 --- a/source/mycss/values/color_const.h +++ b/source/mycss/values/color_const.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/color_parser.c b/source/mycss/values/color_parser.c index 661da53..b84f4b3 100644 --- a/source/mycss/values/color_parser.c +++ b/source/mycss/values/color_parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,7 +19,7 @@ */ #include "mycss/values/color_parser.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" bool mycss_values_color_parser_undef(mycss_entry_t* entry, mycss_token_t* token, bool last_response) { @@ -51,39 +51,39 @@ static bool mycss_values_color_parser_find_end(mycss_entry_t* entry, mycss_token static void mycss_values_color_parser_set_percentage_value(mycss_entry_t* entry, mycss_token_t* token, mycss_values_percentage_t *color_rgb) { - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_token_data_to_string(entry, token, &str, true, false); double return_num; mycss_convert_data_to_double(str.data, str.length, &return_num, &color_rgb->is_float); if(color_rgb->is_float) - color_rgb->f = (float)return_num; + color_rgb->value.f = (float)return_num; else - color_rgb->i = (int)return_num; + color_rgb->value.i = (int)return_num; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } static void mycss_values_color_parser_set_number_value(mycss_entry_t* entry, mycss_token_t* token, mycss_values_number_t *color_rgb) { - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_token_data_to_string(entry, token, &str, true, false); double return_num; mycss_convert_data_to_double(str.data, str.length, &return_num, &color_rgb->is_float); if(color_rgb->is_float) - color_rgb->f = (float)return_num; + color_rgb->value.f = (float)return_num; else - color_rgb->i = (int)return_num; + color_rgb->value.i = (int)return_num; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } static bool mycss_values_color_parser_set_angle_value(mycss_entry_t* entry, mycss_token_t* token, mycss_values_angle_t *angle) { - myhtml_string_t str = {0}; + mycore_string_t str = {0}; mycss_token_data_to_string(entry, token, &str, true, false); bool is_float; @@ -92,7 +92,7 @@ static bool mycss_values_color_parser_set_angle_value(mycss_entry_t* entry, mycs size_t consume_length = mycss_convert_data_to_double(str.data, str.length, &return_num, &is_float); mycss_units_type_t type = mycss_units_type_by_name(&str.data[consume_length], (str.length - consume_length)); - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); switch (type) { case MyCSS_UNIT_TYPE_DEG: @@ -106,9 +106,9 @@ static bool mycss_values_color_parser_set_angle_value(mycss_entry_t* entry, mycs } if(is_float) - angle->f = (float)return_num; + angle->value.f = (float)return_num; else - angle->i = (int)return_num; + angle->value.i = (int)return_num; angle->is_float = is_float; angle->type = type; @@ -120,14 +120,14 @@ static bool mycss_values_color_parser_rgb_full(mycss_entry_t* entry, mycss_token { if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) { - mycss_values_color_parser_set_percentage_value(entry, token, &color->rgba_percentage.r); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.rgba_percentage.r); color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; entry->parser = mycss_values_color_parser_rgb_before_g_percentage; } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->rgba_number.r); + mycss_values_color_parser_set_number_value(entry, token, &color->value.rgba_number.r); color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; entry->parser = mycss_values_color_parser_rgb_before_g_number; @@ -217,7 +217,7 @@ bool mycss_values_color_parser_rgb_g_percentage(mycss_entry_t* entry, mycss_toke } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_percentage_value(entry, token, &color->rgba_percentage.g); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.rgba_percentage.g); entry->parser = mycss_values_color_parser_rgb_before_b_percentage; @@ -259,7 +259,7 @@ bool mycss_values_color_parser_rgb_b_percentage(mycss_entry_t* entry, mycss_toke } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_percentage_value(entry, token, &color->rgba_percentage.b); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.rgba_percentage.b); entry->parser = mycss_values_color_parser_rgb_before_alpha_percentage; return true; @@ -307,12 +307,12 @@ bool mycss_values_color_parser_rgb_alpha_percentage(mycss_entry_t* entry, mycss_ mycss_values_color_t *color = declr_entry->value; if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) { - mycss_values_color_parser_set_percentage_value(entry, token, &color->rgba_percentage.alpha.percentage); - color->rgba_percentage.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.rgba_percentage.alpha.value.percentage); + color->value.rgba_percentage.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->rgba_percentage.alpha.number); - color->rgba_percentage.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + mycss_values_color_parser_set_number_value(entry, token, &color->value.rgba_percentage.alpha.value.number); + color->value.rgba_percentage.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { mycss_values_color_parser_switch_parser(entry); @@ -364,7 +364,7 @@ bool mycss_values_color_parser_rgb_g_number(mycss_entry_t* entry, mycss_token_t* } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_number_value(entry, token, &color->rgba_number.g); + mycss_values_color_parser_set_number_value(entry, token, &color->value.rgba_number.g); entry->parser = mycss_values_color_parser_rgb_before_b_number; return true; @@ -408,7 +408,7 @@ bool mycss_values_color_parser_rgb_b_number(mycss_entry_t* entry, mycss_token_t* } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_number_value(entry, token, &color->rgba_number.b); + mycss_values_color_parser_set_number_value(entry, token, &color->value.rgba_number.b); entry->parser = mycss_values_color_parser_rgb_before_alpha_number; return true; @@ -456,12 +456,12 @@ bool mycss_values_color_parser_rgb_alpha_number(mycss_entry_t* entry, mycss_toke mycss_values_color_t *color = declr_entry->value; if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) { - mycss_values_color_parser_set_percentage_value(entry, token, &color->rgba_number.alpha.percentage); - color->rgba_number.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.rgba_number.alpha.value.percentage); + color->value.rgba_number.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->rgba_number.alpha.number); - color->rgba_number.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + mycss_values_color_parser_set_number_value(entry, token, &color->value.rgba_number.alpha.value.number); + color->value.rgba_number.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { mycss_values_color_parser_switch_parser(entry); @@ -478,7 +478,7 @@ bool mycss_values_color_parser_rgb_alpha_number(mycss_entry_t* entry, mycss_toke static bool mycss_values_color_parser_hsla_full(mycss_entry_t* entry, mycss_token_t* token, mycss_values_color_t *color) { if(token->type == MyCSS_TOKEN_TYPE_DIMENSION) { - if(mycss_values_color_parser_set_angle_value(entry, token, &color->hsla.hue.angle) == false) { + if(mycss_values_color_parser_set_angle_value(entry, token, &color->value.hsla.hue.value.angle) == false) { mycss_values_color_parser_switch_parser(entry); return false; } @@ -487,7 +487,7 @@ static bool mycss_values_color_parser_hsla_full(mycss_entry_t* entry, mycss_toke } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->hsla.hue.number); + mycss_values_color_parser_set_number_value(entry, token, &color->value.hsla.hue.value.number); color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { @@ -573,7 +573,7 @@ bool mycss_values_color_parser_hsl_saturation(mycss_entry_t* entry, mycss_token_ } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_percentage_value(entry, token, &color->hsla.saturation); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.hsla.saturation); entry->parser = mycss_values_color_parser_hsl_before_lightness; return true; @@ -617,7 +617,7 @@ bool mycss_values_color_parser_hsl_lightness(mycss_entry_t* entry, mycss_token_t } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_percentage_value(entry, token, &color->hsla.lightness); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.hsla.lightness); entry->parser = mycss_values_color_parser_hsl_before_alpha; return true; @@ -665,12 +665,12 @@ bool mycss_values_color_parser_hsl_alpha(mycss_entry_t* entry, mycss_token_t* to mycss_values_color_t *color = declr_entry->value; if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) { - mycss_values_color_parser_set_percentage_value(entry, token, &color->hsla.alpha.percentage); - color->hsla.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.hsla.alpha.value.percentage); + color->value.hsla.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->hsla.alpha.number); - color->hsla.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + mycss_values_color_parser_set_number_value(entry, token, &color->value.hsla.alpha.value.number); + color->value.hsla.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { mycss_values_color_parser_switch_parser(entry); @@ -686,10 +686,10 @@ bool mycss_values_color_parser_hsl_alpha(mycss_entry_t* entry, mycss_token_t* to */ static unsigned int mycss_values_color_parser_hex_get_by_two(unsigned char* u_data) { - return (myhtml_string_chars_hex_map[ u_data[0] ] << 4) | myhtml_string_chars_hex_map[ u_data[1] ]; + return (mycore_string_chars_hex_map[ u_data[0] ] << 4) | mycore_string_chars_hex_map[ u_data[1] ]; } -bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str) +bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str) { if(token->type != MyCSS_TOKEN_TYPE_HASH) return true; @@ -702,50 +702,50 @@ bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, v switch (str->length) { case 6: - color->hex.r.i = (int)mycss_values_color_parser_hex_get_by_two(u_data); - color->hex.g.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[2]); - color->hex.b.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[4]); - color->hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_UNDEF; + color->value.hex.r.value.i = (int)mycss_values_color_parser_hex_get_by_two(u_data); + color->value.hex.g.value.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[2]); + color->value.hex.b.value.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[4]); + color->value.hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_UNDEF; color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_6; break; case 8: - color->hex.r.i = (int)mycss_values_color_parser_hex_get_by_two(u_data); - color->hex.g.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[2]); - color->hex.b.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[4]); + color->value.hex.r.value.i = (int)mycss_values_color_parser_hex_get_by_two(u_data); + color->value.hex.g.value.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[2]); + color->value.hex.b.value.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[4]); - color->hex.alpha.number.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[6]); - color->hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + color->value.hex.alpha.value.number.value.i = (int)mycss_values_color_parser_hex_get_by_two(&u_data[6]); + color->value.hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_8; break; case 3: - color->hex.r.i = (int)(myhtml_string_chars_hex_map[ u_data[0] ]); - color->hex.r.i = (color->hex.r.i << 4) | color->hex.r.i; + color->value.hex.r.value.i = (int)(mycore_string_chars_hex_map[ u_data[0] ]); + color->value.hex.r.value.i = (color->value.hex.r.value.i << 4) | color->value.hex.r.value.i; - color->hex.g.i = (int)(myhtml_string_chars_hex_map[ u_data[1] ]); - color->hex.g.i = (color->hex.g.i << 4) | color->hex.g.i; + color->value.hex.g.value.i = (int)(mycore_string_chars_hex_map[ u_data[1] ]); + color->value.hex.g.value.i = (color->value.hex.g.value.i << 4) | color->value.hex.g.value.i; - color->hex.b.i = (int)(myhtml_string_chars_hex_map[ u_data[2] ]); - color->hex.b.i = (color->hex.b.i << 4) | color->hex.b.i; + color->value.hex.b.value.i = (int)(mycore_string_chars_hex_map[ u_data[2] ]); + color->value.hex.b.value.i = (color->value.hex.b.value.i << 4) | color->value.hex.b.value.i; - color->hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_UNDEF; + color->value.hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_UNDEF; color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_3; break; case 4: - color->hex.r.i = (int)(myhtml_string_chars_hex_map[ u_data[0] ]); - color->hex.r.i = (color->hex.r.i << 4) | color->hex.r.i; + color->value.hex.r.value.i = (int)(mycore_string_chars_hex_map[ u_data[0] ]); + color->value.hex.r.value.i = (color->value.hex.r.value.i << 4) | color->value.hex.r.value.i; - color->hex.g.i = (int)(myhtml_string_chars_hex_map[ u_data[1] ]); - color->hex.g.i = (color->hex.g.i << 4) | color->hex.g.i; + color->value.hex.g.value.i = (int)(mycore_string_chars_hex_map[ u_data[1] ]); + color->value.hex.g.value.i = (color->value.hex.g.value.i << 4) | color->value.hex.g.value.i; - color->hex.b.i = (int)(myhtml_string_chars_hex_map[ u_data[2] ]); - color->hex.b.i = (color->hex.b.i << 4) | color->hex.b.i; + color->value.hex.b.value.i = (int)(mycore_string_chars_hex_map[ u_data[2] ]); + color->value.hex.b.value.i = (color->value.hex.b.value.i << 4) | color->value.hex.b.value.i; - color->hex.alpha.number.i = (int)(myhtml_string_chars_hex_map[ u_data[3] ]); - color->hex.alpha.number.i = (color->hex.alpha.number.i << 4) | color->hex.alpha.number.i; - color->hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + color->value.hex.alpha.value.number.value.i = (int)(mycore_string_chars_hex_map[ u_data[3] ]); + color->value.hex.alpha.value.number.value.i = (color->value.hex.alpha.value.number.value.i << 4) | color->value.hex.alpha.value.number.value.i; + color->value.hex.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_4; break; @@ -771,7 +771,7 @@ bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, v static bool mycss_values_color_parser_hwb_hue(mycss_entry_t* entry, mycss_token_t* token, mycss_values_color_t *color) { if(token->type == MyCSS_TOKEN_TYPE_DIMENSION) { - if(mycss_values_color_parser_set_angle_value(entry, token, &color->hwb.hue.angle) == false) { + if(mycss_values_color_parser_set_angle_value(entry, token, &color->value.hwb.hue.value.angle) == false) { mycss_values_color_parser_switch_parser(entry); return false; } @@ -780,7 +780,7 @@ static bool mycss_values_color_parser_hwb_hue(mycss_entry_t* entry, mycss_token_ } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->hwb.hue.number); + mycss_values_color_parser_set_number_value(entry, token, &color->value.hwb.hue.value.number); color->type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { @@ -845,7 +845,7 @@ bool mycss_values_color_parser_hwb_whiteness(mycss_entry_t* entry, mycss_token_t } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_percentage_value(entry, token, &color->hwb.saturation); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.hwb.saturation); entry->parser = mycss_values_color_parser_hwb_before_blackness; return true; @@ -889,7 +889,7 @@ bool mycss_values_color_parser_hwb_blackness(mycss_entry_t* entry, mycss_token_t } mycss_values_color_t *color = declr_entry->value; - mycss_values_color_parser_set_percentage_value(entry, token, &color->hwb.lightness); + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.hwb.lightness); entry->parser = mycss_values_color_parser_hwb_before_alpha; return true; @@ -937,12 +937,12 @@ bool mycss_values_color_parser_hwb_alpha(mycss_entry_t* entry, mycss_token_t* to mycss_values_color_t *color = declr_entry->value; if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) { - mycss_values_color_parser_set_percentage_value(entry, token, &color->hwb.alpha.percentage); - color->hwb.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.hwb.alpha.value.percentage); + color->value.hwb.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->hwb.alpha.number); - color->hwb.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + mycss_values_color_parser_set_number_value(entry, token, &color->value.hwb.alpha.value.number); + color->value.hwb.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { mycss_values_color_parser_switch_parser(entry); @@ -972,7 +972,7 @@ bool mycss_values_color_parser_gray(mycss_entry_t* entry, mycss_token_t* token, if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->gray.number); + mycss_values_color_parser_set_number_value(entry, token, &color->value.gray.number); color->type = MyCSS_VALUES_COLOR_TYPE_GRAY; entry->parser = mycss_values_color_parser_gray_before_alpha; @@ -1027,12 +1027,12 @@ bool mycss_values_color_parser_gray_alpha(mycss_entry_t* entry, mycss_token_t* t mycss_values_color_t *color = declr_entry->value; if(token->type == MyCSS_TOKEN_TYPE_PERCENTAGE) { - mycss_values_color_parser_set_percentage_value(entry, token, &color->gray.alpha.percentage); - color->gray.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; + mycss_values_color_parser_set_percentage_value(entry, token, &color->value.gray.alpha.value.percentage); + color->value.gray.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE; } else if(token->type == MyCSS_TOKEN_TYPE_NUMBER) { - mycss_values_color_parser_set_number_value(entry, token, &color->gray.alpha.number); - color->gray.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; + mycss_values_color_parser_set_number_value(entry, token, &color->value.gray.alpha.value.number); + color->value.gray.alpha.type_value = MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER; } else { mycss_values_color_parser_switch_parser(entry); diff --git a/source/mycss/values/color_parser.h b/source/mycss/values/color_parser.h index 20f5525..8f175a0 100644 --- a/source/mycss/values/color_parser.h +++ b/source/mycss/values/color_parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -55,7 +55,7 @@ bool mycss_values_color_parser_hsl_lightness(mycss_entry_t* entry, mycss_token_t bool mycss_values_color_parser_hsl_before_alpha(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_values_color_parser_hsl_alpha(mycss_entry_t* entry, mycss_token_t* token, bool last_response); -bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, myhtml_string_t* str); +bool mycss_values_color_parser_hex(mycss_entry_t* entry, mycss_token_t* token, void** value, unsigned int* value_type, mycore_string_t* str); bool mycss_values_color_parser_hwb(mycss_entry_t* entry, mycss_token_t* token, bool last_response); bool mycss_values_color_parser_hwb_before_whiteness(mycss_entry_t* entry, mycss_token_t* token, bool last_response); diff --git a/source/mycss/values/color_resources.h b/source/mycss/values/color_resources.h index b06cba3..108a410 100644 --- a/source/mycss/values/color_resources.h +++ b/source/mycss/values/color_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/consume.c b/source/mycss/values/consume.c index aed5979..69215ae 100644 --- a/source/mycss/values/consume.c +++ b/source/mycss/values/consume.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ bool mycss_values_consume_length(mycss_entry_t* entry, mycss_token_t* token) { mycss_values_length_t *value = mycss_values_create(entry, sizeof(mycss_values_length_t)); - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); double return_num; @@ -34,7 +34,7 @@ bool mycss_values_consume_length(mycss_entry_t* entry, mycss_token_t* token) if(token->type == MyCSS_TOKEN_TYPE_DIMENSION) { value->type = mycss_units_type_by_name(&str.data[consume_length], (str.length - consume_length)); - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); if(value->type == MyCSS_UNIT_TYPE_UNDEF) { mycss_values_destroy(entry, value); @@ -43,13 +43,13 @@ bool mycss_values_consume_length(mycss_entry_t* entry, mycss_token_t* token) } else { value->type = MyCSS_UNIT_TYPE_UNDEF; - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); } if(value->is_float) - value->f = (float)return_num; + value->value.f = (float)return_num; else - value->i = (int)return_num; + value->value.i = (int)return_num; *entry->values = value; } @@ -65,18 +65,18 @@ bool mycss_values_consume_percentage(mycss_entry_t* entry, mycss_token_t* token) { mycss_values_percentage_t *value = mycss_values_create(entry, sizeof(mycss_values_length_t)); - myhtml_string_t str; + mycore_string_t str; mycss_token_data_to_string(entry, token, &str, true, false); double return_num; mycss_convert_data_to_double(str.data, str.length, &return_num, &value->is_float); - myhtml_string_destroy(&str, false); + mycore_string_destroy(&str, false); if(value->is_float) - value->f = (float)return_num; + value->value.f = (float)return_num; else - value->i = (int)return_num; + value->value.i = (int)return_num; *entry->values = value; diff --git a/source/mycss/values/consume.h b/source/mycss/values/consume.h index 1a8441e..da4508a 100644 --- a/source/mycss/values/consume.h +++ b/source/mycss/values/consume.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/destroy.c b/source/mycss/values/destroy.c index 7a8fde2..ebf0268 100644 --- a/source/mycss/values/destroy.c +++ b/source/mycss/values/destroy.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -333,12 +333,12 @@ mycss_values_text_decoration_t * mycss_values_destroy_text_decoration(mycss_entr /* * String */ -myhtml_string_t * mycss_values_destroy_string(mycss_entry_t* entry, myhtml_string_t* value, bool self_destroy) +mycore_string_t * mycss_values_destroy_string(mycss_entry_t* entry, mycore_string_t* value, bool self_destroy) { if(value == NULL) return NULL; - myhtml_string_destroy(value, false); + mycore_string_destroy(value, false); if(self_destroy) { mycss_values_destroy(entry, (void*)value); @@ -377,23 +377,23 @@ mycss_values_image_t * mycss_values_destroy_image(mycss_entry_t* entry, mycss_va switch (image->type) { case MyCSS_PROPERTY_VALUE__URL: - image->url = mycss_values_destroy_url(entry, image->url, true); + image->value.url = mycss_values_destroy_url(entry, image->value.url, true); break; case MyCSS_PROPERTY_VALUE__IMAGE_FUNCTION: - image->ii = mycss_values_destroy_image_image(entry, image->ii, true); + image->value.ii = mycss_values_destroy_image_image(entry, image->value.ii, true); break; case MyCSS_PROPERTY_VALUE__IMAGE_SET_FUNCTION: - image->ii_set = mycss_values_destroy_image_image_set(entry, image->ii_set, true); + image->value.ii_set = mycss_values_destroy_image_image_set(entry, image->value.ii_set, true); break; case MyCSS_PROPERTY_VALUE__ELEMENT_FUNCTION: - image->element = mycss_values_destroy_element(entry, image->element, true); + image->value.element = mycss_values_destroy_element(entry, image->value.element, true); break; case MyCSS_PROPERTY_VALUE__CROSS_FADE_FUNCTION: - image->cross_fade = mycss_values_destroy_cross_fade(entry, image->cross_fade, true); + image->value.cross_fade = mycss_values_destroy_cross_fade(entry, image->value.cross_fade, true); break; default: @@ -543,20 +543,20 @@ mycss_values_background_position_t * mycss_values_destroy_background_position(my if(value == NULL) return NULL; - if(value->one.length) { - mycss_values_destroy(entry, (void*)value->one.length); + if(value->one.value.length) { + mycss_values_destroy(entry, (void*)value->one.value.length); } - if(value->two.length) { - mycss_values_destroy(entry, (void*)value->two.length); + if(value->two.value.length) { + mycss_values_destroy(entry, (void*)value->two.value.length); } - if(value->three.length) { - mycss_values_destroy(entry, (void*)value->three.length); + if(value->three.value.length) { + mycss_values_destroy(entry, (void*)value->three.value.length); } - if(value->four.length) { - mycss_values_destroy(entry, (void*)value->four.length); + if(value->four.value.length) { + mycss_values_destroy(entry, (void*)value->four.value.length); } if(self_destroy) { @@ -574,15 +574,15 @@ mycss_values_background_size_list_t * mycss_values_destroy_background_size(mycss for(size_t i = 0; i < value->entries_length; i++) { if(value->entries[i].width) { - if(value->entries[i].width->percentage) - mycss_values_destroy(entry, (void*)value->entries[i].width->percentage); + if(value->entries[i].width->value.percentage) + mycss_values_destroy(entry, (void*)value->entries[i].width->value.percentage); mycss_values_destroy(entry, (void*)value->entries[i].width); } if(value->entries[i].height) { - if(value->entries[i].height->percentage) - mycss_values_destroy(entry, (void*)value->entries[i].height->percentage); + if(value->entries[i].height->value.percentage) + mycss_values_destroy(entry, (void*)value->entries[i].height->value.percentage); mycss_values_destroy(entry, (void*)value->entries[i].height); } diff --git a/source/mycss/values/destroy.h b/source/mycss/values/destroy.h index 7f5e2b1..67d6a32 100644 --- a/source/mycss/values/destroy.h +++ b/source/mycss/values/destroy.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/image.c b/source/mycss/values/image.c index 74f860d..066e14c 100644 --- a/source/mycss/values/image.c +++ b/source/mycss/values/image.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,19 +20,19 @@ #include "mycss/values/image.h" #include "mycss/values/image_resources.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" const mycss_values_image_function_index_static_entry_t * mycss_values_image_index_entry_by_name(const char* name, size_t length) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_IMAGE_FUNCTION_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; while (mycss_values_image_function_index_static_for_search[idx].name) { if(mycss_values_image_function_index_static_for_search[idx].name_length == length) { - if(myhtml_strncasecmp(mycss_values_image_function_index_static_for_search[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_values_image_function_index_static_for_search[idx].name, name, length) == 0) return &mycss_values_image_function_index_static_for_search[idx]; if(mycss_values_image_function_index_static_for_search[idx].next) @@ -63,32 +63,32 @@ mycss_property_value_t mycss_values_image_id_by_name(const char *name, size_t le void * mycss_values_image_creator_url(mycss_entry_t* entry, mycss_values_image_t* image) { - image->url = mycss_values_create(entry, sizeof(mycss_values_url_t)); - return image->url; + image->value.url = mycss_values_create(entry, sizeof(mycss_values_url_t)); + return image->value.url; } void * mycss_values_image_creator_function_image(mycss_entry_t* entry, mycss_values_image_t* image) { - image->ii = mycss_values_create(entry, sizeof(mycss_values_image_image_t)); - return image->ii; + image->value.ii = mycss_values_create(entry, sizeof(mycss_values_image_image_t)); + return image->value.ii; } void * mycss_values_image_creator_image_set(mycss_entry_t* entry, mycss_values_image_t* image) { - image->ii_set = mycss_values_create(entry, sizeof(mycss_values_image_image_set_t)); - return image->ii_set; + image->value.ii_set = mycss_values_create(entry, sizeof(mycss_values_image_image_set_t)); + return image->value.ii_set; } void * mycss_values_image_creator_element(mycss_entry_t* entry, mycss_values_image_t* image) { - image->element = mycss_values_create(entry, sizeof(mycss_values_element_t)); - return image->element; + image->value.element = mycss_values_create(entry, sizeof(mycss_values_element_t)); + return image->value.element; } void * mycss_values_image_creator_cross_fade(mycss_entry_t* entry, mycss_values_image_t* image) { - image->cross_fade = mycss_values_create(entry, sizeof(mycss_values_cross_fade_t)); - return image->cross_fade; + image->value.cross_fade = mycss_values_create(entry, sizeof(mycss_values_cross_fade_t)); + return image->value.cross_fade; } diff --git a/source/mycss/values/image.h b/source/mycss/values/image.h index 888f926..a35fe32 100644 --- a/source/mycss/values/image.h +++ b/source/mycss/values/image.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/image_resources.h b/source/mycss/values/image_resources.h index a612ec7..02863c9 100644 --- a/source/mycss/values/image_resources.h +++ b/source/mycss/values/image_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/resources.h b/source/mycss/values/resources.h index 1c7efd4..faf67a5 100644 --- a/source/mycss/values/resources.h +++ b/source/mycss/values/resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/serialization.c b/source/mycss/values/serialization.c index f46b2e4..be4e202 100644 --- a/source/mycss/values/serialization.c +++ b/source/mycss/values/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -21,20 +21,20 @@ #include "mycss/values/serialization.h" #include "mycss/values/units_resources.h" #include "mycss/property/resources_name.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" -static void mycss_values_serialization_to_callback(const char* data, size_t len, mycss_callback_serialization_f callback, void* context) +static void mycss_values_serialization_to_callback(const char* data, size_t len, mycore_callback_serialize_f callback, void* context) { if(len > 0) callback(data, len, context); } -void mycss_values_serialization_string(myhtml_string_t* str, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_string(mycore_string_t* str, mycore_callback_serialize_f callback, void* context) { callback(str->data, str->length, context); } -void mycss_values_serialization_number(mycss_values_number_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_number(mycss_values_number_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; @@ -42,16 +42,16 @@ void mycss_values_serialization_number(mycss_values_number_t* value, mycss_callb char buff[512]; if(value->is_float) { - int len = snprintf(buff, 512, "%0.4f", value->f); + int len = snprintf(buff, 512, "%0.4f", value->value.f); mycss_values_serialization_to_callback(buff, len, callback, context); } else { - int len = snprintf(buff, 512, "%d", value->i); + int len = snprintf(buff, 512, "%d", value->value.i); mycss_values_serialization_to_callback(buff, len, callback, context); } } -void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_length(mycss_values_length_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; @@ -59,11 +59,11 @@ void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callb char buff[512]; if(value->is_float) { - int len = snprintf(buff, 512, "%0.4f", value->f); + int len = snprintf(buff, 512, "%0.4f", value->value.f); mycss_values_serialization_to_callback(buff, len, callback, context); } else { - int len = snprintf(buff, 512, "%d", value->i); + int len = snprintf(buff, 512, "%d", value->value.i); mycss_values_serialization_to_callback(buff, len, callback, context); } @@ -73,7 +73,7 @@ void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callb } } -void mycss_values_serialization_angle(mycss_values_angle_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_angle(mycss_values_angle_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; @@ -81,11 +81,11 @@ void mycss_values_serialization_angle(mycss_values_angle_t* value, mycss_callbac char buff[512]; if(value->is_float) { - int len = snprintf(buff, 512, "%0.4f", value->f); + int len = snprintf(buff, 512, "%0.4f", value->value.f); mycss_values_serialization_to_callback(buff, len, callback, context); } else { - int len = snprintf(buff, 512, "%d", value->i); + int len = snprintf(buff, 512, "%d", value->value.i); mycss_values_serialization_to_callback(buff, len, callback, context); } @@ -95,7 +95,7 @@ void mycss_values_serialization_angle(mycss_values_angle_t* value, mycss_callbac } } -void mycss_values_serialization_resolution(mycss_values_resolution_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_resolution(mycss_values_resolution_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; @@ -103,11 +103,11 @@ void mycss_values_serialization_resolution(mycss_values_resolution_t* value, myc char buff[512]; if(value->is_float) { - int len = snprintf(buff, 512, "%0.4f", value->f); + int len = snprintf(buff, 512, "%0.4f", value->value.f); mycss_values_serialization_to_callback(buff, len, callback, context); } else { - int len = snprintf(buff, 512, "%d", value->i); + int len = snprintf(buff, 512, "%d", value->value.i); mycss_values_serialization_to_callback(buff, len, callback, context); } @@ -117,7 +117,7 @@ void mycss_values_serialization_resolution(mycss_values_resolution_t* value, myc } } -void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; @@ -125,24 +125,24 @@ void mycss_values_serialization_percentage(mycss_values_percentage_t* value, myc char buff[512]; if(value->is_float) { - int len = snprintf(buff, 512, "%0.4f%%", value->f); + int len = snprintf(buff, 512, "%0.4f%%", value->value.f); mycss_values_serialization_to_callback(buff, len, callback, context); } else { - int len = snprintf(buff, 512, "%d%%", value->i); + int len = snprintf(buff, 512, "%d%%", value->value.i); mycss_values_serialization_to_callback(buff, len, callback, context); } } -void mycss_values_serialization_type_length_percentage(mycss_values_type_length_percentage_entry_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_type_length_percentage(mycss_values_type_length_percentage_entry_t* value, mycore_callback_serialize_f callback, void* context) { switch (value->type) { case MyCSS_PROPERTY_VALUE__LENGTH: - mycss_values_serialization_length(value->length, callback, context); + mycss_values_serialization_length(value->value.length, callback, context); break; case MyCSS_PROPERTY_VALUE__PERCENTAGE: - mycss_values_serialization_percentage(value->percentage, callback, context); + mycss_values_serialization_percentage(value->value.percentage, callback, context); break; default: { @@ -156,16 +156,16 @@ void mycss_values_serialization_type_length_percentage(mycss_values_type_length_ static void mycss_values_serialization_color_hex_one_value(int value, unsigned char* data) { - data[0] = myhtml_string_hex_to_char_map[ (unsigned int)(value >> 4) ]; + data[0] = mycore_string_hex_to_char_map[ (unsigned int)(value >> 4) ]; } static void mycss_values_serialization_color_hex_two_value(int value, unsigned char* data) { - data[0] = myhtml_string_hex_to_char_map[ (unsigned int)(value >> 4) ]; - data[1] = myhtml_string_hex_to_char_map[ (unsigned int)((value) ^ ((value >> 4) << 4)) ]; + data[0] = mycore_string_hex_to_char_map[ (unsigned int)(value >> 4) ]; + data[1] = mycore_string_hex_to_char_map[ (unsigned int)((value) ^ ((value >> 4) << 4)) ]; } -void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_color(mycss_values_color_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; @@ -173,7 +173,7 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac switch (value->type) { case MyCSS_VALUES_COLOR_TYPE_NAMED: { size_t length; - const char *name = mycss_values_color_name_by_id(value->name_id, &length); + const char *name = mycss_values_color_name_by_id(value->value.name_id, &length); mycss_values_serialization_to_callback(name, length, callback, context); break; @@ -189,25 +189,25 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE) { - mycss_values_serialization_percentage(&value->rgba_percentage.r, callback, context); + mycss_values_serialization_percentage(&value->value.rgba_percentage.r, callback, context); callback(", ", 2, context); - mycss_values_serialization_percentage(&value->rgba_percentage.g, callback, context); + mycss_values_serialization_percentage(&value->value.rgba_percentage.g, callback, context); callback(", ", 2, context); - mycss_values_serialization_percentage(&value->rgba_percentage.b, callback, context); - mycss_values_serialization_color_alpha(&value->rgba_percentage.alpha, callback, context); + mycss_values_serialization_percentage(&value->value.rgba_percentage.b, callback, context); + mycss_values_serialization_color_alpha(&value->value.rgba_percentage.alpha, callback, context); } else if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER) { - mycss_values_serialization_number(&value->rgba_number.r, callback, context); + mycss_values_serialization_number(&value->value.rgba_number.r, callback, context); callback(", ", 2, context); - mycss_values_serialization_number(&value->rgba_number.g, callback, context); + mycss_values_serialization_number(&value->value.rgba_number.g, callback, context); callback(", ", 2, context); - mycss_values_serialization_number(&value->rgba_number.b, callback, context); - mycss_values_serialization_color_alpha(&value->rgba_number.alpha, callback, context); + mycss_values_serialization_number(&value->value.rgba_number.b, callback, context); + mycss_values_serialization_color_alpha(&value->value.rgba_number.alpha, callback, context); } callback(")", 1, context); @@ -223,19 +223,19 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac else callback("hsla(", 5, context); - if(value->hsla.hue.type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER) { - mycss_values_serialization_number(&value->hsla.hue.number, callback, context); + if(value->value.hsla.hue.type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER) { + mycss_values_serialization_number(&value->value.hsla.hue.value.number, callback, context); } else { - mycss_values_serialization_angle(&value->hsla.hue.angle, callback, context); + mycss_values_serialization_angle(&value->value.hsla.hue.value.angle, callback, context); } callback(", ", 2, context); - mycss_values_serialization_percentage(&value->hsla.saturation, callback, context); + mycss_values_serialization_percentage(&value->value.hsla.saturation, callback, context); callback(", ", 2, context); - mycss_values_serialization_percentage(&value->hsla.lightness, callback, context); - mycss_values_serialization_color_alpha(&value->hsla.alpha, callback, context); + mycss_values_serialization_percentage(&value->value.hsla.lightness, callback, context); + mycss_values_serialization_color_alpha(&value->value.hsla.alpha, callback, context); callback(")", 1, context); @@ -246,19 +246,19 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac { callback("hwb(", 4, context); - if(value->hwb.hue.type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER) { - mycss_values_serialization_number(&value->hwb.hue.number, callback, context); + if(value->value.hwb.hue.type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER) { + mycss_values_serialization_number(&value->value.hwb.hue.value.number, callback, context); } else { - mycss_values_serialization_angle(&value->hwb.hue.angle, callback, context); + mycss_values_serialization_angle(&value->value.hwb.hue.value.angle, callback, context); } callback(", ", 2, context); - mycss_values_serialization_percentage(&value->hwb.saturation, callback, context); + mycss_values_serialization_percentage(&value->value.hwb.saturation, callback, context); callback(", ", 2, context); - mycss_values_serialization_percentage(&value->hwb.lightness, callback, context); - mycss_values_serialization_color_alpha(&value->hwb.alpha, callback, context); + mycss_values_serialization_percentage(&value->value.hwb.lightness, callback, context); + mycss_values_serialization_color_alpha(&value->value.hwb.alpha, callback, context); callback(")", 1, context); @@ -269,8 +269,8 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac { callback("gray(", 5, context); - mycss_values_serialization_number(&value->gray.number, callback, context); - mycss_values_serialization_color_alpha(&value->gray.alpha, callback, context); + mycss_values_serialization_number(&value->value.gray.number, callback, context); + mycss_values_serialization_color_alpha(&value->value.gray.alpha, callback, context); callback(")", 1, context); @@ -284,10 +284,10 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_8) { unsigned char data[9]; - mycss_values_serialization_color_hex_two_value(value->hex.r.i, data); - mycss_values_serialization_color_hex_two_value(value->hex.g.i, &data[2]); - mycss_values_serialization_color_hex_two_value(value->hex.b.i, &data[4]); - mycss_values_serialization_color_hex_two_value(value->hex.alpha.number.i, &data[6]); + mycss_values_serialization_color_hex_two_value(value->value.hex.r.value.i, data); + mycss_values_serialization_color_hex_two_value(value->value.hex.g.value.i, &data[2]); + mycss_values_serialization_color_hex_two_value(value->value.hex.b.value.i, &data[4]); + mycss_values_serialization_color_hex_two_value(value->value.hex.alpha.value.number.value.i, &data[6]); data[8] = '\0'; callback((const char*)data, 8, context); @@ -295,9 +295,9 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac else if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_6) { unsigned char data[7]; - mycss_values_serialization_color_hex_two_value(value->hex.r.i, data); - mycss_values_serialization_color_hex_two_value(value->hex.g.i, &data[2]); - mycss_values_serialization_color_hex_two_value(value->hex.b.i, &data[4]); + mycss_values_serialization_color_hex_two_value(value->value.hex.r.value.i, data); + mycss_values_serialization_color_hex_two_value(value->value.hex.g.value.i, &data[2]); + mycss_values_serialization_color_hex_two_value(value->value.hex.b.value.i, &data[4]); data[6] = '\0'; callback((const char*)data, 6, context); @@ -305,10 +305,10 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac else if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_4) { unsigned char data[5]; - mycss_values_serialization_color_hex_one_value(value->hex.r.i, data); - mycss_values_serialization_color_hex_one_value(value->hex.g.i, &data[1]); - mycss_values_serialization_color_hex_one_value(value->hex.b.i, &data[2]); - mycss_values_serialization_color_hex_one_value(value->hex.alpha.number.i, &data[3]); + mycss_values_serialization_color_hex_one_value(value->value.hex.r.value.i, data); + mycss_values_serialization_color_hex_one_value(value->value.hex.g.value.i, &data[1]); + mycss_values_serialization_color_hex_one_value(value->value.hex.b.value.i, &data[2]); + mycss_values_serialization_color_hex_one_value(value->value.hex.alpha.value.number.value.i, &data[3]); data[4] = '\0'; callback((const char*)data, 4, context); @@ -316,9 +316,9 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac else if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_HEX_3) { unsigned char data[4]; - mycss_values_serialization_color_hex_one_value(value->hex.r.i, data); - mycss_values_serialization_color_hex_one_value(value->hex.g.i, &data[1]); - mycss_values_serialization_color_hex_one_value(value->hex.b.i, &data[2]); + mycss_values_serialization_color_hex_one_value(value->value.hex.r.value.i, data); + mycss_values_serialization_color_hex_one_value(value->value.hex.g.value.i, &data[1]); + mycss_values_serialization_color_hex_one_value(value->value.hex.b.value.i, &data[2]); data[3] = '\0'; callback((const char*)data, 3, context); @@ -332,22 +332,22 @@ void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callbac } } -void mycss_values_serialization_color_alpha(mycss_values_color_alpha_value_t* value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_color_alpha(mycss_values_color_alpha_value_t* value, mycore_callback_serialize_f callback, void* context) { if(value == NULL) return; if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_PERCENTAGE) { callback(", ", 2, context); - mycss_values_serialization_percentage(&value->percentage, callback, context); + mycss_values_serialization_percentage(&value->value.percentage, callback, context); } else if(value->type_value == MyCSS_VALUES_COLOR_TYPE_VALUE_NUMBER) { callback(", ", 2, context); - mycss_values_serialization_number(&value->number, callback, context); + mycss_values_serialization_number(&value->value.number, callback, context); } } -void mycss_values_serialization_text_decoration_line(mycss_values_text_decoration_line_t value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_text_decoration_line(mycss_values_text_decoration_line_t value, mycore_callback_serialize_f callback, void* context) { const char *text_value = NULL; @@ -381,7 +381,7 @@ void mycss_values_serialization_text_decoration_line(mycss_values_text_decoratio } } -void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoration_skip_t value, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoration_skip_t value, mycore_callback_serialize_f callback, void* context) { const char *text_value = NULL; @@ -423,18 +423,18 @@ void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoratio } } -void mycss_values_serialization_url(mycss_values_url_t* url, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_url(mycss_values_url_t* url, mycore_callback_serialize_f callback, void* context) { callback("url(", 4, context); callback(url->str.data, url->str.length, context); callback(")", 1, context); } -void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_image(mycss_values_image_t* image, mycore_callback_serialize_f callback, void* context) { switch (image->type) { case MyCSS_PROPERTY_VALUE__URL: - mycss_values_serialization_url(image->url, callback, context); + mycss_values_serialization_url(image->value.url, callback, context); break; case MyCSS_PROPERTY_VALUE__IMAGE_FUNCTION: { @@ -442,23 +442,23 @@ void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callbac bool o_e = false; - if(image->ii->image) { + if(image->value.ii->image) { o_e = true; - mycss_values_serialization_image(image->ii->image, callback, context); + mycss_values_serialization_image(image->value.ii->image, callback, context); } - else if(image->ii->str) { + else if(image->value.ii->str) { o_e = true; callback("\"", 1, context); - mycss_values_serialization_string(image->ii->str, callback, context); + mycss_values_serialization_string(image->value.ii->str, callback, context); callback("\"", 1, context); } - if(image->ii->color) { + if(image->value.ii->color) { if(o_e) callback(", ", 2, context); - mycss_values_serialization_color(image->ii->color, callback, context); + mycss_values_serialization_color(image->value.ii->color, callback, context); } callback(")", 1, context); @@ -470,9 +470,9 @@ void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callbac bool o_e = false; - for(size_t i = 0; i < image->ii_set->options_length; i++) + for(size_t i = 0; i < image->value.ii_set->options_length; i++) { - mycss_values_image_image_set_option_t* option = &image->ii_set->options[i]; + mycss_values_image_image_set_option_t* option = &image->value.ii_set->options[i]; if(option->image) { o_e = true; @@ -501,12 +501,12 @@ void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callbac case MyCSS_PROPERTY_VALUE__ELEMENT_FUNCTION: { callback("string(", 7, context); - mycss_values_serialization_string(&image->element->custom_ident.str, callback, context); + mycss_values_serialization_string(&image->value.element->custom_ident.str, callback, context); - if(image->element->type) { + if(image->value.element->type) { callback(", ", 2, context); - const char* text_value = mycss_property_index_type_value[image->element->type]; + const char* text_value = mycss_property_index_type_value[image->value.element->type]; callback(text_value, strlen(text_value), context); } @@ -517,26 +517,26 @@ void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callbac case MyCSS_PROPERTY_VALUE__CROSS_FADE_FUNCTION: { callback("cross-fade(", 11, context); - if(image->cross_fade->mixing_image.percentage) { - mycss_values_serialization_percentage(image->cross_fade->mixing_image.percentage, callback, context); + if(image->value.cross_fade->mixing_image.percentage) { + mycss_values_serialization_percentage(image->value.cross_fade->mixing_image.percentage, callback, context); } - if(image->cross_fade->mixing_image.image) { - if(image->cross_fade->mixing_image.percentage) + if(image->value.cross_fade->mixing_image.image) { + if(image->value.cross_fade->mixing_image.percentage) callback(" ", 1, context); - mycss_values_serialization_image(image->cross_fade->mixing_image.image, callback, context); + mycss_values_serialization_image(image->value.cross_fade->mixing_image.image, callback, context); } - mycss_values_serialization_string(&image->element->custom_ident.str, callback, context); + mycss_values_serialization_string(&image->value.element->custom_ident.str, callback, context); - if(image->cross_fade->final_image.image) { + if(image->value.cross_fade->final_image.image) { callback(", ", 2, context); - mycss_values_serialization_image(image->cross_fade->final_image.image, callback, context); + mycss_values_serialization_image(image->value.cross_fade->final_image.image, callback, context); } - else if(image->cross_fade->final_image.color) { + else if(image->value.cross_fade->final_image.color) { callback(", ", 2, context); - mycss_values_serialization_color(image->cross_fade->final_image.color, callback, context); + mycss_values_serialization_color(image->value.cross_fade->final_image.color, callback, context); } callback(")", 1, context); @@ -552,7 +552,7 @@ void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callbac } } -void mycss_values_serialization_background_size_entry(mycss_values_background_size_entry_t* bg_size_entry, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_background_size_entry(mycss_values_background_size_entry_t* bg_size_entry, mycore_callback_serialize_f callback, void* context) { if(bg_size_entry->scale) { const char* text_value = mycss_property_index_type_value[bg_size_entry->scale]; @@ -571,7 +571,7 @@ void mycss_values_serialization_background_size_entry(mycss_values_background_si } } -void mycss_values_serialization_border(mycss_values_border_t* border, mycss_callback_serialization_f callback, void* context) +void mycss_values_serialization_border(mycss_values_border_t* border, mycore_callback_serialize_f callback, void* context) { bool o_e = false; diff --git a/source/mycss/values/serialization.h b/source/mycss/values/serialization.h index 45b4887..3c9c71b 100644 --- a/source/mycss/values/serialization.h +++ b/source/mycss/values/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,21 +30,21 @@ extern "C" { #include "mycss/values/color.h" #include "mycss/property/const.h" -void mycss_values_serialization_string(myhtml_string_t* str, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_number(mycss_values_number_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_angle(mycss_values_angle_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_resolution(mycss_values_resolution_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_type_length_percentage(mycss_values_type_length_percentage_entry_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_color(mycss_values_color_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_color_alpha(mycss_values_color_alpha_value_t* value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_text_decoration_line(mycss_values_text_decoration_line_t value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoration_skip_t value, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_url(mycss_values_url_t* url, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_image(mycss_values_image_t* image, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_background_size_entry(mycss_values_background_size_entry_t* bg_size_entry, mycss_callback_serialization_f callback, void* context); -void mycss_values_serialization_border(mycss_values_border_t* border, mycss_callback_serialization_f callback, void* context); +void mycss_values_serialization_string(mycore_string_t* str, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_number(mycss_values_number_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_length(mycss_values_length_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_angle(mycss_values_angle_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_resolution(mycss_values_resolution_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_type_length_percentage(mycss_values_type_length_percentage_entry_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_color(mycss_values_color_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_color_alpha(mycss_values_color_alpha_value_t* value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_text_decoration_line(mycss_values_text_decoration_line_t value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_text_decoration_skip(mycss_values_text_decoration_skip_t value, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_url(mycss_values_url_t* url, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_image(mycss_values_image_t* image, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_background_size_entry(mycss_values_background_size_entry_t* bg_size_entry, mycore_callback_serialize_f callback, void* context); +void mycss_values_serialization_border(mycss_values_border_t* border, mycore_callback_serialize_f callback, void* context); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/mycss/values/units.c b/source/mycss/values/units.c index 7f0533d..a84639e 100644 --- a/source/mycss/values/units.c +++ b/source/mycss/values/units.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,22 +20,22 @@ #include "mycss/values/units.h" #include "mycss/values/units_resources.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" const mycss_units_index_static_entry_t * mycss_units_index_entry_by_name(const char* name, size_t length) { if(length == 0) return NULL; - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyCSS_UNITS_STATIC_INDEX_FOR_SEARCH_SIZE) + 1; while (mycss_units_index_static_for_search[idx].name) { if(mycss_units_index_static_for_search[idx].name_length == length) { - if(myhtml_strncasecmp(mycss_units_index_static_for_search[idx].name, name, length) == 0) + if(mycore_strncasecmp(mycss_units_index_static_for_search[idx].name, name, length) == 0) return &mycss_units_index_static_for_search[idx]; if(mycss_units_index_static_for_search[idx].next) diff --git a/source/mycss/values/units.h b/source/mycss/values/units.h index 165f718..223c48f 100644 --- a/source/mycss/values/units.h +++ b/source/mycss/values/units.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ #pragma once #include "mycss/myosi.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #define mycss_units_is_angel_type(type) (type >= 1 && type <= 4) #define mycss_units_is_frequency_type(type) (type >= 5 && type <= 6) diff --git a/source/mycss/values/units_resources.h b/source/mycss/values/units_resources.h index 7d7c8e1..e602fac 100644 --- a/source/mycss/values/units_resources.h +++ b/source/mycss/values/units_resources.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/values.c b/source/mycss/values/values.c index 0ff0c1c..8f18f6e 100644 --- a/source/mycss/values/values.c +++ b/source/mycss/values/values.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/mycss/values/values.h b/source/mycss/values/values.h index 0d94df7..b1cc84f 100644 --- a/source/mycss/values/values.h +++ b/source/mycss/values/values.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -26,7 +26,7 @@ #include "mycss/values/units.h" #include "mycss/values/color_const.h" #include "mycss/property/const.h" -#include "myhtml/utils/mchar_async.h" +#include "mycore/utils/mchar_async.h" #include "myhtml/mystring.h" #include "mycss/declaration/myosi.h" @@ -115,12 +115,13 @@ struct mycss_values_type_list { size_t entries_length; }; -struct mycss_values_type_length_percentage_entry { - union { - mycss_values_percentage_t* percentage; - mycss_values_length_t* length; - }; +union mycss_values_type_length_percentage_union { + mycss_values_percentage_t* percentage; + mycss_values_length_t* length; +}; +struct mycss_values_type_length_percentage_entry { + union mycss_values_type_length_percentage_union value; unsigned int type; }; @@ -128,7 +129,7 @@ struct mycss_values_number { union { int i; float f; - }; + } value; bool is_float; }; @@ -137,9 +138,10 @@ struct mycss_values_length { union { int i; float f; - }; + } value; bool is_float; + mycss_units_type_t type; }; @@ -147,7 +149,7 @@ struct mycss_values_percentage { union { int i; float f; - }; + } value; bool is_float; }; @@ -156,7 +158,7 @@ struct mycss_values_angle { union { int i; float f; - }; + } value; bool is_float; mycss_units_type_t type; @@ -166,14 +168,14 @@ struct mycss_values_resolution { union { int i; float f; - }; + } value; bool is_float; mycss_units_type_t type; }; struct mycss_values_custom_ident { - myhtml_string_t str; + mycore_string_t str; }; /* @@ -211,7 +213,7 @@ struct mycss_values_color_alpha_value { union { mycss_values_number_t number; mycss_values_percentage_t percentage; - }; + } value; mycss_values_color_type_value_t type_value; }; @@ -220,7 +222,7 @@ struct mycss_values_color_hue_value { union { mycss_values_number_t number; mycss_values_angle_t angle; - }; + } value; mycss_values_color_type_value_t type_value; }; @@ -267,7 +269,7 @@ struct mycss_values_color { mycss_values_color_hwb_t hwb; mycss_values_color_gray_t gray; mycss_values_color_id_t name_id; - }; + } value; mycss_values_color_type_t type; mycss_values_color_type_value_t type_value; @@ -287,7 +289,7 @@ struct mycss_values_color_stop_list { URL */ struct mycss_values_url { - myhtml_string_t str; + mycore_string_t str; }; /* @@ -308,7 +310,7 @@ struct mycss_values_image { mycss_values_image_image_set_t* ii_set; mycss_values_element_t* element; mycss_values_cross_fade_t* cross_fade; - }; + } value; mycss_property_value_t type; }; @@ -320,14 +322,14 @@ struct mycss_values_image_list { /* image() */ struct mycss_values_image_image { - myhtml_string_t* str; + mycore_string_t* str; mycss_values_image_t* image; mycss_values_color_t* color; }; /* image-set() */ struct mycss_values_image_image_set_option { - myhtml_string_t* str; + mycore_string_t* str; mycss_values_image_t* image; mycss_values_resolution_t* resolution; }; @@ -378,7 +380,7 @@ struct mycss_values_gradient_linear { union { mycss_values_angle_t angle; mycss_values_gradient_side_or_corner_t side_or_corner; - }; + } value; mycss_values_color_stop_list_t color_stop_list; }; @@ -398,9 +400,9 @@ typedef mycss_values_font_family_type_t; struct mycss_values_font_family_entry { union { - myhtml_string_t str; + mycore_string_t str; mycss_property_font_family_t prop_type; - }; + } value; mycss_values_font_family_type_t type; }; diff --git a/source/myencoding/Makefile.mk b/source/myencoding/Makefile.mk new file mode 100644 index 0000000..d6194bc --- /dev/null +++ b/source/myencoding/Makefile.mk @@ -0,0 +1,13 @@ +myencoding_dirs := . +myencoding_objs := $(call MODEST_UTILS_OBJS,myencoding,$(myencoding_dirs)) + +myencoding_description := work with character encodings, detecting encoding, convert encodings by https://encoding.spec.whatwg.org/ +myencoding_dependencies := mycore myport + +myencoding_all: $(myencoding_objs) + +myencoding_clean: + rm -f $(myencoding_objs) + +myencoding_clone: + $(call MODEST_UTILS_HDRS_CLONE,myencoding,$(myencoding_dirs)) diff --git a/source/myencoding/detect.c b/source/myencoding/detect.c new file mode 100644 index 0000000..4cbba83 --- /dev/null +++ b/source/myencoding/detect.c @@ -0,0 +1,947 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myencoding/encoding.h" +#include "myencoding/detect_resource.h" +#include "mycore/utils/resources.h" + +myencoding_trigram_result_t myencoding_detect_by_trigram(unsigned const char *u_text, size_t length, + const myencoding_trigram_t *list, size_t list_length, + size_t max_sum_for_break) +{ + myencoding_trigram_result_t res = {0, 0}; + + for (size_t i = 0; i < (length - 3); i++) { + if(u_text[i] > 127) + { + for (size_t j = 0; j < list_length; j++) + { + if(memcmp(list[j].trigram, &u_text[i], 3) == 0) { + res.value += list[j].value; + res.count++; + + if(res.value >= max_sum_for_break) + i = length; + + break; + } + } + } + } + + return res; +} + +bool myencoding_detect_russian_has_end(myencoding_trigram_result_t *res, size_t min_count, size_t min_value) +{ + if(res->value >= min_value || res->count >= min_count) + return true; + + return false; +} + +bool myencoding_detect_unicode_has_end(myencoding_unicode_result_t *res, size_t max_bad_percent) +{ + if(res->count_good == 0) { + if(res->count_bad) + return false; + + return true; + } + else if(res->count_bad == 0) + return true; + + size_t percent_bad = (res->count_bad * 100) / res->count_good; + if(percent_bad < max_bad_percent) + return true; + + return false; +} + +myencoding_unicode_result_t myencoding_detect_utf_8(unsigned const char *u_text, size_t length) +{ + size_t i = 0; + myencoding_unicode_result_t res = {0, 0, 0}; + + while(i < length) + { + if((u_text[i] & 0x80) == 0x00) { + i++; + res.count_ascii++; + } + else if((u_text[i] & 0xE0) == 0xC0) { + i += 2; + + if(i >= length) + break; + + if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0)) + res.count_good++; + else + res.count_bad++; + } + else if((u_text[i] & 0xF0) == 0xE0) { + i += 3; + + if(i >= length) + break; + + if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0) && + ((u_text[i - 2] & 0x80) && (u_text[i - 2] & 0x40) == 0)) { + res.count_good++; + } + else + res.count_bad++; + } + else if((u_text[i] & 0xF8) == 0xF0) { + i += 4; + + if(i >= length) + break; + + if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0) && + ((u_text[i - 2] & 0x80) && (u_text[i - 2] & 0x40) == 0) && + ((u_text[i - 3] & 0x80) && (u_text[i - 3] & 0x40) == 0)) { + res.count_good++; + } + else + res.count_bad++; + } + else { + i++; + res.count_bad++; + } + } + + return res; +} + +myencoding_unicode_result_t myencoding_detect_utf_16(unsigned const char *u_text, size_t length) +{ + size_t i = 0; + myencoding_unicode_result_t res = {0, 0, 0}; + + while(i < length) + { + if(u_text[i] == 0x00) { + if((i % 2) == 0) { + i++; + + if(u_text[i] > 0x1F && u_text[i] < 0x7F) + res.count_bad++; + } + else { + if(u_text[(i - 1)] > 0x1F && u_text[(i - 1)] < 0x7F) + res.count_good++; + + i++; + } + } + else + i++; + } + + return res; +} + +bool myencoding_detect_bom(const char *text, size_t length, myencoding_t *encoding) +{ + unsigned const char *u_text = (unsigned const char*)text; + + if(length > 2) { + if(u_text[0] == 0xEF && + u_text[1] == 0xBB && + u_text[2] == 0xBF) + { + *encoding = MyENCODING_UTF_8; + return true; + } + } + + if(length > 1) { + if(u_text[0] == 0xFE && u_text[1] == 0xFF) { + *encoding = MyENCODING_UTF_16BE; + return true; + } + + if(u_text[0] == 0xFF && u_text[1] == 0xFE) { + *encoding = MyENCODING_UTF_16LE; + return true; + } + } + +// //for UTF-32 +// if(length > 3) { +// if(u_text[0] == 0x00 && +// u_text[1] == 0x00 && +// u_text[2] == 0xFE && +// u_text[3] == 0xFF) +// { +// *encoding = MyENCODING_UTF_32BE; +// return true; +// } +// +// if(u_text[0] == 0xFF && +// u_text[1] == 0xFE && +// u_text[2] == 0x00 && +// u_text[3] == 0x00) +// { +// *encoding = MyENCODING_UTF_32LE; +// return true; +// } +// } + + return false; +} + +bool myencoding_detect_and_cut_bom(const char *text, size_t length, myencoding_t *encoding, const char **new_text, size_t *new_size) +{ + if(myencoding_detect_bom(text, length, encoding)) + { + if(*encoding == MyENCODING_UTF_8) { + *new_text = &text[3]; + *new_size = length - 3; + } + else { + *new_text = &text[2]; + *new_size = length - 2; + } + + return true; + } + + return false; +} + +bool myencoding_detect_unicode(const char *text, size_t length, myencoding_t *encoding) +{ + unsigned const char *u_text = (unsigned const char*)text; + *encoding = MyENCODING_DEFAULT; + + myencoding_unicode_result_t res = myencoding_detect_utf_16(u_text, length); + + if(res.count_bad == 0 && res.count_good >= 3) { + *encoding = MyENCODING_UTF_16LE; + return true; + } + else if(res.count_bad >= 3 && res.count_good == 0) { + *encoding = MyENCODING_UTF_16BE; + return true; + } + + res = myencoding_detect_utf_8(u_text, length); + if(myencoding_detect_unicode_has_end(&res, 10)) { + *encoding = MyENCODING_UTF_8; + return true; + } + + return false; +} + +bool myencoding_detect_russian(const char *text, size_t length, myencoding_t *encoding) +{ + unsigned const char *u_text = (unsigned const char*)text; + + size_t min_count = 50; + size_t min_value = 100000; + size_t max_value = 0; + + *encoding = MyENCODING_DEFAULT; + + myencoding_trigram_result_t + res = myencoding_detect_by_trigram(u_text, length, myencoding_detect_trigrams_index_windows_1251, 1000, min_value); + if(myencoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyENCODING_WINDOWS_1251; + return true; + } + + max_value = res.value; + if(max_value) { + *encoding = MyENCODING_WINDOWS_1251; + } + + res = myencoding_detect_by_trigram(u_text, length, myencoding_detect_trigrams_index_koi8_r, 1000, min_value); + if(myencoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyENCODING_KOI8_R; + return true; + } + + if(max_value < res.value) { + *encoding = MyENCODING_KOI8_R; + max_value = res.value; + } + + res = myencoding_detect_by_trigram(u_text, length, myencoding_detect_trigrams_index_iso_8859_5, 1000, min_value); + if(myencoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyENCODING_ISO_8859_5; + return true; + } + + if(max_value < res.value) { + *encoding = MyENCODING_ISO_8859_5; + max_value = res.value; + } + + res = myencoding_detect_by_trigram(u_text, length, myencoding_detect_trigrams_index_x_mac_cyrillic, 1000, min_value); + if(myencoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyENCODING_X_MAC_CYRILLIC; + return true; + } + + if(max_value < res.value) { + *encoding = MyENCODING_X_MAC_CYRILLIC; + max_value = res.value; + } + + res = myencoding_detect_by_trigram(u_text, length, myencoding_detect_trigrams_index_ibm866, 1000, min_value); + if(myencoding_detect_russian_has_end(&res, min_count, min_value)) { + *encoding = MyENCODING_IBM866; + return true; + } + + if(max_value < res.value) { + *encoding = MyENCODING_IBM866; + } + + return false; +} + +bool myencoding_detect(const char *text, size_t length, myencoding_t *encoding) +{ + *encoding = MyENCODING_DEFAULT; + + if(myencoding_detect_unicode(text, length, encoding)) + return true; + + if(myencoding_detect_russian(text, length, encoding)) + return true; + + return false; +} + +const myencoding_detect_name_entry_t * myencoding_name_entry_by_name(const char* name, size_t length) +{ + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyENCODING_DETECT_NAME_STATIC_SIZE) + 1; + + while (myencoding_detect_name_entry_static_list_index[idx].label) + { + if(myencoding_detect_name_entry_static_list_index[idx].label_length == length) { + if(mycore_strncasecmp(myencoding_detect_name_entry_static_list_index[idx].label, name, length) == 0) + return &myencoding_detect_name_entry_static_list_index[idx]; + + if(myencoding_detect_name_entry_static_list_index[idx].next) + idx = myencoding_detect_name_entry_static_list_index[idx].next; + else + return NULL; + } + else if(myencoding_detect_name_entry_static_list_index[idx].label_length > length) { + return NULL; + } + else { + idx = myencoding_detect_name_entry_static_list_index[idx].next; + } + } + + return NULL; +} + +bool myencoding_by_name(const char *name, size_t length, myencoding_t *encoding) +{ + const myencoding_detect_name_entry_t *entry = myencoding_name_entry_by_name(name, length); + + if(entry) { + if(encoding) + *encoding = entry->encoding; + + return true; + } + + return false; +} + +const char * myencoding_name_by_id(myencoding_t encoding, size_t *length) +{ + if(encoding >= MyENCODING_LAST_ENTRY) { + if(length) { + *length = 0; + } + + return NULL; + } + + const myencoding_entry_name_index_t *entry = &myencoding_entry_name_index_static_list_index[encoding]; + + if(length) { + *length = entry->length; + } + + return entry->name; +} + +/* + When an algorithm requires a user agent to prescan a byte stream to determine its encoding, + given some defined end condition, then it must run the following steps. + These steps either abort unsuccessfully or return a character encoding. + If at any point during these steps (including during instances of the get an attribute algorithm invoked by this one) + the user agent either runs out of bytes (meaning the position pointer created in the first step below goes beyond the end of the byte stream obtained so far) + or reaches its end condition, then abort the prescan a byte stream to determine its encoding algorithm unsuccessfully. +*/ +bool myencoding_extracting_character_encoding_from_charset(const char *data, size_t data_size, myencoding_t *encoding) +{ + *encoding = MyENCODING_NOT_DETERMINED; + + /* 1 */ + size_t length = 0; + size_t charset_length = strlen("charset"); + + bool is_get_pos = false; + const unsigned char *udata = (const unsigned char *)data; + + /* 2 */ + while((length + charset_length) < data_size) { + if(mycore_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"charset", &udata[length])) + { + length += charset_length; + + /* 2 */ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20) + { + break; + } + + length++; + } + + /* 4 */ + if(udata[length] == 0x3D) { /* EQUALS SIGN (=) */ + is_get_pos = true; + + length++; + break; + } + } + + length++; + } + + if(is_get_pos == false || length >= data_size) + return false; + + /* 5 */ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20) + { + break; + } + + length++; + } + + if(length >= data_size) + return false; + + /* 6 */ + /* " */ + if(udata[length] == 0x22) + { + length++; + size_t begin = length; + + while(length < data_size) { + if(udata[length] == 0x22) + return myencoding_by_name(&data[begin], (length - begin), encoding); + + length++; + } + + return false; + } + + /* ' */ + if(udata[length] == 0x27) + { + length++; + size_t begin = length; + + while(length < data_size) { + if(udata[length] == 0x27) + return myencoding_by_name(&data[begin], (length - begin), encoding); + + length++; + } + + return false; + } + + /* other */ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20) + { + size_t begin = length; + + while(length < data_size) { + /* SEMICOLON character (;) */ + if(udata[length] == 0x3B) { + return myencoding_by_name(&data[begin], (length - begin), encoding); + } + + length++; + } + + return myencoding_by_name(&data[begin], (length - begin), encoding); + } + + length++; + } + + return false; +} + +bool myencoding_prescan_stream_to_determine_encoding_get_attr_spaces(const unsigned char *udata, size_t *data_length, size_t data_size, myencoding_detect_attr_t *attr) +{ + size_t length = *data_length; + + /* set position */ + attr->key_length = length - attr->key_begin; + + /* 6 */ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20 && udata[length] != 0x2F) + { + break; + } + + length++; + } + + if(length >= data_size) { + *data_length = length; + return false; + } + + /* 7 */ + if(udata[length] != 0x3D) { + *data_length = length; + return false; + } + + /* 8 */ + *data_length = (length + 1); + return true; +} + +size_t myencoding_prescan_stream_to_determine_encoding_get_attr_value(const unsigned char *udata, size_t length, size_t data_size, myencoding_detect_attr_t *attr, bool *it_last) +{ + /* 9 */ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20) + { + break; + } + + length++; + } + + if(length >= data_size) { + *it_last = true; + return length; + } + + /* 10 */ + switch (udata[length]) { + case 0x22: /* (ASCII ") */ + length++; + attr->value_begin = length; + + while(length < data_size) { + if(udata[length] == 0x22) + { + attr->value_length = length - attr->value_begin; + return (length + 1); + } + + length++; + } + + break; + + case 0x27: /* (ASCII ') */ + length++; + attr->value_begin = length; + + while(length < data_size) { + if(udata[length] == 0x27) + { + attr->value_length = length - attr->value_begin; + return (length + 1); + } + + length++; + } + + break; + + case 0x3E: /* (ASCII >) */ + *it_last = true; + return (length + 1); + + default: + attr->value_begin = length; + + while(length < data_size) { + if(udata[length] == 0x09 || udata[length] == 0x0A || udata[length] == 0x0C || + udata[length] == 0x0D || udata[length] == 0x20 || udata[length] == 0x3E) + { + attr->value_length = length - attr->value_begin; + return (length + 1); + } + + length++; + } + + break; + } + + attr->value_length = length - attr->value_begin; + return length; +} + +size_t myencoding_prescan_stream_to_determine_encoding_get_attr(const unsigned char *udata, size_t length, size_t data_size, myencoding_detect_attr_t *attr, bool *it_last) +{ + memset(attr, 0, sizeof(myencoding_detect_attr_t)); + + /* + If the byte at position is one of 0x09 (ASCII TAB), 0x0A (ASCII LF), 0x0C (ASCII FF), 0x0D (ASCII CR), + 0x20 (ASCII space), or 0x2F (ASCII /) then advance position to the next byte and redo this step. + */ + /* 1 */ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20 && udata[length] != 0x2F) + { + break; + } + + length++; + } + + if(length >= data_size) { + *it_last = true; + return length; + } + + /* 2 */ + if(udata[length] == 0x3E) { /* (ASCII >) */ + *it_last = true; + return (length + 1); + } + + attr->key_begin = length; + + /* 3, 4 */ + while(length < data_size) { + switch (udata[length]) { + case 0x3D: /* (ASCII =) */ + if(attr->key_begin != (length - 1)) { + attr->key_length = length - attr->key_begin; + + length++; + return myencoding_prescan_stream_to_determine_encoding_get_attr_value(udata, length, data_size, attr, it_last); + } + + /* fall through */ + + case 0x09: /* (ASCII TAB) */ + case 0x0A: /* (ASCII LF) */ + case 0x0C: /* (ASCII FF) */ + case 0x0D: /* (ASCII CR) */ + case 0x20: /* (ASCII space) */ + length++; + + if(myencoding_prescan_stream_to_determine_encoding_get_attr_spaces(udata, &length, data_size, attr) == false) { + *it_last = true; + return length; + } + + return myencoding_prescan_stream_to_determine_encoding_get_attr_value(udata, length, data_size, attr, it_last); + + case 0x2F: /* (ASCII /) */ + case 0x3E: /* (ASCII >) */ + *it_last = true; + attr->key_length = length - attr->key_begin; + + return (length + 1); + + default: + break; + } + + length++; + } + + if(myencoding_prescan_stream_to_determine_encoding_get_attr_spaces(udata, &length, data_size, attr) == false) { + *it_last = true; + return length; + } + + return myencoding_prescan_stream_to_determine_encoding_get_attr_value(udata, length, data_size, attr, it_last); +} + +bool myencoding_prescan_stream_to_determine_encoding_check_meta(const unsigned char *udata, size_t *length, size_t data_size, myencoding_t *encoding) +{ + myencoding_detect_attr_t attr; + + bool got_pragma = false; + bool it_last = false; + + unsigned int need_pragma = 0; /* 0 = NULL, 1 = false, 2 = true */ + + /* + http-equiv = 1 + content = 2 + charset = 4 + */ + /* If the attribute's name is already in attribute list, then return to the step labeled attributes. */ + size_t is_exists = 0; + + while(*length < data_size) { + *length = myencoding_prescan_stream_to_determine_encoding_get_attr(udata, *length, data_size, &attr, &it_last); + + /* 9 */ + if(attr.key_length == strlen("http-equiv") && + mycore_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"http-equiv", &udata[ attr.key_begin ])) + { + if((is_exists & 1) == 0) { + is_exists |= 1; + + if(attr.value_length == strlen("content-type") && + mycore_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"content-type", &udata[ attr.value_begin ])) + { + got_pragma = true; + } + } + } + else if(attr.key_length == strlen("content") && + mycore_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"content", &udata[ attr.key_begin ])) + { + if((is_exists & 2) == 0) { + is_exists |= 2; + + if(myencoding_extracting_character_encoding_from_charset((const char*)(&udata[ attr.value_begin ]), attr.value_length, encoding)) { + need_pragma = 2; + } + } + } + else if(attr.key_length == strlen("charset") && + mycore_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"charset", &udata[ attr.key_begin ])) + { + if((is_exists & 4) == 0) { + is_exists |= 4; + + myencoding_by_name((const char*)(&udata[ attr.value_begin ]), attr.value_length, encoding); + need_pragma = 1; + } + } + + if(it_last) + break; + } + + /* 11, 12, 13 */ + if(need_pragma == 0 || (need_pragma == 2 && got_pragma == false)) { + *encoding = MyENCODING_NOT_DETERMINED; + return false; + } + + /* 14 */ + if(*encoding == MyENCODING_UTF_16BE || *encoding == MyENCODING_UTF_16LE) { + *encoding = MyENCODING_UTF_8; + } + + /* 15 */ + if(*encoding == MyENCODING_X_USER_DEFINED) { + *encoding = MyENCODING_WINDOWS_1252; + } + + /* 16 */ + return true; +} + +size_t myencoding_prescan_stream_to_determine_encoding_skip_name(const unsigned char *udata, size_t length, size_t data_size) +{ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && + udata[length] != 0x0D && udata[length] != 0x20) + { + break; + } + + length++; + } + + if(length >= data_size) + return length; + + if(udata[length] == 0x3E) { + return (length + 1); + } + + myencoding_detect_attr_t attr; + bool it_last = false; + + while(length < data_size) { + length = myencoding_prescan_stream_to_determine_encoding_get_attr(udata, length, data_size, &attr, &it_last); + + if(it_last) { + return length; + } + } + + return length; +} + +size_t myencoding_prescan_stream_to_determine_encoding_skip_other(const unsigned char *udata, size_t length, size_t data_size) +{ + if(udata[length] == 0x2F) { /* / */ + length++; + + if(length >= data_size) + return length; + + if(mycore_tokenizer_chars_map[ udata[length] ] == MyCORE_STRING_MAP_CHAR_A_Z_a_z) { + return myencoding_prescan_stream_to_determine_encoding_skip_name(udata, length, data_size); + } + + while(length < data_size) { + if(udata[length] != 0x3E) { + return (length + 1); + } + + length++; + } + + return length; + } + else if(udata[length] == 0x21) { /* ! */ + length++; + + if((length + 2) < data_size && udata[length] == 0x2D && udata[(length+1)] == 0x2D) { + while(length < data_size) { + if(udata[length] != 0x3E) { + if(udata[(length - 1)] == 0x2D && udata[(length - 2)] == 0x2D) + return (length + 1); + + length++; + } + } + + return length; + } + + while(length < data_size) { + if(udata[length] != 0x3E) { + return (length + 1); + } + + length++; + } + + return length; + } + else if(udata[length] == 0x3F) { /* ? */ + length++; + + while(length < data_size) { + if(udata[length] != 0x3E) { + return (length + 1); + } + + length++; + } + + return length; + } + + + return myencoding_prescan_stream_to_determine_encoding_skip_name(udata, length, data_size); +} + +myencoding_t myencoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size) +{ + const unsigned char* udata = (const unsigned char*)data; + myencoding_t encoding = MyENCODING_NOT_DETERMINED; + + size_t i = 0; + while(i < data_size) { + /* 0x3C = '<' */ + if(data[i] == 0x3C) + { + if((i + 5) >= data_size) + return encoding; + + i++; + + switch (data[i]) { + /* + A sequence of bytes starting with: + 0x3C, 0x4D or 0x6D, 0x45 or 0x65, 0x54 or 0x74, 0x41 or 0x61, + and one of 0x09, 0x0A, 0x0C, 0x0D, 0x20, 0x2F + (case-insensitive ASCII 'first -- lower boundary + // res->second -- upper boundary + // res->result -- code point + // res->third -- bytes seen + // res->flag -- bytes needed + + if(res->flag == 0) + { + if(data <= 0x7F) { + res->result = data; + return MyENCODING_STATUS_OK; + } + else if(data >= 0xC2 && data <= 0xDF) { + res->flag = 1; + res->result = data - 0xC0; + } + else if(data >= 0xE0 && data <= 0xEF) { + if(data == 0xE0) { + res->first = 0xA0; + } + else if(data == 0xED){ + res->second = 0x9F; + } + + res->flag = 2; + res->result = data - 0xE0; + } + else if(data >= 0xF0 && data <= 0xF4) { + if(data == 0xF0) { + res->first = 0x90; + } + else if(data == 0xF4){ + res->second = 0x8F; + } + + res->flag = 2; + res->result = data - 0xF0; + } + else + return MyENCODING_STATUS_ERROR; + + res->result = res->result << (6 * res->flag); + return MyENCODING_STATUS_CONTINUE; + } + + if(data < res->first && data > res->second) + { + res->result = 0x00; + res->flag = 0x00; + res->third = 0x00; + res->first = 0x80; + res->second = 0xBF; + + return MyENCODING_STATUS_DONE|MyENCODING_STATUS_ERROR; + } + + res->first = 0x80; + res->second = 0xBF; + + res->third++; + res->result += (unsigned long)(data - 0x80) << (6 * (res->flag - res->third)); + + if(res->third != res->flag) + return MyENCODING_STATUS_CONTINUE; + + res->flag = 0x00; + res->third = 0x00; + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_ibm866(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_ibm866[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_2(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_2[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_3(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_3[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_4(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_4[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_5(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_5[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_6(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_6[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_7(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_7[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_8(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_8[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_8_i(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_8[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_10(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_10[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_13(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_13[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_14(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_14[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_15(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_15[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_iso_8859_16(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_iso_8859_16[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_koi8_r(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_koi8_r[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_koi8_u(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_koi8_u[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_macintosh(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_macintosh[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_874(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_874[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1250(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1250[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1251(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1251[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1252(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1252[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1253(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1253[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1254(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1254[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1255(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1255[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1256(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1256[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1257(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1257[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_windows_1258(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_windows_1258[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_x_mac_cyrillic(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + (res->result = data); + else + (res->result = myencoding_map_x_mac_cyrillic[(data - 0x80)]); + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_gbk(unsigned const char data, myencoding_result_t *res) +{ + return myencoding_decode_gb18030(data, res); +} + +unsigned long myencoding_index_gb18030_ranges_code_point(unsigned long pointer) +{ + // step 1 + if((pointer > 39419 && pointer < 189000) || pointer > 1237575) + return 0; + + // step 2 + if(pointer == 7457) + return 0xe7c7; + + // step 3 + unsigned long offset = sizeof(myencoding_map_gb18030_ranges) / (sizeof(unsigned long) * 2); + + unsigned long code_point_offset = 0; + while (offset) { + offset--; + + if(myencoding_map_gb18030_ranges[offset][0] == pointer || + myencoding_map_gb18030_ranges[offset][0] < pointer) + { + code_point_offset = myencoding_map_gb18030_ranges[offset][1]; + break; + } + } + + // step 4 + return (code_point_offset + pointer - offset); +} + +myencoding_status_t myencoding_decode_gb18030(unsigned const char data, myencoding_result_t *res) +{ + if(res->third) { + if(data >= 0x30 && data <= 0x39) { + res->result = myencoding_index_gb18030_ranges_code_point((((res->first - 0x81) * 10 + res->second - 0x30) * + 126 + res->third - 0x81) * 10 + data - 0x30); + } + + res->first = 0; + res->second = 0; + res->third = 0; + + if(res->result) + return MyENCODING_STATUS_OK; + + return MyENCODING_STATUS_ERROR; + } + else if(res->second) { + if(data >= 0x81 && data <= 0xFE) { + res->third = data; + return MyENCODING_STATUS_CONTINUE; + } + + res->first = 0; + res->second = 0; + + return MyENCODING_STATUS_ERROR; + } + else if(res->first) { + if(data >= 0x30 && data <= 0x39) { + res->second = data; + return MyENCODING_STATUS_CONTINUE; + } + + unsigned long lead = res->first, pointer = 0x00; + res->first = 0x00; + + unsigned char offset; + + if(data < 0x7F) + offset = 0x40; + else + offset = 0x41; + + if((data >= 0x40 && data <= 0x7E) || + (data >= 0x80 && data <= 0xFE)) + { + pointer = (lead - 0x81) * 190 + (data - offset); + } + else { + return MyENCODING_STATUS_ERROR; + } + + res->result = myencoding_map_gb18030[pointer]; + return MyENCODING_STATUS_OK; + } + + if(data <= 0x7F) { + res->result = data; + return MyENCODING_STATUS_OK; + } + + if(data == 0x80) { + res->result = 0x20ac; + return MyENCODING_STATUS_OK; + } + + if(data >= 0x81 && data <= 0xFE) { + res->first = data; + return MyENCODING_STATUS_CONTINUE; + } + + return MyENCODING_STATUS_ERROR; +} + +myencoding_status_t myencoding_decode_big5(unsigned const char data, myencoding_result_t *res) +{ + if(res->first) + { + unsigned long lead = res->first; + unsigned long pointer = 0x00; + unsigned long offset; + + res->first = 0x00; + + if(data < 0x7F) + offset = 0x40; + else + offset = 0x62; + + if((data >= 0x40 && data <= 0x7E) || + (data >= 0xA1 && data <= 0xFE)) + { + pointer = (lead - 0x81) * 157 + (data - offset); + } + + switch (pointer) { + case 1133: + // U+00CA U+0304 + res->result = 0x00ca; + res->result_aux = 0x0304; + return MyENCODING_STATUS_OK; + case 1135: + // U+00CA U+030C + res->result = 0x00ca; + res->result_aux = 0x030c; + return MyENCODING_STATUS_OK; + case 1164: + // U+00EA U+0304 + res->result = 0x00ea; + res->result_aux = 0x0304; + return MyENCODING_STATUS_OK; + case 1166: + // U+00EA U+030C + res->result = 0x00ea; + res->result_aux = 0x030c; + return MyENCODING_STATUS_OK; + default: + break; + } + + if(pointer == 0) + return MyENCODING_STATUS_ERROR; + + res->result = myencoding_map_big5[pointer]; + res->result_aux = 0; + + return MyENCODING_STATUS_OK; + } + + if(data <= 0x7F) { + res->result = data; + return MyENCODING_STATUS_OK; + } + + if(data >= 0x81 && data <= 0xFE) { + res->first = data; + return MyENCODING_STATUS_CONTINUE; + } + + return MyENCODING_STATUS_ERROR; +} + +myencoding_status_t myencoding_decode_euc_jp(unsigned const char data, myencoding_result_t *res) +{ + if(res->first == 0x8E && (data >= 0xA1 && data <= 0xDF)) { + res->first = 0x00; + res->result = 0xFF61 + data - 0xA1; + + return MyENCODING_STATUS_OK; + } + else if(res->first == 0x8F && (data >= 0xA1 && data <= 0xFE)) { + res->flag = 1; + res->first = data; + + return MyENCODING_STATUS_CONTINUE; + } + else if(res->first) + { + unsigned long lead = res->first; + res->first = 0x00; + + if((lead >= 0xA1 && lead <= 0xFE) && + (data >= 0xA1 && data <= 0xFE)) + { + unsigned long idx = (lead - 0xA1) * 94 + data - 0xA1; + if(res->flag) { + res->result = myencoding_map_jis0212[idx]; + } + else { + res->result = myencoding_map_jis0208[idx]; + } + + res->flag = 0; + + if(res->result == 0) + return MyENCODING_STATUS_ERROR; + + return MyENCODING_STATUS_OK; + } + } + + if(data <= 0x7F) { + res->result = data; + return MyENCODING_STATUS_OK; + } + + if((data >= 0x8E && data <= 0x8F) || + (data >= 0xA1 && data <= 0xFE)) + { + res->first = data; + return MyENCODING_STATUS_CONTINUE; + } + + return MyENCODING_STATUS_ERROR; +} + +myencoding_status_t myencoding_decode_iso_2022_jp(unsigned const char data, myencoding_result_t *res) +{ + // res->first -- lead + // res->second -- state + // res->third -- output state + // res->flag -- output flag + + switch (res->second) { + case 0: // ASCII + { + if(data == 0x1B) { + res->second = 6; + return MyENCODING_STATUS_CONTINUE; + } + else if((data <= 0x7F) && + data != 0x0E && data != 0x0F && data != 0x1B) + { + res->flag = 0; + res->result = data; + return MyENCODING_STATUS_OK; + } + + res->flag = 0; + return MyENCODING_STATUS_ERROR; + } + + case 1: // Roman + { + if(data == 0x1B) { + res->second = 6; + return MyENCODING_STATUS_CONTINUE; + } + else if(data == 0x5C) { + res->flag = 0; + res->result = 0x00A5; + return MyENCODING_STATUS_OK; + } + else if(data == 0x7E) { + res->flag = 0; + res->result = 0x203E; + return MyENCODING_STATUS_OK; + } + else if((data <= 0x7F) && + data != 0x0E && data != 0x0F && + data != 0x1B && data != 0x5C && + data != 0x7E) + { + res->flag = 0; + res->result = data; + return MyENCODING_STATUS_OK; + } + + res->flag = 0; + return MyENCODING_STATUS_ERROR; + } + + case 3: // Katakana + { + if(data == 0x1B) { + res->second = 6; + return MyENCODING_STATUS_CONTINUE; + } + else if(data >= 0x21 && data <= 0x5F) { + res->flag = 0; + res->result = 0xFF61 + data - 0x21; + + return MyENCODING_STATUS_OK; + } + + res->flag = 0; + return MyENCODING_STATUS_ERROR; + } + + case 4: // Lead byte + { + if(data == 0x1B) { + res->second = 6; + return MyENCODING_STATUS_CONTINUE; + } + else if(data >= 0x21 && data <= 0x7E) { + res->flag = 0; + res->first = data; + res->second = 5; + + return MyENCODING_STATUS_CONTINUE; + } + + res->flag = 0; + return MyENCODING_STATUS_ERROR; + } + + case 5: // Trail byte + { + if(data == 0x1B) { + res->second = 6; + return MyENCODING_STATUS_CONTINUE|MyENCODING_STATUS_ERROR; + } + else if(data >= 0x21 && data <= 0x7E) { + res->second = 4; + + unsigned long pointer = (res->first - 0x21) * 94 + data - 0x21; + res->result = myencoding_map_jis0208[pointer]; + + if(res->result == 0) + return MyENCODING_STATUS_ERROR; + + return MyENCODING_STATUS_OK; + } + + res->second = 4; + return MyENCODING_STATUS_ERROR; + } + + case 6: // Escape start + { + if(data == 0x24 || data == 0x28) { + res->first = data; + res->second = 7; + + return MyENCODING_STATUS_CONTINUE; + } + + res->flag = 0; + res->second = res->third; + + return MyENCODING_STATUS_ERROR; + } + + case 7: // Escape + { + unsigned long lead = res->first; + res->first = 0x00; + + res->second = 0x00; + + if(lead == 0x28 && data == 0x42) { + res->second = 0; + } + else if(lead == 0x28 && data == 0x4A) { + res->second = 1; + } + else if(lead == 0x28 && data == 0x49) { + res->second = 2; + } + else if(lead == 0x24 && (data == 0x40 || data == 0x42)) { + res->second = 4; + } + + if(res->second) + { + res->third = res->second; + + unsigned long output_flag = res->flag; + res->flag = 1; + + if(output_flag) + return MyENCODING_STATUS_ERROR; + + return MyENCODING_STATUS_CONTINUE; + } + + res->flag = 0; + res->second = res->third; + + return MyENCODING_STATUS_ERROR; + } + + default: + break; + } + + return 0; +} + +myencoding_status_t myencoding_decode_shift_jis(unsigned const char data, myencoding_result_t *res) +{ + // res->first -- lead + + if(res->first) + { + unsigned long offset; + unsigned long lead_offset; + + if(data < 0x7F) + offset = 0x40; + else + offset = 0x41; + + if(res->first < 0xA0) + lead_offset = 0x81; + else + lead_offset = 0xC1; + + unsigned long pointer = 0x00; + if((data >= 0x40 && data <= 0x7E) || + (data >= 0x80 && data <= 0xFC)) + { + pointer = (res->first - lead_offset) * 188 + data - offset; + } + + if(pointer) + res->result = myencoding_map_jis0208[pointer]; + else + res->result = 0x00; + + if(res->result == 0x00 && (pointer >= 8836 && pointer <= 10528)) { + res->result = 0xE000 + pointer - 8836; + } + + if(res->result) + return MyENCODING_STATUS_OK; + + return MyENCODING_STATUS_ERROR; + } + + if((data <= 0x7F) || data == 0x80) { + res->result = data; + return MyENCODING_STATUS_OK; + } + + if(data >= 0xA1 && data <= 0xDF) { + res->result = 0xFF61 + data - 0xA1; + return MyENCODING_STATUS_OK; + } + + if((data >= 0x81 && data <= 0x9F) || + (data >= 0xE0 && data <= 0xFC)) { + res->first = data; + return MyENCODING_STATUS_CONTINUE; + } + + return MyENCODING_STATUS_ERROR; +} + +myencoding_status_t myencoding_decode_euc_kr(unsigned const char data, myencoding_result_t *res) +{ + // res->first -- lead + + if(res->first) + { + unsigned long lead = res->first, pointer = 0x00; + res->first = 0x00; + + if(data >= 0x41 && data <= 0xFE) { + pointer = (lead - 0x81) * 190 + (data - 0x41); + } + + if(pointer) + res->result = myencoding_map_euc_kr[pointer]; + + if(res->result) + return MyENCODING_STATUS_OK; + + return MyENCODING_STATUS_ERROR; + } + + if(data <= 0x7F) { + res->result = data; + return MyENCODING_STATUS_OK; + } + + if(data >= 0x81 && data <= 0xFE) { + res->first = data; + return MyENCODING_STATUS_CONTINUE; + } + + return MyENCODING_STATUS_ERROR; +} + +myencoding_status_t myencoding_decode_shared_utf_16(unsigned const char data, myencoding_result_t *res) +{ + // res->first -- lead + // res->second -- lead surrogate + // res->flag -- flag + + if(res->first == 0x00) { + res->first = data; + return MyENCODING_STATUS_CONTINUE; + } + + unsigned long code_unit; + if(res->flag) + (code_unit = (res->first << 8) + data); + else + (code_unit = (unsigned long)(data << 8) + res->first); + + res->first = 0x00; + + if(res->second) { + unsigned long lead_surrogate = res->second; + res->second = 0x00; + + if(code_unit >= 0xDC00 && code_unit <= 0xDFFF) { + res->result = 0x10000 + ((lead_surrogate - 0xD800) << 10) + (code_unit - 0xDC00); + return MyENCODING_STATUS_OK; + } + + unsigned char byte1 = (unsigned char)(code_unit >> 8); + unsigned char byte2 = (unsigned char)(code_unit & 0x00FF); + + if(res->flag) { + res->result = byte1; + res->result_aux = byte2; + } + else { + res->result = byte2; + res->result_aux = byte1; + } + + return MyENCODING_STATUS_DONE|MyENCODING_STATUS_ERROR; + } + + if(code_unit >= 0xD800 && code_unit <= 0xDBFF) { + res->second = code_unit; + return MyENCODING_STATUS_CONTINUE; + } + + if(code_unit >= 0xDC00 && code_unit <= 0xDFFF) { + return MyENCODING_STATUS_ERROR; + } + + res->result = code_unit; + + return MyENCODING_STATUS_OK; +} + +myencoding_status_t myencoding_decode_utf_16be(unsigned const char data, myencoding_result_t *res) +{ + if(res->flag == 0) + res->flag = 1; + + return myencoding_decode_shared_utf_16(data, res); +} + +myencoding_status_t myencoding_decode_utf_16le(unsigned const char data, myencoding_result_t *res) +{ + if(res->flag) + res->flag = 0; + + return myencoding_decode_shared_utf_16(data, res); +} + +myencoding_status_t myencoding_decode_x_user_defined(unsigned const char data, myencoding_result_t *res) +{ + if(data <= 0x7F) + res->result = data; + else + res->result = 0xF780 + data - 0x80; + + return MyENCODING_STATUS_OK; +} + +void myencoding_result_clean(myencoding_result_t *res) +{ + memset(res, 0, sizeof(myencoding_result_t)); +} + +size_t myencoding_codepoint_ascii_length(size_t codepoint) +{ + if (codepoint <= 0x0000007F) { + return 1; + } + else if (codepoint <= 0x000007FF) { + return 2; + } + else if (codepoint <= 0x0000FFFF) { + return 3; + } + else if (codepoint <= 0x001FFFFF) { + return 4; + } + /* not uses in unicode */ + else if (codepoint <= 0x03FFFFFF) { + return 5; + } + else if (codepoint <= 0x7FFFFFFF) { + return 6; + } + + return 0; +} + +size_t myencoding_ascii_utf_8_length(const unsigned char data) +{ + if (data < 0x80){ + return 1; + } + else if ((data & 0xe0) == 0xc0) { + return 2; + } + else if ((data & 0xf0) == 0xe0) { + return 3; + } + else if ((data & 0xf8) == 0xf0) { + return 4; + } + else if ((data & 0xfc) == 0xf8) { + return 5; + } + else if ((data & 0xff) == 0xfc) { + return 6; + } + + return 0; +} + +size_t myencoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data) +{ + /* 0x80 -- 10xxxxxx */ + /* 0xC0 -- 110xxxxx */ + /* 0xE0 -- 1110xxxx */ + /* 0xF0 -- 11110xxx */ + /* 0xF8 -- 111110xx */ + /* 0xFC -- 1111110x */ + + if (codepoint <= 0x0000007F) { + /* 0xxxxxxx */ + data[0] = (char)codepoint; + return 1; + } + else if (codepoint <= 0x000007FF) { + /* 110xxxxx 10xxxxxx */ + data[0] = (char)(0xC0 | (codepoint >> 6 )); + data[1] = (char)(0x80 | (codepoint & 0x3F)); + + return 2; + } + else if (codepoint <= 0x0000FFFF) { + /* 1110xxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xE0 | ((codepoint >> 12))); + data[1] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[2] = (char)(0x80 | ( codepoint & 0x3F)); + + return 3; + } + else if (codepoint <= 0x001FFFFF) { + /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xF0 | ( codepoint >> 18)); + data[1] = (char)(0x80 | ((codepoint >> 12) & 0x3F)); + data[2] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[3] = (char)(0x80 | ( codepoint & 0x3F)); + + return 4; + } + /* not uses in unicode */ + // else if (codepoint <= 0x03FFFFFF) { + // /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xF8 | ( codepoint >> 24); + // data[1] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[4] = 0x80 | ( codepoint & 0x3F); + // + // return 5; + // } + // else if (codepoint <= 0x7FFFFFFF) { + // /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xFC | ( codepoint >> 30); + // data[1] = 0x80 | ((codepoint >> 24) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[4] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[5] = 0x80 | ( codepoint & 0x3F); + // + // return 6; + // } + + return 0; +} + +size_t myencoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data) +{ + /* 0x80 -- 10xxxxxx */ + /* 0xC0 -- 110xxxxx */ + /* 0xE0 -- 1110xxxx */ + /* 0xF0 -- 11110xxx */ + /* 0xF8 -- 111110xx */ + /* 0xFC -- 1111110x */ + + if (codepoint <= 0x0000007F) { + /* 0xxxxxxx */ + data[0] = (char)mycore_string_chars_lowercase_map[ codepoint ]; + return 1; + } + else if (codepoint <= 0x000007FF) { + /* 110xxxxx 10xxxxxx */ + data[0] = (char)(0xC0 | (codepoint >> 6 )); + data[1] = (char)(0x80 | (codepoint & 0x3F)); + + return 2; + } + else if (codepoint <= 0x0000FFFF) { + /* 1110xxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xE0 | ((codepoint >> 12))); + data[1] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[2] = (char)(0x80 | ( codepoint & 0x3F)); + + return 3; + } + else if (codepoint <= 0x001FFFFF) { + /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + data[0] = (char)(0xF0 | ( codepoint >> 18)); + data[1] = (char)(0x80 | ((codepoint >> 12) & 0x3F)); + data[2] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); + data[3] = (char)(0x80 | ( codepoint & 0x3F)); + + return 4; + } + /* not uses in unicode */ + // else if (codepoint <= 0x03FFFFFF) { + // /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xF8 | ( codepoint >> 24); + // data[1] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[4] = 0x80 | ( codepoint & 0x3F); + // + // return 5; + // } + // else if (codepoint <= 0x7FFFFFFF) { + // /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + // data[0] = 0xFC | ( codepoint >> 30); + // data[1] = 0x80 | ((codepoint >> 24) & 0x3F); + // data[2] = 0x80 | ((codepoint >> 18) & 0x3F); + // data[3] = 0x80 | ((codepoint >> 12) & 0x3F); + // data[4] = 0x80 | ((codepoint >> 6 ) & 0x3F); + // data[5] = 0x80 | ( codepoint & 0x3F); + // + // return 6; + // } + + return 0; +} + +size_t myencoding_ascii_utf_8_to_codepoint(const unsigned char* data, size_t* codepoint) +{ + if (*data < 0x80){ + /* 0xxxxxxx */ + *codepoint = (size_t)*data; + return 1; + } + else if ((*data & 0xe0) == 0xc0) { + /* 110xxxxx 10xxxxxx */ + *codepoint = (data[0] ^ (0xC0 & data[0])) << 6; + *codepoint |= (data[1] ^ (0x80 & data[1])); + + return 2; + } + else if ((*data & 0xf0) == 0xe0) { + /* 1110xxxx 10xxxxxx 10xxxxxx */ + *codepoint = (data[0] ^ (0xE0 & data[0])) << 12; + *codepoint |= (data[1] ^ (0x80 & data[1])) << 6; + *codepoint |= (data[2] ^ (0x80 & data[2])); + + return 3; + } + else if ((*data & 0xf8) == 0xf0) { + /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + *codepoint = (data[0] ^ (0xF0 & data[0])) << 18; + *codepoint |= (data[1] ^ (0x80 & data[1])) << 12; + *codepoint |= (data[2] ^ (0x80 & data[2])) << 6; + *codepoint |= (data[3] ^ (0x80 & data[3])); + + return 4; + } + + return 0; +} + +size_t myencoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data) +{ + if((codepoint >> 16)) { + codepoint -= 0x10000; + + size_t high = 0xD800 | (codepoint >> 10); + size_t low = 0xDC00 | (codepoint & 0x3FF); + + data[0] = (char)(high >> 8); + data[1] = (char)high; + data[2] = (char)(low >> 8); + data[3] = (char)low; + + return 4; + } + + data[0] = (char)(codepoint >> 8); + data[1] = (char)codepoint; + + return 2; +} + +size_t myencoding_convert_to_ascii_utf_8(mycore_string_raw_t* raw_str, const char* buff, size_t length, myencoding_t encoding) +{ + if(raw_str->data == NULL) { + raw_str->size = length + 1; + raw_str->length = 0; + raw_str->data = mycore_malloc(sizeof(char) * raw_str->size); + + if(raw_str->data == NULL) + return 0; + } + + myencoding_result_t res = {0}; + + unsigned const char* u_buff = (unsigned const char*)buff; + const myencoding_custom_f func = myencoding_get_function_by_id(encoding); + + size_t i; + for (i = 0; i < length; i++) + { + if(func(u_buff[i], &res) == MyENCODING_STATUS_OK) { + if((raw_str->length + 6) >= raw_str->size) { + size_t new_size = raw_str->length + 6 + (length / 2); + char *new_data = mycore_realloc(raw_str->data, sizeof(char) * new_size); + + if(new_data == NULL) { + return 0; + } + + raw_str->data = new_data; + raw_str->size = new_size; + } + + raw_str->length += myencoding_codepoint_to_ascii_utf_8(res.result, &raw_str->data[raw_str->length]); + } + } + + return i; +} + + diff --git a/source/myencoding/encoding.h b/source/myencoding/encoding.h new file mode 100644 index 0000000..fa43018 --- /dev/null +++ b/source/myencoding/encoding.h @@ -0,0 +1,160 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_ENCODING_H +#define MyENCODING_ENCODING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "myencoding/myosi.h" +#include "mycore/utils.h" +#include "mycore/mystring.h" + +struct myencoding_result { + unsigned long first; + unsigned long second; + unsigned long third; + unsigned long result; + unsigned long result_aux; + unsigned long flag; +}; + +struct myencoding_trigram { + const unsigned char trigram[3]; + size_t value; +}; + +struct myencoding_trigram_result { + size_t count; + size_t value; +}; + +struct myencoding_unicode_result { + size_t count_ascii; + size_t count_good; + size_t count_bad; +}; + +struct myencoding_detect_name_entry { + const char* name; + size_t name_length; + const char* label; + size_t label_length; + + myencoding_t encoding; + + size_t next; + size_t curr; +}; + +struct myencoding_detect_attr { + size_t key_begin; + size_t key_length; + size_t value_begin; + size_t value_length; + + myencoding_detect_attr_t *next; +}; + +struct myencoding_entry_name_index { + const char *name; + size_t length; +}; + +typedef myencoding_status_t (*myencoding_custom_f)(unsigned const char data, myencoding_result_t *res); + +myencoding_custom_f myencoding_get_function_by_id(myencoding_t idx); + +myencoding_status_t myencoding_decode_utf_8(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_ibm866(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_2(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_3(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_4(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_5(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_6(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_7(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_8(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_8_i(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_10(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_13(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_14(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_15(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_8859_16(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_koi8_r(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_koi8_u(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_macintosh(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_874(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1250(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1251(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1252(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1253(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1254(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1255(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1256(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1257(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_windows_1258(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_x_mac_cyrillic(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_gbk(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_gb18030(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_big5(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_euc_jp(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_iso_2022_jp(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_shift_jis(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_euc_kr(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_shared_utf_16(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_utf_16be(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_utf_16le(unsigned const char data, myencoding_result_t *res); +myencoding_status_t myencoding_decode_x_user_defined(unsigned const char data, myencoding_result_t *res); + +size_t myencoding_codepoint_ascii_length(size_t codepoint); +size_t myencoding_ascii_utf_8_length(const unsigned char data); + +size_t myencoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); +size_t myencoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data); +size_t myencoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); +size_t myencoding_ascii_utf_8_to_codepoint(const unsigned char* data, size_t* codepoint); + +void myencoding_result_clean(myencoding_result_t *res); + +bool myencoding_detect(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_russian(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_unicode(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_bom(const char *text, size_t length, myencoding_t *encoding); +bool myencoding_detect_and_cut_bom(const char *text, size_t length, myencoding_t *encoding, const char **new_text, size_t *new_size); + +size_t myencoding_convert_to_ascii_utf_8(mycore_string_raw_t* raw_str, const char* buff, size_t length, myencoding_t encoding); + +const myencoding_detect_name_entry_t * myencoding_name_entry_by_name(const char* name, size_t length); +bool myencoding_by_name(const char *name, size_t length, myencoding_t *encoding); +const char * myencoding_name_by_id(myencoding_t encoding, size_t *length); + +bool myencoding_extracting_character_encoding_from_charset(const char *data, size_t data_size, myencoding_t *encoding); +myencoding_t myencoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_ENCODING_H */ diff --git a/source/myencoding/myosi.h b/source/myencoding/myosi.h new file mode 100644 index 0000000..6939c44 --- /dev/null +++ b/source/myencoding/myosi.h @@ -0,0 +1,114 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_MYOSI_H +#define MyENCODING_MYOSI_H +#pragma once + +#include "mycore/myosi.h" + +#define MyENCODING_VERSION_MAJOR 0 +#define MyENCODING_VERSION_MINOR 1 +#define MyENCODING_VERSION_PATCH 0 + +#define MyENCODING_VERSION_STRING MyCORE_STR(MyENCODING_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyENCODING_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyENCODING_VERSION_PATCH) + +#ifdef __cplusplus +extern "C" { +#endif + +// encoding +// https://encoding.spec.whatwg.org/#the-encoding +// https://encoding.spec.whatwg.org/#legacy-single-byte-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(simplified)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(traditional)-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-japanese-encodings +// https://encoding.spec.whatwg.org/#legacy-multi-byte-korean-encodings +// https://encoding.spec.whatwg.org/#legacy-miscellaneous-encodings + +enum myencoding_list { + MyENCODING_DEFAULT = 0x00, + //MyENCODING_AUTO = 0x01, // future + MyENCODING_NOT_DETERMINED = 0x02, + MyENCODING_UTF_8 = 0x00, // default encoding + MyENCODING_UTF_16LE = 0x04, + MyENCODING_UTF_16BE = 0x05, + MyENCODING_X_USER_DEFINED = 0x06, + MyENCODING_BIG5 = 0x07, + MyENCODING_EUC_JP = 0x08, + MyENCODING_EUC_KR = 0x09, + MyENCODING_GB18030 = 0x0a, + MyENCODING_GBK = 0x0b, + MyENCODING_IBM866 = 0x0c, + MyENCODING_ISO_2022_JP = 0x0d, + MyENCODING_ISO_8859_10 = 0x0e, + MyENCODING_ISO_8859_13 = 0x0f, + MyENCODING_ISO_8859_14 = 0x10, + MyENCODING_ISO_8859_15 = 0x11, + MyENCODING_ISO_8859_16 = 0x12, + MyENCODING_ISO_8859_2 = 0x13, + MyENCODING_ISO_8859_3 = 0x14, + MyENCODING_ISO_8859_4 = 0x15, + MyENCODING_ISO_8859_5 = 0x16, + MyENCODING_ISO_8859_6 = 0x17, + MyENCODING_ISO_8859_7 = 0x18, + MyENCODING_ISO_8859_8 = 0x19, + MyENCODING_ISO_8859_8_I = 0x1a, + MyENCODING_KOI8_R = 0x1b, + MyENCODING_KOI8_U = 0x1c, + MyENCODING_MACINTOSH = 0x1d, + MyENCODING_SHIFT_JIS = 0x1e, + MyENCODING_WINDOWS_1250 = 0x1f, + MyENCODING_WINDOWS_1251 = 0x20, + MyENCODING_WINDOWS_1252 = 0x21, + MyENCODING_WINDOWS_1253 = 0x22, + MyENCODING_WINDOWS_1254 = 0x23, + MyENCODING_WINDOWS_1255 = 0x24, + MyENCODING_WINDOWS_1256 = 0x25, + MyENCODING_WINDOWS_1257 = 0x26, + MyENCODING_WINDOWS_1258 = 0x27, + MyENCODING_WINDOWS_874 = 0x28, + MyENCODING_X_MAC_CYRILLIC = 0x29, + MyENCODING_LAST_ENTRY = 0x2a +} +typedef myencoding_t; + +enum myencoding_status { + MyENCODING_STATUS_OK = 0x0000, + MyENCODING_STATUS_ERROR = 0x0001, + MyENCODING_STATUS_CONTINUE = 0x0002, + MyENCODING_STATUS_DONE = 0x0004 +} +typedef myencoding_status_t; + +typedef struct myencoding_result myencoding_result_t; +typedef struct myencoding_trigram myencoding_trigram_t; +typedef struct myencoding_trigram_result myencoding_trigram_result_t; +typedef struct myencoding_unicode_result myencoding_unicode_result_t; +typedef struct myencoding_detect_name_entry myencoding_detect_name_entry_t; +typedef struct myencoding_detect_attr myencoding_detect_attr_t; +typedef struct myencoding_entry_name_index myencoding_entry_name_index_t; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_MYOSI_H */ + diff --git a/source/myencoding/mystring.c b/source/myencoding/mystring.c new file mode 100644 index 0000000..6c102a9 --- /dev/null +++ b/source/myencoding/mystring.c @@ -0,0 +1,89 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myencoding/mystring.h" +#include "mycore/utils/resources.h" + +void myencoding_string_append(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding) +{ + myencoding_result_t res; + myencoding_result_clean(&res); + + myencoding_string_append_chunk(str, &res, buff, length, encoding); +} + +void myencoding_string_append_chunk(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding) +{ + unsigned const char* u_buff = (unsigned const char*)buff; + const myencoding_custom_f func = myencoding_get_function_by_id(encoding); + + for (size_t i = 0; i < length; i++) + { + if(func(u_buff[i], res) == MyENCODING_STATUS_OK) { + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 0); + str->length += myencoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + } + } + + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); +} + +void myencoding_string_append_one(mycore_string_t* str, myencoding_result_t* res, const char data, myencoding_t encoding) +{ + const myencoding_custom_f func = myencoding_get_function_by_id(encoding); + + if(func((unsigned const char)data, res) == MyENCODING_STATUS_OK) { + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 0); + str->length += myencoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC('\0', str); + } +} + +void myencoding_string_append_lowercase_ascii(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding) +{ + myencoding_result_t res; + myencoding_result_clean(&res); + + myencoding_string_append_chunk_lowercase_ascii(str, &res, buff, length, encoding); +} + +void myencoding_string_append_chunk_lowercase_ascii(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding) +{ + unsigned const char* u_buff = (unsigned const char*)buff; + const myencoding_custom_f func = myencoding_get_function_by_id(encoding); + + for (size_t i = 0; i < length; i++) + { + if(func(u_buff[i], res) == MyENCODING_STATUS_OK) { + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 1); + + size_t insert_len = myencoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + + if(insert_len == 1) { + str->data[str->length] = (const char)mycore_string_chars_lowercase_map[ u_buff[i] ]; + } + + str->length += insert_len; + } + } + + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); +} diff --git a/source/myencoding/mystring.h b/source/myencoding/mystring.h new file mode 100644 index 0000000..49ce8b6 --- /dev/null +++ b/source/myencoding/mystring.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyENCODING_MYSTRING_H +#define MyENCODING_MYSTRING_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include "myencoding/myosi.h" +#include "myencoding/encoding.h" +#include "mycore/mystring.h" +#include "mycore/utils.h" + +void myencoding_string_append(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding); + +/* append with convert encoding */ +void myencoding_string_append_chunk(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding); +void myencoding_string_append_one(mycore_string_t* str, myencoding_result_t* res, const char data, myencoding_t encoding); + +/* append with convert encoding lowercase */ +void myencoding_string_append_lowercase_ascii(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding); +void myencoding_string_append_chunk_lowercase_ascii(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_MYSTRING_H */ diff --git a/source/myencoding/resource.h b/source/myencoding/resource.h new file mode 100644 index 0000000..12f4a73 --- /dev/null +++ b/source/myencoding/resource.h @@ -0,0 +1,9377 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myencoding/encoding.h" + +#ifndef MyENCODING_RESOURCE_H +#define MyENCODING_RESOURCE_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +static const unsigned long myencoding_map_big5[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 17392, 19506, 17923, 17830, 17784, 160359, 19831, 17843, + 162993, 19682, 163013, 15253, 18230, 18244, 19527, 19520, 148159, 144919, + 160594, 159371, 159954, 19543, 172881, 18255, 17882, 19589, 162924, 19719, + 19108, 18081, 158499, 29221, 154196, 137827, 146950, 147297, 26189, 22267, + 0x0000, 32149, 22813, 166841, 15860, 38708, 162799, 23515, 138590, 23204, + 13861, 171696, 23249, 23479, 23804, 26478, 34195, 170309, 29793, 29853, + 14453, 138579, 145054, 155681, 16108, 153822, 15093, 31484, 40855, 147809, + 166157, 143850, 133770, 143966, 17162, 33924, 40854, 37935, 18736, 34323, + 22678, 38730, 37400, 31184, 31282, 26208, 27177, 34973, 29772, 31685, + 26498, 31276, 21071, 36934, 13542, 29636, 155065, 29894, 40903, 22451, + 18735, 21580, 16689, 145038, 22552, 31346, 162661, 35727, 18094, 159368, + 16769, 155033, 31662, 140476, 40904, 140481, 140489, 140492, 40905, 34052, + 144827, 16564, 40906, 17633, 175615, 25281, 28782, 40907, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12736, + 12737, 12738, 12739, 12740, 131340, 12741, 131281, 131277, 12742, 12743, + 131275, 139240, 12744, 131274, 12745, 12746, 12747, 12748, 131342, 12749, + 12750, 256, 193, 461, 192, 274, 201, 282, 200, 332, + 211, 465, 210, 0x0000, 7870, 0x0000, 7872, 202, 257, 225, + 462, 224, 593, 275, 233, 283, 232, 299, 237, 464, + 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, + 472, 474, 476, 252, 0x0000, 7871, 0x0000, 7873, 234, 609, + 9178, 9179, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 172969, 135493, 0x0000, 25866, + 0x0000, 0x0000, 20029, 28381, 40270, 37343, 0x0000, 0x0000, 161589, 25745, + 20250, 20264, 20392, 20822, 20852, 20892, 20964, 21153, 21160, 21307, + 21326, 21457, 21464, 22242, 22768, 22788, 22791, 22834, 22836, 23398, + 23454, 23455, 23706, 24198, 24635, 25993, 26622, 26628, 26725, 27982, + 28860, 30005, 32420, 32428, 32442, 32455, 32463, 32479, 32518, 32567, + 33402, 33487, 33647, 35270, 35774, 35810, 36710, 36711, 36718, 29713, + 31996, 32205, 26950, 31433, 21031, 0x0000, 0x0000, 0x0000, 0x0000, 37260, + 30904, 37214, 32956, 0x0000, 36107, 33014, 133607, 0x0000, 0x0000, 32927, + 40647, 19661, 40393, 40460, 19518, 171510, 159758, 40458, 172339, 13761, + 0x0000, 28314, 33342, 29977, 0x0000, 18705, 39532, 39567, 40857, 31111, + 164972, 138698, 132560, 142054, 20004, 20097, 20096, 20103, 20159, 20203, + 20279, 13388, 20413, 15944, 20483, 20616, 13437, 13459, 13477, 20870, + 22789, 20955, 20988, 20997, 20105, 21113, 21136, 21287, 13767, 21417, + 13649, 21424, 13651, 21442, 21539, 13677, 13682, 13953, 21651, 21667, + 21684, 21689, 21712, 21743, 21784, 21795, 21800, 13720, 21823, 13733, + 13759, 21975, 13765, 163204, 21797, 0x0000, 134210, 134421, 151851, 21904, + 142534, 14828, 131905, 36422, 150968, 169189, 16467, 164030, 30586, 142392, + 14900, 18389, 164189, 158194, 151018, 25821, 134524, 135092, 134357, 135412, + 25741, 36478, 134806, 134155, 135012, 142505, 164438, 148691, 0x0000, 134470, + 170573, 164073, 18420, 151207, 142530, 39602, 14951, 169460, 16365, 13574, + 152263, 169940, 161992, 142660, 40302, 38933, 0x0000, 17369, 155813, 25780, + 21731, 142668, 142282, 135287, 14843, 135279, 157402, 157462, 162208, 25834, + 151634, 134211, 36456, 139681, 166732, 132913, 0x0000, 18443, 131497, 16378, + 22643, 142733, 0x0000, 148936, 132348, 155799, 134988, 134550, 21881, 16571, + 17338, 0x0000, 19124, 141926, 135325, 33194, 39157, 134556, 25465, 14846, + 141173, 36288, 22177, 25724, 15939, 0x0000, 173569, 134665, 142031, 142537, + 0x0000, 135368, 145858, 14738, 14854, 164507, 13688, 155209, 139463, 22098, + 134961, 142514, 169760, 13500, 27709, 151099, 0x0000, 0x0000, 161140, 142987, + 139784, 173659, 167117, 134778, 134196, 157724, 32659, 135375, 141315, 141625, + 13819, 152035, 134796, 135053, 134826, 16275, 134960, 134471, 135503, 134732, + 0x0000, 134827, 134057, 134472, 135360, 135485, 16377, 140950, 25650, 135085, + 144372, 161337, 142286, 134526, 134527, 142417, 142421, 14872, 134808, 135367, + 134958, 173618, 158544, 167122, 167321, 167114, 38314, 21708, 33476, 21945, + 0x0000, 171715, 39974, 39606, 161630, 142830, 28992, 33133, 33004, 23580, + 157042, 33076, 14231, 21343, 164029, 37302, 134906, 134671, 134775, 134907, + 13789, 151019, 13833, 134358, 22191, 141237, 135369, 134672, 134776, 135288, + 135496, 164359, 136277, 134777, 151120, 142756, 23124, 135197, 135198, 135413, + 135414, 22428, 134673, 161428, 164557, 135093, 134779, 151934, 14083, 135094, + 135552, 152280, 172733, 149978, 137274, 147831, 164476, 22681, 21096, 13850, + 153405, 31666, 23400, 18432, 19244, 40743, 18919, 39967, 39821, 154484, + 143677, 22011, 13810, 22153, 20008, 22786, 138177, 194680, 38737, 131206, + 20059, 20155, 13630, 23587, 24401, 24516, 14586, 25164, 25909, 27514, + 27701, 27706, 28780, 29227, 20012, 29357, 149737, 32594, 31035, 31993, + 32595, 156266, 13505, 0x0000, 156491, 32770, 32896, 157202, 158033, 21341, + 34916, 35265, 161970, 35744, 36125, 38021, 38264, 38271, 38376, 167439, + 38886, 39029, 39118, 39134, 39267, 170000, 40060, 40479, 40644, 27503, + 63751, 20023, 131207, 38429, 25143, 38050, 0x0000, 20539, 28158, 171123, + 40870, 15817, 34959, 147790, 28791, 23797, 19232, 152013, 13657, 154928, + 24866, 166450, 36775, 37366, 29073, 26393, 29626, 144001, 172295, 15499, + 137600, 19216, 30948, 29698, 20910, 165647, 16393, 27235, 172730, 16931, + 34319, 133743, 31274, 170311, 166634, 38741, 28749, 21284, 139390, 37876, + 30425, 166371, 40871, 30685, 20131, 20464, 20668, 20015, 20247, 40872, + 21556, 32139, 22674, 22736, 138678, 24210, 24217, 24514, 141074, 25995, + 144377, 26905, 27203, 146531, 27903, 0x0000, 29184, 148741, 29580, 16091, + 150035, 23317, 29881, 35715, 154788, 153237, 31379, 31724, 31939, 32364, + 33528, 34199, 40873, 34960, 40874, 36537, 40875, 36815, 34143, 39392, + 37409, 40876, 167353, 136255, 16497, 17058, 23066, 0x0000, 0x0000, 0x0000, + 39016, 26475, 17014, 22333, 0x0000, 34262, 149883, 33471, 160013, 19585, + 159092, 23931, 158485, 159678, 40877, 40878, 23446, 40879, 26343, 32347, + 28247, 31178, 15752, 17603, 143958, 141206, 17306, 17718, 0x0000, 23765, + 146202, 35577, 23672, 15634, 144721, 23928, 40882, 29015, 17752, 147692, + 138787, 19575, 14712, 13386, 131492, 158785, 35532, 20404, 131641, 22975, + 33132, 38998, 170234, 24379, 134047, 0x0000, 139713, 166253, 16642, 18107, + 168057, 16135, 40883, 172469, 16632, 14294, 18167, 158790, 16764, 165554, + 160767, 17773, 14548, 152730, 17761, 17691, 19849, 19579, 19830, 17898, + 16328, 150287, 13921, 17630, 17597, 16877, 23870, 23880, 23894, 15868, + 14351, 23972, 23993, 14368, 14392, 24130, 24253, 24357, 24451, 14600, + 14612, 14655, 14669, 24791, 24893, 23781, 14729, 25015, 25017, 25039, + 14776, 25132, 25232, 25317, 25368, 14840, 22193, 14851, 25570, 25595, + 25607, 25690, 14923, 25792, 23829, 22049, 40863, 14999, 25990, 15037, + 26111, 26195, 15090, 26258, 15138, 26390, 15170, 26532, 26624, 15192, + 26698, 26756, 15218, 15217, 15227, 26889, 26947, 29276, 26980, 27039, + 27013, 15292, 27094, 15325, 27237, 27252, 27249, 27266, 15340, 27289, + 15346, 27307, 27317, 27348, 27382, 27521, 27585, 27626, 27765, 27818, + 15563, 27906, 27910, 27942, 28033, 15599, 28068, 28081, 28181, 28184, + 28201, 28294, 166336, 28347, 28386, 28378, 40831, 28392, 28393, 28452, + 28468, 15686, 147265, 28545, 28606, 15722, 15733, 29111, 23705, 15754, + 28716, 15761, 28752, 28756, 28783, 28799, 28809, 131877, 17345, 13809, + 134872, 147159, 22462, 159443, 28990, 153568, 13902, 27042, 166889, 23412, + 31305, 153825, 169177, 31333, 31357, 154028, 31419, 31408, 31426, 31427, + 29137, 156813, 16842, 31450, 31453, 31466, 16879, 21682, 154625, 31499, + 31573, 31529, 152334, 154878, 31650, 31599, 33692, 154548, 158847, 31696, + 33825, 31634, 31672, 154912, 15789, 154725, 33938, 31738, 31750, 31797, + 154817, 31812, 31875, 149634, 31910, 26237, 148856, 31945, 31943, 31974, + 31860, 31987, 31989, 31950, 32359, 17693, 159300, 32093, 159446, 29837, + 32137, 32171, 28981, 32179, 32210, 147543, 155689, 32228, 15635, 32245, + 137209, 32229, 164717, 32285, 155937, 155994, 32366, 32402, 17195, 37996, + 32295, 32576, 32577, 32583, 31030, 156368, 39393, 32663, 156497, 32675, + 136801, 131176, 17756, 145254, 17667, 164666, 32762, 156809, 32773, 32776, + 32797, 32808, 32815, 172167, 158915, 32827, 32828, 32865, 141076, 18825, + 157222, 146915, 157416, 26405, 32935, 166472, 33031, 33050, 22704, 141046, + 27775, 156824, 151480, 25831, 136330, 33304, 137310, 27219, 150117, 150165, + 17530, 33321, 133901, 158290, 146814, 20473, 136445, 34018, 33634, 158474, + 149927, 144688, 137075, 146936, 33450, 26907, 194964, 16859, 34123, 33488, + 33562, 134678, 137140, 14017, 143741, 144730, 33403, 33506, 33560, 147083, + 159139, 158469, 158615, 144846, 15807, 33565, 21996, 33669, 17675, 159141, + 33708, 33729, 33747, 13438, 159444, 27223, 34138, 13462, 159298, 143087, + 33880, 154596, 33905, 15827, 17636, 27303, 33866, 146613, 31064, 33960, + 158614, 159351, 159299, 34014, 33807, 33681, 17568, 33939, 34020, 154769, + 16960, 154816, 17731, 34100, 23282, 159385, 17703, 34163, 17686, 26559, + 34326, 165413, 165435, 34241, 159880, 34306, 136578, 159949, 194994, 17770, + 34344, 13896, 137378, 21495, 160666, 34430, 34673, 172280, 34798, 142375, + 34737, 34778, 34831, 22113, 34412, 26710, 17935, 34885, 34886, 161248, + 146873, 161252, 34910, 34972, 18011, 34996, 34997, 25537, 35013, 30583, + 161551, 35207, 35210, 35238, 35241, 35239, 35260, 166437, 35303, 162084, + 162493, 35484, 30611, 37374, 35472, 162393, 31465, 162618, 147343, 18195, + 162616, 29052, 35596, 35615, 152624, 152933, 35647, 35660, 35661, 35497, + 150138, 35728, 35739, 35503, 136927, 17941, 34895, 35995, 163156, 163215, + 195028, 14117, 163155, 36054, 163224, 163261, 36114, 36099, 137488, 36059, + 28764, 36113, 150729, 16080, 36215, 36265, 163842, 135188, 149898, 15228, + 164284, 160012, 31463, 36525, 36534, 36547, 37588, 36633, 36653, 164709, + 164882, 36773, 37635, 172703, 133712, 36787, 18730, 166366, 165181, 146875, + 24312, 143970, 36857, 172052, 165564, 165121, 140069, 14720, 159447, 36919, + 165180, 162494, 36961, 165228, 165387, 37032, 165651, 37060, 165606, 37038, + 37117, 37223, 15088, 37289, 37316, 31916, 166195, 138889, 37390, 27807, + 37441, 37474, 153017, 37561, 166598, 146587, 166668, 153051, 134449, 37676, + 37739, 166625, 166891, 28815, 23235, 166626, 166629, 18789, 37444, 166892, + 166969, 166911, 37747, 37979, 36540, 38277, 38310, 37926, 38304, 28662, + 17081, 140922, 165592, 135804, 146990, 18911, 27676, 38523, 38550, 16748, + 38563, 159445, 25050, 38582, 30965, 166624, 38589, 21452, 18849, 158904, + 131700, 156688, 168111, 168165, 150225, 137493, 144138, 38705, 34370, 38710, + 18959, 17725, 17797, 150249, 28789, 23361, 38683, 38748, 168405, 38743, + 23370, 168427, 38751, 37925, 20688, 143543, 143548, 38793, 38815, 38833, + 38846, 38848, 38866, 38880, 152684, 38894, 29724, 169011, 38911, 38901, + 168989, 162170, 19153, 38964, 38963, 38987, 39014, 15118, 160117, 15697, + 132656, 147804, 153350, 39114, 39095, 39112, 39111, 19199, 159015, 136915, + 21936, 39137, 39142, 39148, 37752, 39225, 150057, 19314, 170071, 170245, + 39413, 39436, 39483, 39440, 39512, 153381, 14020, 168113, 170965, 39648, + 39650, 170757, 39668, 19470, 39700, 39725, 165376, 20532, 39732, 158120, + 14531, 143485, 39760, 39744, 171326, 23109, 137315, 39822, 148043, 39938, + 39935, 39948, 171624, 40404, 171959, 172434, 172459, 172257, 172323, 172511, + 40318, 40323, 172340, 40462, 26760, 40388, 139611, 172435, 172576, 137531, + 172595, 40249, 172217, 172724, 40592, 40597, 40606, 40610, 19764, 40618, + 40623, 148324, 40641, 15200, 14821, 15645, 20274, 14270, 166955, 40706, + 40712, 19350, 37924, 159138, 40727, 40726, 40761, 22175, 22154, 40773, + 39352, 168075, 38898, 33919, 40802, 40809, 31452, 40846, 29206, 19390, + 149877, 149947, 29047, 150008, 148296, 150097, 29598, 166874, 137466, 31135, + 166270, 167478, 37737, 37875, 166468, 37612, 37761, 37835, 166252, 148665, + 29207, 16107, 30578, 31299, 28880, 148595, 148472, 29054, 137199, 28835, + 137406, 144793, 16071, 137349, 152623, 137208, 14114, 136955, 137273, 14049, + 137076, 137425, 155467, 14115, 136896, 22363, 150053, 136190, 135848, 136134, + 136374, 34051, 145062, 34051, 33877, 149908, 160101, 146993, 152924, 147195, + 159826, 17652, 145134, 170397, 159526, 26617, 14131, 15381, 15847, 22636, + 137506, 26640, 16471, 145215, 147681, 147595, 147727, 158753, 21707, 22174, + 157361, 22162, 135135, 134056, 134669, 37830, 166675, 37788, 20216, 20779, + 14361, 148534, 20156, 132197, 131967, 20299, 20362, 153169, 23144, 131499, + 132043, 14745, 131850, 132116, 13365, 20265, 131776, 167603, 131701, 35546, + 131596, 20120, 20685, 20749, 20386, 20227, 150030, 147082, 20290, 20526, + 20588, 20609, 20428, 20453, 20568, 20732, 20825, 20827, 20829, 20830, + 28278, 144789, 147001, 147135, 28018, 137348, 147081, 20904, 20931, 132576, + 17629, 132259, 132242, 132241, 36218, 166556, 132878, 21081, 21156, 133235, + 21217, 37742, 18042, 29068, 148364, 134176, 149932, 135396, 27089, 134685, + 29817, 16094, 29849, 29716, 29782, 29592, 19342, 150204, 147597, 21456, + 13700, 29199, 147657, 21940, 131909, 21709, 134086, 22301, 37469, 38644, + 37734, 22493, 22413, 22399, 13886, 22731, 23193, 166470, 136954, 137071, + 136976, 23084, 22968, 37519, 23166, 23247, 23058, 153926, 137715, 137313, + 148117, 14069, 27909, 29763, 23073, 155267, 23169, 166871, 132115, 37856, + 29836, 135939, 28933, 18802, 37896, 166395, 37821, 14240, 23582, 23710, + 24158, 24136, 137622, 137596, 146158, 24269, 23375, 137475, 137476, 14081, + 137376, 14045, 136958, 14035, 33066, 166471, 138682, 144498, 166312, 24332, + 24334, 137511, 137131, 23147, 137019, 23364, 34324, 161277, 34912, 24702, + 141408, 140843, 24539, 16056, 140719, 140734, 168072, 159603, 25024, 131134, + 131142, 140827, 24985, 24984, 24693, 142491, 142599, 149204, 168269, 25713, + 149093, 142186, 14889, 142114, 144464, 170218, 142968, 25399, 173147, 25782, + 25393, 25553, 149987, 142695, 25252, 142497, 25659, 25963, 26994, 15348, + 143502, 144045, 149897, 144043, 21773, 144096, 137433, 169023, 26318, 144009, + 143795, 15072, 16784, 152964, 166690, 152975, 136956, 152923, 152613, 30958, + 143619, 137258, 143924, 13412, 143887, 143746, 148169, 26254, 159012, 26219, + 19347, 26160, 161904, 138731, 26211, 144082, 144097, 26142, 153714, 14545, + 145466, 145340, 15257, 145314, 144382, 29904, 15254, 26511, 149034, 26806, + 26654, 15300, 27326, 14435, 145365, 148615, 27187, 27218, 27337, 27397, + 137490, 25873, 26776, 27212, 15319, 27258, 27479, 147392, 146586, 37792, + 37618, 166890, 166603, 37513, 163870, 166364, 37991, 28069, 28427, 149996, + 28007, 147327, 15759, 28164, 147516, 23101, 28170, 22599, 27940, 30786, + 28987, 148250, 148086, 28913, 29264, 29319, 29332, 149391, 149285, 20857, + 150180, 132587, 29818, 147192, 144991, 150090, 149783, 155617, 16134, 16049, + 150239, 166947, 147253, 24743, 16115, 29900, 29756, 37767, 29751, 17567, + 159210, 17745, 30083, 16227, 150745, 150790, 16216, 30037, 30323, 173510, + 15129, 29800, 166604, 149931, 149902, 15099, 15821, 150094, 16127, 149957, + 149747, 37370, 22322, 37698, 166627, 137316, 20703, 152097, 152039, 30584, + 143922, 30478, 30479, 30587, 149143, 145281, 14942, 149744, 29752, 29851, + 16063, 150202, 150215, 16584, 150166, 156078, 37639, 152961, 30750, 30861, + 30856, 30930, 29648, 31065, 161601, 153315, 16654, 31131, 33942, 31141, + 27181, 147194, 31290, 31220, 16750, 136934, 16690, 37429, 31217, 134476, + 149900, 131737, 146874, 137070, 13719, 21867, 13680, 13994, 131540, 134157, + 31458, 23129, 141045, 154287, 154268, 23053, 131675, 30960, 23082, 154566, + 31486, 16889, 31837, 31853, 16913, 154547, 155324, 155302, 31949, 150009, + 137136, 31886, 31868, 31918, 27314, 32220, 32263, 32211, 32590, 156257, + 155996, 162632, 32151, 155266, 17002, 158581, 133398, 26582, 131150, 144847, + 22468, 156690, 156664, 149858, 32733, 31527, 133164, 154345, 154947, 31500, + 155150, 39398, 34373, 39523, 27164, 144447, 14818, 150007, 157101, 39455, + 157088, 33920, 160039, 158929, 17642, 33079, 17410, 32966, 33033, 33090, + 157620, 39107, 158274, 33378, 33381, 158289, 33875, 159143, 34320, 160283, + 23174, 16767, 137280, 23339, 137377, 23268, 137432, 34464, 195004, 146831, + 34861, 160802, 23042, 34926, 20293, 34951, 35007, 35046, 35173, 35149, + 153219, 35156, 161669, 161668, 166901, 166873, 166812, 166393, 16045, 33955, + 18165, 18127, 14322, 35389, 35356, 169032, 24397, 37419, 148100, 26068, + 28969, 28868, 137285, 40301, 35999, 36073, 163292, 22938, 30659, 23024, + 17262, 14036, 36394, 36519, 150537, 36656, 36682, 17140, 27736, 28603, + 140065, 18587, 28537, 28299, 137178, 39913, 14005, 149807, 37051, 37015, + 21873, 18694, 37307, 37892, 166475, 16482, 166652, 37927, 166941, 166971, + 34021, 35371, 38297, 38311, 38295, 38294, 167220, 29765, 16066, 149759, + 150082, 148458, 16103, 143909, 38543, 167655, 167526, 167525, 16076, 149997, + 150136, 147438, 29714, 29803, 16124, 38721, 168112, 26695, 18973, 168083, + 153567, 38749, 37736, 166281, 166950, 166703, 156606, 37562, 23313, 35689, + 18748, 29689, 147995, 38811, 38769, 39224, 134950, 24001, 166853, 150194, + 38943, 169178, 37622, 169431, 37349, 17600, 166736, 150119, 166756, 39132, + 166469, 16128, 37418, 18725, 33812, 39227, 39245, 162566, 15869, 39323, + 19311, 39338, 39516, 166757, 153800, 27279, 39457, 23294, 39471, 170225, + 19344, 170312, 39356, 19389, 19351, 37757, 22642, 135938, 22562, 149944, + 136424, 30788, 141087, 146872, 26821, 15741, 37976, 14631, 24912, 141185, + 141675, 24839, 40015, 40019, 40059, 39989, 39952, 39807, 39887, 171565, + 39839, 172533, 172286, 40225, 19630, 147716, 40472, 19632, 40204, 172468, + 172269, 172275, 170287, 40357, 33981, 159250, 159711, 158594, 34300, 17715, + 159140, 159364, 159216, 33824, 34286, 159232, 145367, 155748, 31202, 144796, + 144960, 18733, 149982, 15714, 37851, 37566, 37704, 131775, 30905, 37495, + 37965, 20452, 13376, 36964, 152925, 30781, 30804, 30902, 30795, 137047, + 143817, 149825, 13978, 20338, 28634, 28633, 28702, 28702, 21524, 147893, + 22459, 22771, 22410, 40214, 22487, 28980, 13487, 147884, 29163, 158784, + 151447, 23336, 137141, 166473, 24844, 23246, 23051, 17084, 148616, 14124, + 19323, 166396, 37819, 37816, 137430, 134941, 33906, 158912, 136211, 148218, + 142374, 148417, 22932, 146871, 157505, 32168, 155995, 155812, 149945, 149899, + 166394, 37605, 29666, 16105, 29876, 166755, 137375, 16097, 150195, 27352, + 29683, 29691, 16086, 150078, 150164, 137177, 150118, 132007, 136228, 149989, + 29768, 149782, 28837, 149878, 37508, 29670, 37727, 132350, 37681, 166606, + 166422, 37766, 166887, 153045, 18741, 166530, 29035, 149827, 134399, 22180, + 132634, 134123, 134328, 21762, 31172, 137210, 32254, 136898, 150096, 137298, + 17710, 37889, 14090, 166592, 149933, 22960, 137407, 137347, 160900, 23201, + 14050, 146779, 14000, 37471, 23161, 166529, 137314, 37748, 15565, 133812, + 19094, 14730, 20724, 15721, 15692, 136092, 29045, 17147, 164376, 28175, + 168164, 17643, 27991, 163407, 28775, 27823, 15574, 147437, 146989, 28162, + 28428, 15727, 132085, 30033, 14012, 13512, 18048, 16090, 18545, 22980, + 37486, 18750, 36673, 166940, 158656, 22546, 22472, 14038, 136274, 28926, + 148322, 150129, 143331, 135856, 140221, 26809, 26983, 136088, 144613, 162804, + 145119, 166531, 145366, 144378, 150687, 27162, 145069, 158903, 33854, 17631, + 17614, 159014, 159057, 158850, 159710, 28439, 160009, 33597, 137018, 33773, + 158848, 159827, 137179, 22921, 23170, 137139, 23137, 23153, 137477, 147964, + 14125, 23023, 137020, 14023, 29070, 37776, 26266, 148133, 23150, 23083, + 148115, 27179, 147193, 161590, 148571, 148170, 28957, 148057, 166369, 20400, + 159016, 23746, 148686, 163405, 148413, 27148, 148054, 135940, 28838, 28979, + 148457, 15781, 27871, 194597, 150095, 32357, 23019, 23855, 15859, 24412, + 150109, 137183, 32164, 33830, 21637, 146170, 144128, 131604, 22398, 133333, + 132633, 16357, 139166, 172726, 28675, 168283, 23920, 29583, 31955, 166489, + 168992, 20424, 32743, 29389, 29456, 162548, 29496, 29497, 153334, 29505, + 29512, 16041, 162584, 36972, 29173, 149746, 29665, 33270, 16074, 30476, + 16081, 27810, 22269, 29721, 29726, 29727, 16098, 16112, 16116, 16122, + 29907, 16142, 16211, 30018, 30061, 30066, 30093, 16252, 30152, 30172, + 16320, 30285, 16343, 30324, 16348, 30330, 151388, 29064, 22051, 35200, + 22633, 16413, 30531, 16441, 26465, 16453, 13787, 30616, 16490, 16495, + 23646, 30654, 30667, 22770, 30744, 28857, 30748, 16552, 30777, 30791, + 30801, 30822, 33864, 152885, 31027, 26627, 31026, 16643, 16649, 31121, + 31129, 36795, 31238, 36796, 16743, 31377, 16818, 31420, 33401, 16836, + 31439, 31451, 16847, 20001, 31586, 31596, 31611, 31762, 31771, 16992, + 17018, 31867, 31900, 17036, 31928, 17044, 31981, 36755, 28864, 134351, + 32207, 32212, 32208, 32253, 32686, 32692, 29343, 17303, 32800, 32805, + 31545, 32814, 32817, 32852, 15820, 22452, 28832, 32951, 33001, 17389, + 33036, 29482, 33038, 33042, 30048, 33044, 17409, 15161, 33110, 33113, + 33114, 17427, 22586, 33148, 33156, 17445, 33171, 17453, 33189, 22511, + 33217, 33252, 33364, 17551, 33446, 33398, 33482, 33496, 33535, 17584, + 33623, 38505, 27018, 33797, 28917, 33892, 24803, 33928, 17668, 33982, + 34017, 34040, 34064, 34104, 34130, 17723, 34159, 34160, 34272, 17783, + 34418, 34450, 34482, 34543, 38469, 34699, 17926, 17943, 34990, 35071, + 35108, 35143, 35217, 162151, 35369, 35384, 35476, 35508, 35921, 36052, + 36082, 36124, 18328, 22623, 36291, 18413, 20206, 36410, 21976, 22356, + 36465, 22005, 36528, 18487, 36558, 36578, 36580, 36589, 36594, 36791, + 36801, 36810, 36812, 36915, 39364, 18605, 39136, 37395, 18718, 37416, + 37464, 37483, 37553, 37550, 37567, 37603, 37611, 37619, 37620, 37629, + 37699, 37764, 37805, 18757, 18769, 40639, 37911, 21249, 37917, 37933, + 37950, 18794, 37972, 38009, 38189, 38306, 18855, 38388, 38451, 18917, + 26528, 18980, 38720, 18997, 38834, 38850, 22100, 19172, 24808, 39097, + 19225, 39153, 22596, 39182, 39193, 20916, 39196, 39223, 39234, 39261, + 39266, 19312, 39365, 19357, 39484, 39695, 31363, 39785, 39809, 39901, + 39921, 39924, 19565, 39968, 14191, 138178, 40265, 39994, 40702, 22096, + 40339, 40381, 40384, 40444, 38134, 36790, 40571, 40620, 40625, 40637, + 40646, 38108, 40674, 40689, 40696, 31432, 40772, 131220, 131767, 132000, + 26906, 38083, 22956, 132311, 22592, 38081, 14265, 132565, 132629, 132726, + 136890, 22359, 29043, 133826, 133837, 134079, 21610, 194619, 134091, 21662, + 134139, 134203, 134227, 134245, 134268, 24807, 134285, 22138, 134325, 134365, + 134381, 134511, 134578, 134600, 26965, 39983, 34725, 134660, 134670, 134871, + 135056, 134957, 134771, 23584, 135100, 24075, 135260, 135247, 135286, 26398, + 135291, 135304, 135318, 13895, 135359, 135379, 135471, 135483, 21348, 33965, + 135907, 136053, 135990, 35713, 136567, 136729, 137155, 137159, 20088, 28859, + 137261, 137578, 137773, 137797, 138282, 138352, 138412, 138952, 25283, 138965, + 139029, 29080, 26709, 139333, 27113, 14024, 139900, 140247, 140282, 141098, + 141425, 141647, 33533, 141671, 141715, 142037, 35237, 142056, 36768, 142094, + 38840, 142143, 38983, 39613, 142412, 0x0000, 142472, 142519, 154600, 142600, + 142610, 142775, 142741, 142914, 143220, 143308, 143411, 143462, 144159, 144350, + 24497, 26184, 26303, 162425, 144743, 144883, 29185, 149946, 30679, 144922, + 145174, 32391, 131910, 22709, 26382, 26904, 146087, 161367, 155618, 146961, + 147129, 161278, 139418, 18640, 19128, 147737, 166554, 148206, 148237, 147515, + 148276, 148374, 150085, 132554, 20946, 132625, 22943, 138920, 15294, 146687, + 148484, 148694, 22408, 149108, 14747, 149295, 165352, 170441, 14178, 139715, + 35678, 166734, 39382, 149522, 149755, 150037, 29193, 150208, 134264, 22885, + 151205, 151430, 132985, 36570, 151596, 21135, 22335, 29041, 152217, 152601, + 147274, 150183, 21948, 152646, 152686, 158546, 37332, 13427, 152895, 161330, + 152926, 18200, 152930, 152934, 153543, 149823, 153693, 20582, 13563, 144332, + 24798, 153859, 18300, 166216, 154286, 154505, 154630, 138640, 22433, 29009, + 28598, 155906, 162834, 36950, 156082, 151450, 35682, 156674, 156746, 23899, + 158711, 36662, 156804, 137500, 35562, 150006, 156808, 147439, 156946, 19392, + 157119, 157365, 141083, 37989, 153569, 24981, 23079, 194765, 20411, 22201, + 148769, 157436, 20074, 149812, 38486, 28047, 158909, 13848, 35191, 157593, + 157806, 156689, 157790, 29151, 157895, 31554, 168128, 133649, 157990, 37124, + 158009, 31301, 40432, 158202, 39462, 158253, 13919, 156777, 131105, 31107, + 158260, 158555, 23852, 144665, 33743, 158621, 18128, 158884, 30011, 34917, + 159150, 22710, 14108, 140685, 159819, 160205, 15444, 160384, 160389, 37505, + 139642, 160395, 37680, 160486, 149968, 27705, 38047, 160848, 134904, 34855, + 35061, 141606, 164979, 137137, 28344, 150058, 137248, 14756, 14009, 23568, + 31203, 17727, 26294, 171181, 170148, 35139, 161740, 161880, 22230, 16607, + 136714, 14753, 145199, 164072, 136133, 29101, 33638, 162269, 168360, 23143, + 19639, 159919, 166315, 162301, 162314, 162571, 163174, 147834, 31555, 31102, + 163849, 28597, 172767, 27139, 164632, 21410, 159239, 37823, 26678, 38749, + 164207, 163875, 158133, 136173, 143919, 163912, 23941, 166960, 163971, 22293, + 38947, 166217, 23979, 149896, 26046, 27093, 21458, 150181, 147329, 15377, + 26422, 163984, 164084, 164142, 139169, 164175, 164233, 164271, 164378, 164614, + 164655, 164746, 13770, 164968, 165546, 18682, 25574, 166230, 30728, 37461, + 166328, 17394, 166375, 17375, 166376, 166726, 166868, 23032, 166921, 36619, + 167877, 168172, 31569, 168208, 168252, 15863, 168286, 150218, 36816, 29327, + 22155, 169191, 169449, 169392, 169400, 169778, 170193, 170313, 170346, 170435, + 170536, 170766, 171354, 171419, 32415, 171768, 171811, 19620, 38215, 172691, + 29090, 172799, 19857, 36882, 173515, 19868, 134300, 36798, 21953, 36794, + 140464, 36793, 150163, 17673, 32383, 28502, 27313, 20202, 13540, 166700, + 161949, 14138, 36480, 137205, 163876, 166764, 166809, 162366, 157359, 15851, + 161365, 146615, 153141, 153942, 20122, 155265, 156248, 22207, 134765, 36366, + 23405, 147080, 150686, 25566, 25296, 137206, 137339, 25904, 22061, 154698, + 21530, 152337, 15814, 171416, 19581, 22050, 22046, 32585, 155352, 22901, + 146752, 34672, 19996, 135146, 134473, 145082, 33047, 40286, 36120, 30267, + 40005, 30286, 30649, 37701, 21554, 33096, 33527, 22053, 33074, 33816, + 32957, 21994, 31074, 22083, 21526, 134813, 13774, 22021, 22001, 26353, + 164578, 13869, 30004, 22000, 21946, 21655, 21874, 134209, 134294, 24272, + 151880, 134774, 142434, 134818, 40619, 32090, 21982, 135285, 25245, 38765, + 21652, 36045, 29174, 37238, 25596, 25529, 25598, 21865, 142147, 40050, + 143027, 20890, 13535, 134567, 20903, 21581, 21790, 21779, 30310, 36397, + 157834, 30129, 32950, 34820, 34694, 35015, 33206, 33820, 135361, 17644, + 29444, 149254, 23440, 33547, 157843, 22139, 141044, 163119, 147875, 163187, + 159440, 160438, 37232, 135641, 37384, 146684, 173737, 134828, 134905, 29286, + 138402, 18254, 151490, 163833, 135147, 16634, 40029, 25887, 142752, 18675, + 149472, 171388, 135148, 134666, 24674, 161187, 135149, 0x0000, 155720, 135559, + 29091, 32398, 40272, 19994, 19972, 13687, 23309, 27826, 21351, 13996, + 14812, 21373, 13989, 149016, 22682, 150382, 33325, 21579, 22442, 154261, + 133497, 0x0000, 14930, 140389, 29556, 171692, 19721, 39917, 146686, 171824, + 19547, 151465, 169374, 171998, 33884, 146870, 160434, 157619, 145184, 25390, + 32037, 147191, 146988, 14890, 36872, 21196, 15988, 13946, 17897, 132238, + 30272, 23280, 134838, 30842, 163630, 22695, 16575, 22140, 39819, 23924, + 30292, 173108, 40581, 19681, 30201, 14331, 24857, 143578, 148466, 0x0000, + 22109, 135849, 22439, 149859, 171526, 21044, 159918, 13741, 27722, 40316, + 31830, 39737, 22494, 137068, 23635, 25811, 169168, 156469, 160100, 34477, + 134440, 159010, 150242, 134513, 0x0000, 20990, 139023, 23950, 38659, 138705, + 40577, 36940, 31519, 39682, 23761, 31651, 25192, 25397, 39679, 31695, + 39722, 31870, 39726, 31810, 31878, 39957, 31740, 39689, 40727, 39963, + 149822, 40794, 21875, 23491, 20477, 40600, 20466, 21088, 15878, 21201, + 22375, 20566, 22967, 24082, 38856, 40363, 36700, 21609, 38836, 39232, + 38842, 21292, 24880, 26924, 21466, 39946, 40194, 19515, 38465, 27008, + 20646, 30022, 137069, 39386, 21107, 0x0000, 37209, 38529, 37212, 0x0000, + 37201, 167575, 25471, 159011, 27338, 22033, 37262, 30074, 25221, 132092, + 29519, 31856, 154657, 146685, 0x0000, 149785, 30422, 39837, 20010, 134356, + 33726, 34882, 0x0000, 23626, 27072, 20717, 22394, 21023, 24053, 20174, + 27697, 131570, 20281, 21660, 21722, 21146, 36226, 13822, 24332, 13811, + 0x0000, 27474, 37244, 40869, 39831, 38958, 39092, 39610, 40616, 40580, + 29050, 31508, 0x0000, 27642, 34840, 32632, 0x0000, 22048, 173642, 36471, + 40787, 0x0000, 36308, 36431, 40476, 36353, 25218, 164733, 36392, 36469, + 31443, 150135, 31294, 30936, 27882, 35431, 30215, 166490, 40742, 27854, + 34774, 30147, 172722, 30803, 194624, 36108, 29410, 29553, 35629, 29442, + 29937, 36075, 150203, 34351, 24506, 34976, 17591, 0x0000, 137275, 159237, + 0x0000, 35454, 140571, 0x0000, 24829, 30311, 39639, 40260, 37742, 39823, + 34805, 0x0000, 34831, 36087, 29484, 38689, 39856, 13782, 29362, 19463, + 31825, 39242, 155993, 24921, 19460, 40598, 24957, 0x0000, 22367, 24943, + 25254, 25145, 25294, 14940, 25058, 21418, 144373, 25444, 26626, 13778, + 23895, 166850, 36826, 167481, 0x0000, 20697, 138566, 30982, 21298, 38456, + 134971, 16485, 0x0000, 30718, 0x0000, 31938, 155418, 31962, 31277, 32870, + 32867, 32077, 29957, 29938, 35220, 33306, 26380, 32866, 160902, 32859, + 29936, 33027, 30500, 35209, 157644, 30035, 159441, 34729, 34766, 33224, + 34700, 35401, 36013, 35651, 30507, 29944, 34010, 13877, 27058, 36262, + 0x0000, 35241, 29800, 28089, 34753, 147473, 29927, 15835, 29046, 24740, + 24988, 15569, 29026, 24695, 0x0000, 32625, 166701, 29264, 24809, 19326, + 21024, 15384, 146631, 155351, 161366, 152881, 137540, 135934, 170243, 159196, + 159917, 23745, 156077, 166415, 145015, 131310, 157766, 151310, 17762, 23327, + 156492, 40784, 40614, 156267, 12288, 65292, 12289, 12290, 65294, 8231, + 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65105, 65106, + 183, 65108, 65109, 65110, 65111, 65372, 8211, 65073, 8212, 65075, + 9588, 65076, 65103, 65288, 65289, 65077, 65078, 65371, 65373, 65079, + 65080, 12308, 12309, 65081, 65082, 12304, 12305, 65083, 65084, 12298, + 12299, 65085, 65086, 12296, 12297, 65087, 65088, 12300, 12301, 65089, + 65090, 12302, 12303, 65091, 65092, 65113, 65114, 65115, 65116, 65117, + 65118, 8216, 8217, 8220, 8221, 12317, 12318, 8245, 8242, 65283, + 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, + 9734, 9733, 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, + 175, 65507, 65343, 717, 65097, 65098, 65101, 65102, 65099, 65100, + 65119, 65120, 65121, 65291, 65293, 215, 247, 177, 8730, 65308, + 65310, 65309, 8806, 8807, 8800, 8734, 8786, 8801, 65122, 65123, + 65124, 65125, 65126, 65374, 8745, 8746, 8869, 8736, 8735, 8895, + 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 8853, 8857, + 8593, 8595, 8592, 8594, 8598, 8599, 8601, 8600, 8741, 8739, + 65295, 65340, 8725, 65128, 65284, 65509, 12306, 65504, 65505, 65285, + 65312, 8451, 8457, 65129, 65130, 65131, 13269, 13212, 13213, 13214, + 13262, 13217, 13198, 13199, 13252, 176, 20825, 20827, 20830, 20829, + 20833, 20835, 21991, 29929, 31950, 9601, 9602, 9603, 9604, 9605, + 9606, 9607, 9608, 9615, 9614, 9613, 9612, 9611, 9610, 9609, + 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, + 9488, 9492, 9496, 9581, 9582, 9584, 9583, 9552, 9566, 9578, + 9569, 9698, 9699, 9701, 9700, 9585, 9586, 9587, 65296, 65297, + 65298, 65299, 65300, 65301, 65302, 65303, 65304, 65305, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 12321, 12322, + 12323, 12324, 12325, 12326, 12327, 12328, 12329, 21313, 21316, 21317, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 65345, 65346, 65347, 65348, + 65349, 65350, 65351, 65352, 65353, 65354, 65355, 65356, 65357, 65358, + 65359, 65360, 65361, 65362, 65363, 65364, 65365, 65366, 65367, 65368, + 65369, 65370, 913, 914, 915, 916, 917, 918, 919, 920, + 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, + 932, 933, 934, 935, 936, 937, 945, 946, 947, 948, + 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, + 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, + 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, + 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, + 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, + 12579, 12580, 12581, 12582, 12583, 12584, 12585, 729, 713, 714, + 711, 715, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223, + 9224, 9225, 9226, 9227, 9228, 9229, 9230, 9231, 9232, 9233, + 9234, 9235, 9236, 9237, 9238, 9239, 9240, 9241, 9242, 9243, + 9244, 9245, 9246, 9247, 9249, 8364, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 19968, 20057, 19969, 19971, 20035, + 20061, 20102, 20108, 20154, 20799, 20837, 20843, 20960, 20992, 20993, + 21147, 21269, 21313, 21340, 21448, 19977, 19979, 19976, 19978, 20011, + 20024, 20961, 20037, 20040, 20063, 20062, 20110, 20129, 20800, 20995, + 21242, 21315, 21449, 21475, 22303, 22763, 22805, 22823, 22899, 23376, + 23377, 23379, 23544, 23567, 23586, 23608, 23665, 24029, 24037, 24049, + 24050, 24051, 24062, 24178, 24318, 24331, 24339, 25165, 19985, 19984, + 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, 20117, 20114, + 20116, 20130, 20161, 20160, 20163, 20166, 20167, 20173, 20170, 20171, + 20164, 20803, 20801, 20839, 20845, 20846, 20844, 20887, 20982, 20998, + 20999, 21000, 21243, 21246, 21247, 21270, 21305, 21320, 21319, 21317, + 21342, 21380, 21451, 21450, 21453, 22764, 22825, 22827, 22826, 22829, + 23380, 23569, 23588, 23610, 23663, 24052, 24187, 24319, 24340, 24341, + 24515, 25096, 25142, 25163, 25166, 25903, 25991, 26007, 26020, 26041, + 26085, 26352, 26376, 26408, 27424, 27490, 27513, 27595, 27604, 27611, + 27663, 27700, 28779, 29226, 29238, 29243, 29255, 29273, 29275, 29356, + 29579, 19993, 19990, 19989, 19988, 19992, 20027, 20045, 20047, 20046, + 20197, 20184, 20180, 20181, 20182, 20183, 20195, 20196, 20185, 20190, + 20805, 20804, 20873, 20874, 20908, 20985, 20986, 20984, 21002, 21152, + 21151, 21253, 21254, 21271, 21277, 20191, 21322, 21321, 21345, 21344, + 21359, 21358, 21435, 21487, 21476, 21491, 21484, 21486, 21481, 21480, + 21500, 21496, 21493, 21483, 21478, 21482, 21490, 21489, 21488, 21477, + 21485, 21499, 22235, 22234, 22806, 22830, 22833, 22900, 22902, 23381, + 23427, 23612, 24040, 24039, 24038, 24066, 24067, 24179, 24188, 24321, + 24344, 24343, 24517, 25098, 25171, 25172, 25170, 25169, 26021, 26086, + 26414, 26412, 26410, 26411, 26413, 27491, 27597, 27665, 27664, 27704, + 27713, 27712, 27710, 29359, 29572, 29577, 29916, 29926, 29976, 29983, + 29992, 29993, 30000, 30001, 30002, 30003, 30091, 30333, 30382, 30399, + 30446, 30683, 30690, 30707, 31034, 31166, 31348, 31435, 19998, 19999, + 20050, 20051, 20073, 20121, 20132, 20134, 20133, 20223, 20233, 20249, + 20234, 20245, 20237, 20240, 20241, 20239, 20210, 20214, 20219, 20208, + 20211, 20221, 20225, 20235, 20809, 20807, 20806, 20808, 20840, 20849, + 20877, 20912, 21015, 21009, 21010, 21006, 21014, 21155, 21256, 21281, + 21280, 21360, 21361, 21513, 21519, 21516, 21514, 21520, 21505, 21515, + 21508, 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, + 22237, 22323, 22320, 22312, 22317, 22316, 22319, 22313, 22809, 22810, + 22839, 22840, 22916, 22904, 22915, 22909, 22905, 22914, 22913, 23383, + 23384, 23431, 23432, 23429, 23433, 23546, 23574, 23673, 24030, 24070, + 24182, 24180, 24335, 24347, 24537, 24534, 25102, 25100, 25101, 25104, + 25187, 25179, 25176, 25910, 26089, 26088, 26092, 26093, 26354, 26355, + 26377, 26429, 26420, 26417, 26421, 27425, 27492, 27515, 27670, 27741, + 27735, 27737, 27743, 27744, 27728, 27733, 27745, 27739, 27725, 27726, + 28784, 29279, 29277, 30334, 31481, 31859, 31992, 32566, 32650, 32701, + 32769, 32771, 32780, 32786, 32819, 32895, 32905, 32907, 32908, 33251, + 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, 33406, 34411, + 34880, 34892, 34915, 35199, 38433, 20018, 20136, 20301, 20303, 20295, + 20311, 20318, 20276, 20315, 20309, 20272, 20304, 20305, 20285, 20282, + 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, 20302, + 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, 20918, + 20919, 21029, 21028, 21033, 21034, 21032, 21163, 21161, 21162, 21164, + 21283, 21363, 21365, 21533, 21549, 21534, 21566, 21542, 21582, 21543, + 21574, 21571, 21555, 21576, 21570, 21531, 21545, 21578, 21561, 21563, + 21560, 21550, 21557, 21558, 21536, 21564, 21568, 21553, 21547, 21535, + 21548, 22250, 22256, 22244, 22251, 22346, 22353, 22336, 22349, 22343, + 22350, 22334, 22352, 22351, 22331, 22767, 22846, 22941, 22930, 22952, + 22942, 22947, 22937, 22934, 22925, 22948, 22931, 22922, 22949, 23389, + 23388, 23386, 23387, 23436, 23435, 23439, 23596, 23616, 23617, 23615, + 23614, 23696, 23697, 23700, 23692, 24043, 24076, 24207, 24199, 24202, + 24311, 24324, 24351, 24420, 24418, 24439, 24441, 24536, 24524, 24535, + 24525, 24561, 24555, 24568, 24554, 25106, 25105, 25220, 25239, 25238, + 25216, 25206, 25225, 25197, 25226, 25212, 25214, 25209, 25203, 25234, + 25199, 25240, 25198, 25237, 25235, 25233, 25222, 25913, 25915, 25912, + 26097, 26356, 26463, 26446, 26447, 26448, 26449, 26460, 26454, 26462, + 26441, 26438, 26464, 26451, 26455, 27493, 27599, 27714, 27742, 27801, + 27777, 27784, 27785, 27781, 27803, 27754, 27770, 27792, 27760, 27788, + 27752, 27798, 27794, 27773, 27779, 27762, 27774, 27764, 27782, 27766, + 27789, 27796, 27800, 27778, 28790, 28796, 28797, 28792, 29282, 29281, + 29280, 29380, 29378, 29590, 29996, 29995, 30007, 30008, 30338, 30447, + 30691, 31169, 31168, 31167, 31350, 31995, 32597, 32918, 32915, 32925, + 32920, 32923, 32922, 32946, 33391, 33426, 33419, 33421, 35211, 35282, + 35328, 35895, 35910, 35925, 35997, 36196, 36208, 36275, 36523, 36554, + 36763, 36784, 36802, 36806, 36805, 36804, 24033, 37009, 37026, 37034, + 37030, 37027, 37193, 37318, 37324, 38450, 38446, 38449, 38442, 38444, + 20006, 20054, 20083, 20107, 20123, 20126, 20139, 20140, 20335, 20381, + 20365, 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, + 20360, 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, + 20821, 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, + 21050, 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, + 21329, 21350, 21367, 21368, 21369, 21462, 21460, 21463, 21619, 21621, + 21654, 21624, 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, + 21648, 21617, 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, + 22266, 22403, 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, + 22857, 22855, 22856, 22852, 22868, 22974, 22971, 22996, 22969, 22958, + 22993, 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, + 22981, 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, + 23578, 23624, 23621, 23622, 23735, 23713, 23736, 23721, 23723, 23729, + 23731, 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, + 24220, 24213, 24214, 24310, 24358, 24359, 24361, 24448, 24449, 24447, + 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, + 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, + 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, + 25298, 25307, 25259, 25299, 25300, 25291, 25288, 25256, 25277, 25276, + 25296, 25305, 25287, 25293, 25269, 25306, 25265, 25304, 25302, 25303, + 25286, 25260, 25294, 25918, 26023, 26044, 26106, 26132, 26131, 26124, + 26118, 26114, 26126, 26112, 26127, 26133, 26122, 26119, 26381, 26379, + 26477, 26507, 26517, 26481, 26524, 26483, 26487, 26503, 26525, 26519, + 26479, 26480, 26495, 26505, 26494, 26512, 26485, 26522, 26515, 26492, + 26474, 26482, 27427, 27494, 27495, 27519, 27667, 27675, 27875, 27880, + 27891, 27825, 27852, 27877, 27827, 27837, 27838, 27836, 27874, 27819, + 27861, 27859, 27832, 27844, 27833, 27841, 27822, 27863, 27845, 27889, + 27839, 27835, 27873, 27867, 27850, 27820, 27887, 27868, 27862, 27872, + 28821, 28814, 28818, 28810, 28825, 29228, 29229, 29240, 29256, 29287, + 29289, 29376, 29390, 29401, 29399, 29392, 29609, 29608, 29599, 29611, + 29605, 30013, 30109, 30105, 30106, 30340, 30402, 30450, 30452, 30693, + 30717, 31038, 31040, 31041, 31177, 31176, 31354, 31353, 31482, 31998, + 32596, 32652, 32651, 32773, 32954, 32933, 32930, 32945, 32929, 32939, + 32937, 32948, 32938, 32943, 33253, 33278, 33293, 33459, 33437, 33433, + 33453, 33469, 33439, 33465, 33457, 33452, 33445, 33455, 33464, 33443, + 33456, 33470, 33463, 34382, 34417, 21021, 34920, 36555, 36814, 36820, + 36817, 37045, 37048, 37041, 37046, 37319, 37329, 38263, 38272, 38428, + 38464, 38463, 38459, 38468, 38466, 38585, 38632, 38738, 38750, 20127, + 20141, 20142, 20449, 20405, 20399, 20415, 20448, 20433, 20431, 20445, + 20419, 20406, 20440, 20447, 20426, 20439, 20398, 20432, 20420, 20418, + 20442, 20430, 20446, 20407, 20823, 20882, 20881, 20896, 21070, 21059, + 21066, 21069, 21068, 21067, 21063, 21191, 21193, 21187, 21185, 21261, + 21335, 21371, 21402, 21467, 21676, 21696, 21672, 21710, 21705, 21688, + 21670, 21683, 21703, 21698, 21693, 21674, 21697, 21700, 21704, 21679, + 21675, 21681, 21691, 21673, 21671, 21695, 22271, 22402, 22411, 22432, + 22435, 22434, 22478, 22446, 22419, 22869, 22865, 22863, 22862, 22864, + 23004, 23000, 23039, 23011, 23016, 23043, 23013, 23018, 23002, 23014, + 23041, 23035, 23401, 23459, 23462, 23460, 23458, 23461, 23553, 23630, + 23631, 23629, 23627, 23769, 23762, 24055, 24093, 24101, 24095, 24189, + 24224, 24230, 24314, 24328, 24365, 24421, 24456, 24453, 24458, 24459, + 24455, 24460, 24457, 24594, 24605, 24608, 24613, 24590, 24616, 24653, + 24688, 24680, 24674, 24646, 24643, 24684, 24683, 24682, 24676, 25153, + 25308, 25366, 25353, 25340, 25325, 25345, 25326, 25341, 25351, 25329, + 25335, 25327, 25324, 25342, 25332, 25361, 25346, 25919, 25925, 26027, + 26045, 26082, 26149, 26157, 26144, 26151, 26159, 26143, 26152, 26161, + 26148, 26359, 26623, 26579, 26609, 26580, 26576, 26604, 26550, 26543, + 26613, 26601, 26607, 26564, 26577, 26548, 26586, 26597, 26552, 26575, + 26590, 26611, 26544, 26585, 26594, 26589, 26578, 27498, 27523, 27526, + 27573, 27602, 27607, 27679, 27849, 27915, 27954, 27946, 27969, 27941, + 27916, 27953, 27934, 27927, 27963, 27965, 27966, 27958, 27931, 27893, + 27961, 27943, 27960, 27945, 27950, 27957, 27918, 27947, 28843, 28858, + 28851, 28844, 28847, 28845, 28856, 28846, 28836, 29232, 29298, 29295, + 29300, 29417, 29408, 29409, 29623, 29642, 29627, 29618, 29645, 29632, + 29619, 29978, 29997, 30031, 30028, 30030, 30027, 30123, 30116, 30117, + 30114, 30115, 30328, 30342, 30343, 30344, 30408, 30406, 30403, 30405, + 30465, 30457, 30456, 30473, 30475, 30462, 30460, 30471, 30684, 30722, + 30740, 30732, 30733, 31046, 31049, 31048, 31047, 31161, 31162, 31185, + 31186, 31179, 31359, 31361, 31487, 31485, 31869, 32002, 32005, 32000, + 32009, 32007, 32004, 32006, 32568, 32654, 32703, 32772, 32784, 32781, + 32785, 32822, 32982, 32997, 32986, 32963, 32964, 32972, 32993, 32987, + 32974, 32990, 32996, 32989, 33268, 33314, 33511, 33539, 33541, 33507, + 33499, 33510, 33540, 33509, 33538, 33545, 33490, 33495, 33521, 33537, + 33500, 33492, 33489, 33502, 33491, 33503, 33519, 33542, 34384, 34425, + 34427, 34426, 34893, 34923, 35201, 35284, 35336, 35330, 35331, 35998, + 36000, 36212, 36211, 36276, 36557, 36556, 36848, 36838, 36834, 36842, + 36837, 36845, 36843, 36836, 36840, 37066, 37070, 37057, 37059, 37195, + 37194, 37325, 38274, 38480, 38475, 38476, 38477, 38754, 38761, 38859, + 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 20056, 20147, + 20492, 20493, 20515, 20463, 20518, 20517, 20472, 20521, 20502, 20486, + 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, 20520, 20465, + 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, 20478, 20523, + 20489, 20860, 20900, 20901, 20898, 20941, 20940, 20934, 20939, 21078, + 21084, 21076, 21083, 21085, 21290, 21375, 21407, 21405, 21471, 21736, + 21776, 21761, 21815, 21756, 21733, 21746, 21766, 21754, 21780, 21737, + 21741, 21729, 21769, 21742, 21738, 21734, 21799, 21767, 21757, 21775, + 22275, 22276, 22466, 22484, 22475, 22467, 22537, 22799, 22871, 22872, + 22874, 23057, 23064, 23068, 23071, 23067, 23059, 23020, 23072, 23075, + 23081, 23077, 23052, 23049, 23403, 23640, 23472, 23475, 23478, 23476, + 23470, 23477, 23481, 23480, 23556, 23633, 23637, 23632, 23789, 23805, + 23803, 23786, 23784, 23792, 23798, 23809, 23796, 24046, 24109, 24107, + 24235, 24237, 24231, 24369, 24466, 24465, 24464, 24665, 24675, 24677, + 24656, 24661, 24685, 24681, 24687, 24708, 24735, 24730, 24717, 24724, + 24716, 24709, 24726, 25159, 25331, 25352, 25343, 25422, 25406, 25391, + 25429, 25410, 25414, 25423, 25417, 25402, 25424, 25405, 25386, 25387, + 25384, 25421, 25420, 25928, 25929, 26009, 26049, 26053, 26178, 26185, + 26191, 26179, 26194, 26188, 26181, 26177, 26360, 26388, 26389, 26391, + 26657, 26680, 26696, 26694, 26707, 26681, 26690, 26708, 26665, 26803, + 26647, 26700, 26705, 26685, 26612, 26704, 26688, 26684, 26691, 26666, + 26693, 26643, 26648, 26689, 27530, 27529, 27575, 27683, 27687, 27688, + 27686, 27684, 27888, 28010, 28053, 28040, 28039, 28006, 28024, 28023, + 27993, 28051, 28012, 28041, 28014, 27994, 28020, 28009, 28044, 28042, + 28025, 28037, 28005, 28052, 28874, 28888, 28900, 28889, 28872, 28879, + 29241, 29305, 29436, 29433, 29437, 29432, 29431, 29574, 29677, 29705, + 29678, 29664, 29674, 29662, 30036, 30045, 30044, 30042, 30041, 30142, + 30149, 30151, 30130, 30131, 30141, 30140, 30137, 30146, 30136, 30347, + 30384, 30410, 30413, 30414, 30505, 30495, 30496, 30504, 30697, 30768, + 30759, 30776, 30749, 30772, 30775, 30757, 30765, 30752, 30751, 30770, + 31061, 31056, 31072, 31071, 31062, 31070, 31069, 31063, 31066, 31204, + 31203, 31207, 31199, 31206, 31209, 31192, 31364, 31368, 31449, 31494, + 31505, 31881, 32033, 32023, 32011, 32010, 32032, 32034, 32020, 32016, + 32021, 32026, 32028, 32013, 32025, 32027, 32570, 32607, 32660, 32709, + 32705, 32774, 32792, 32789, 32793, 32791, 32829, 32831, 33009, 33026, + 33008, 33029, 33005, 33012, 33030, 33016, 33011, 33032, 33021, 33034, + 33020, 33007, 33261, 33260, 33280, 33296, 33322, 33323, 33320, 33324, + 33467, 33579, 33618, 33620, 33610, 33592, 33616, 33609, 33589, 33588, + 33615, 33586, 33593, 33590, 33559, 33600, 33585, 33576, 33603, 34388, + 34442, 34474, 34451, 34468, 34473, 34444, 34467, 34460, 34928, 34935, + 34945, 34946, 34941, 34937, 35352, 35344, 35342, 35340, 35349, 35338, + 35351, 35347, 35350, 35343, 35345, 35912, 35962, 35961, 36001, 36002, + 36215, 36524, 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, + 36858, 36852, 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, + 37202, 37197, 37196, 37336, 37341, 37335, 37340, 37337, 38275, 38498, + 38499, 38497, 38491, 38493, 38500, 38488, 38494, 38587, 39138, 39340, + 39592, 39640, 39717, 39730, 39740, 20094, 20602, 20605, 20572, 20551, + 20547, 20556, 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, + 20599, 20559, 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, + 21202, 21209, 21208, 21205, 21264, 21263, 21273, 21311, 21312, 21310, + 21443, 26364, 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, + 21809, 21846, 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, + 21859, 21811, 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, + 22534, 22496, 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, + 23094, 23105, 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, + 23114, 23408, 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, + 23559, 23648, 23644, 23645, 23815, 23814, 23822, 23835, 23830, 23842, + 23825, 23849, 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, + 24115, 24119, 24247, 24248, 24246, 24245, 24254, 24373, 24375, 24407, + 24428, 24425, 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, + 24703, 24739, 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, + 24763, 24757, 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, + 24775, 25114, 25115, 25160, 25504, 25511, 25458, 25494, 25506, 25509, + 25463, 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, + 25512, 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, + 25449, 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, + 25944, 25941, 25940, 26012, 26011, 26028, 26063, 26059, 26060, 26062, + 26205, 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, + 26799, 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, + 26755, 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, + 26754, 27442, 27578, 27627, 27628, 27691, 28046, 28092, 28147, 28121, + 28082, 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, + 28113, 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, + 28085, 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, + 28074, 28140, 28095, 28134, 28921, 28937, 28938, 28925, 28911, 29245, + 29309, 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, + 29699, 29702, 29694, 29709, 29920, 29942, 29943, 29980, 29986, 30053, + 30054, 30050, 30064, 30095, 30164, 30165, 30133, 30154, 30157, 30350, + 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, 30522, 30827, + 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, 31520, 31528, + 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, 31893, 32070, + 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, 32068, 32047, + 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, 32722, 32796, + 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, 33060, 33282, + 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, 33698, 33686, + 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, 33659, 33660, + 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, 34485, 34502, + 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, 34962, 34966, + 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, 35377, 35373, + 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, 36008, 36010, + 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, 36877, 36890, + 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, 36879, 36898, + 36886, 36891, 36884, 37096, 37101, 37117, 37207, 37326, 37365, 37350, + 37347, 37351, 37357, 37353, 38281, 38506, 38517, 38515, 38520, 38512, + 38516, 38518, 38519, 38508, 38592, 38634, 38633, 31456, 31455, 38914, + 38915, 39770, 40165, 40565, 40575, 40613, 40635, 20642, 20621, 20613, + 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, 21106, 21108, + 21109, 21097, 21214, 21213, 21211, 21338, 21413, 21883, 21888, 21927, + 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, 21895, 21899, + 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, 21932, 21937, + 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, 22564, 22576, + 22577, 22561, 22557, 22560, 22777, 22778, 22880, 23159, 23194, 23167, + 23186, 23195, 23207, 23411, 23409, 23506, 23500, 23507, 23504, 23562, + 23563, 23601, 23884, 23888, 23860, 23879, 24061, 24133, 24125, 24128, + 24131, 24190, 24266, 24257, 24258, 24260, 24380, 24429, 24489, 24490, + 24488, 24785, 24801, 24754, 24758, 24800, 24860, 24867, 24826, 24853, + 24816, 24827, 24820, 24936, 24817, 24846, 24822, 24841, 24832, 24850, + 25119, 25161, 25507, 25484, 25551, 25536, 25577, 25545, 25542, 25549, + 25554, 25571, 25552, 25569, 25558, 25581, 25582, 25462, 25588, 25578, + 25563, 25682, 25562, 25593, 25950, 25958, 25954, 25955, 26001, 26000, + 26031, 26222, 26224, 26228, 26230, 26223, 26257, 26234, 26238, 26231, + 26366, 26367, 26399, 26397, 26874, 26837, 26848, 26840, 26839, 26885, + 26847, 26869, 26862, 26855, 26873, 26834, 26866, 26851, 26827, 26829, + 26893, 26898, 26894, 26825, 26842, 26990, 26875, 27454, 27450, 27453, + 27544, 27542, 27580, 27631, 27694, 27695, 27692, 28207, 28216, 28244, + 28193, 28210, 28263, 28234, 28192, 28197, 28195, 28187, 28251, 28248, + 28196, 28246, 28270, 28205, 28198, 28271, 28212, 28237, 28218, 28204, + 28227, 28189, 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, + 28265, 28255, 28953, 28954, 28966, 28976, 28961, 28982, 29038, 28956, + 29260, 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, + 29730, 29733, 29749, 29750, 29748, 29743, 29723, 29734, 29736, 29989, + 29990, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, 30176, + 30331, 30332, 30358, 30355, 30388, 30428, 30543, 30701, 30813, 30828, + 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, 31461, + 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, 31567, + 31569, 31903, 31909, 32094, 32080, 32104, 32085, 32043, 32110, 32114, + 32097, 32102, 32098, 32112, 32115, 21892, 32724, 32725, 32779, 32850, + 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, 33086, 33100, + 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, 33760, 33733, + 33803, 33729, 33775, 33777, 33780, 33879, 33802, 33776, 33804, 33740, + 33789, 33778, 33738, 33848, 33806, 33796, 33756, 33799, 33748, 33759, + 34395, 34527, 34521, 34541, 34516, 34523, 34532, 34512, 34526, 34903, + 35009, 35010, 34993, 35203, 35222, 35387, 35424, 35413, 35422, 35388, + 35393, 35412, 35419, 35408, 35398, 35380, 35386, 35382, 35414, 35937, + 35970, 36015, 36028, 36019, 36029, 36033, 36027, 36032, 36020, 36023, + 36022, 36031, 36024, 36234, 36229, 36225, 36302, 36317, 36299, 36314, + 36305, 36300, 36315, 36294, 36603, 36600, 36604, 36764, 36910, 36917, + 36913, 36920, 36914, 36918, 37122, 37109, 37129, 37118, 37219, 37221, + 37327, 37396, 37397, 37411, 37385, 37406, 37389, 37392, 37383, 37393, + 38292, 38287, 38283, 38289, 38291, 38290, 38286, 38538, 38542, 38539, + 38525, 38533, 38534, 38541, 38514, 38532, 38593, 38597, 38596, 38598, + 38599, 38639, 38642, 38860, 38917, 38918, 38920, 39143, 39146, 39151, + 39145, 39154, 39149, 39342, 39341, 40643, 40653, 40657, 20098, 20653, + 20661, 20658, 20659, 20677, 20670, 20652, 20663, 20667, 20655, 20679, + 21119, 21111, 21117, 21215, 21222, 21220, 21218, 21219, 21295, 21983, + 21992, 21971, 21990, 21966, 21980, 21959, 21969, 21987, 21988, 21999, + 21978, 21985, 21957, 21958, 21989, 21961, 22290, 22291, 22622, 22609, + 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, + 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, + 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, + 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, + 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, + 25121, 25122, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, + 25628, 25620, 25613, 25654, 25622, 25623, 25606, 25964, 26015, 26032, + 26263, 26249, 26247, 26248, 26262, 26244, 26264, 26253, 26371, 27028, + 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, + 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, + 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, + 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, + 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, + 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, + 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, + 29791, 29790, 29761, 29759, 29785, 29787, 29788, 30070, 30072, 30208, + 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, 30430, 30431, + 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, 30556, 30565, + 30568, 30562, 30702, 30862, 30896, 30871, 30872, 30860, 30857, 30844, + 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, 31260, 31258, + 31264, 31252, 31263, 31262, 31391, 31392, 31607, 31680, 31584, 31598, + 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, 32143, 32091, + 32622, 32617, 32618, 32626, 32681, 32680, 32676, 32854, 32856, 32902, + 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, 33145, 33146, + 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, 33894, 33899, + 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, 33901, 33862, + 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, 34558, 34555, + 34562, 34563, 34566, 34570, 34905, 35039, 35028, 35033, 35036, 35032, + 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, 35442, 35443, + 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, 35461, 35437, + 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, 35978, 35977, + 36042, 36039, 36040, 36036, 36018, 36035, 36034, 36037, 36321, 36319, + 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, 36611, 36617, + 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, 36948, 36924, + 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, 36929, 37138, + 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, 37437, 37440, + 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, 37445, 37433, + 37439, 37466, 38296, 38552, 38548, 38549, 38605, 38603, 38601, 38602, + 38647, 38651, 38649, 38646, 38742, 38772, 38774, 38928, 38929, 38931, + 38922, 38930, 38924, 39164, 39156, 39165, 39166, 39347, 39345, 39348, + 39649, 40169, 40578, 40718, 40723, 40736, 20711, 20718, 20709, 20694, + 20717, 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, + 21123, 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, + 22022, 22025, 22029, 22030, 22007, 22038, 22047, 22024, 22032, 22006, + 22296, 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, + 22781, 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, + 23254, 23256, 23267, 23413, 23518, 23527, 23521, 23525, 23526, 23528, + 23522, 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, + 24151, 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, + 24907, 24951, 24930, 24931, 24927, 24922, 24920, 24949, 25130, 25735, + 25688, 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, + 25723, 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, + 27029, 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, + 27088, 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, + 28467, 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, + 28418, 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, + 28459, 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, + 29081, 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, + 29796, 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, + 30217, 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, + 30887, 30899, 30889, 30883, 31118, 31119, 31117, 31278, 31281, 31402, + 31401, 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, + 31631, 31672, 31623, 31620, 31929, 31933, 31934, 32187, 32176, 32156, + 32189, 32190, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, + 32181, 32184, 32173, 32210, 32199, 32172, 32624, 32736, 32737, 32735, + 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, 33154, + 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, 33988, + 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, 33980, + 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, 34645, + 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, 35098, + 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, 35498, + 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, 36051, + 36049, 36050, 36203, 36249, 36245, 36348, 36628, 36626, 36629, 36627, + 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, 36955, + 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37504, 37509, + 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, 38305, 38312, + 38313, 38307, 38309, 38308, 38553, 38556, 38555, 38604, 38610, 38656, + 38780, 38789, 38902, 38935, 38936, 39087, 39089, 39171, 39173, 39180, + 39177, 39361, 39599, 39600, 39654, 39745, 39746, 40180, 40182, 40179, + 40636, 40763, 40778, 20740, 20736, 20731, 20725, 20729, 20738, 20744, + 20745, 20741, 20956, 21127, 21128, 21129, 21133, 21130, 21232, 21426, + 22062, 22075, 22073, 22066, 22079, 22068, 22057, 22099, 22094, 22103, + 22132, 22070, 22063, 22064, 22656, 22687, 22686, 22707, 22684, 22702, + 22697, 22694, 22893, 23305, 23291, 23307, 23285, 23308, 23304, 23534, + 23532, 23529, 23531, 23652, 23653, 23965, 23956, 24162, 24159, 24161, + 24290, 24282, 24287, 24285, 24291, 24288, 24392, 24433, 24503, 24501, + 24950, 24935, 24942, 24925, 24917, 24962, 24956, 24944, 24939, 24958, + 24999, 24976, 25003, 24974, 25004, 24986, 24996, 24980, 25006, 25134, + 25705, 25711, 25721, 25758, 25778, 25736, 25744, 25776, 25765, 25747, + 25749, 25769, 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, + 25779, 25973, 25975, 25976, 26286, 26283, 26292, 26289, 27171, 27167, + 27112, 27137, 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, + 27141, 27117, 27153, 27472, 27470, 27556, 27589, 27590, 28479, 28540, + 28548, 28497, 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, + 28538, 28528, 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, + 29100, 29105, 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, + 29822, 29824, 30079, 30240, 30249, 30239, 30244, 30246, 30241, 30242, + 30362, 30394, 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, + 30906, 30922, 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, + 31287, 31291, 31407, 31406, 31661, 31665, 31684, 31668, 31686, 31687, + 31681, 31648, 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, + 32221, 32232, 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, + 32629, 32631, 32687, 32745, 32806, 33179, 33180, 33181, 33184, 33178, + 33176, 34071, 34109, 34074, 34030, 34092, 34093, 34067, 34065, 34083, + 34081, 34068, 34028, 34085, 34047, 34054, 34690, 34676, 34678, 34656, + 34662, 34680, 34664, 34649, 34647, 34636, 34643, 34907, 34909, 35088, + 35079, 35090, 35091, 35093, 35082, 35516, 35538, 35527, 35524, 35477, + 35531, 35576, 35506, 35529, 35522, 35519, 35504, 35542, 35533, 35510, + 35513, 35547, 35916, 35918, 35948, 36064, 36062, 36070, 36068, 36076, + 36077, 36066, 36067, 36060, 36074, 36065, 36205, 36255, 36259, 36395, + 36368, 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, + 36635, 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, + 36968, 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, + 37251, 37573, 37563, 37559, 37610, 37548, 37604, 37569, 37555, 37564, + 37586, 37575, 37616, 37554, 38317, 38321, 38660, 38662, 38663, 38665, + 38752, 38797, 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, + 39186, 39192, 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, + 39607, 39662, 39663, 39719, 39749, 39748, 39799, 39791, 40198, 40201, + 40195, 40617, 40638, 40654, 22696, 40786, 20754, 20760, 20756, 20752, + 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, + 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, + 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, + 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, + 25032, 25136, 25797, 25793, 25803, 25787, 25788, 25818, 25796, 25799, + 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, + 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, + 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, + 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, + 28601, 28598, 28582, 28576, 28596, 29118, 29129, 29136, 29138, 29128, + 29141, 29113, 29134, 29145, 29148, 29123, 29124, 29544, 29852, 29859, + 29848, 29855, 29854, 29922, 29964, 29965, 30260, 30264, 30266, 30439, + 30437, 30624, 30622, 30623, 30629, 30952, 30938, 30956, 30951, 31142, + 31309, 31310, 31302, 31308, 31307, 31418, 31705, 31761, 31689, 31716, + 31707, 31713, 31721, 31718, 31957, 31958, 32266, 32273, 32264, 32283, + 32291, 32286, 32285, 32265, 32272, 32633, 32690, 32752, 32753, 32750, + 32808, 33203, 33193, 33192, 33275, 33288, 33368, 33369, 34122, 34137, + 34120, 34152, 34153, 34115, 34121, 34157, 34154, 34142, 34691, 34719, + 34718, 34722, 34701, 34913, 35114, 35122, 35109, 35115, 35105, 35242, + 35238, 35558, 35578, 35563, 35569, 35584, 35548, 35559, 35566, 35582, + 35585, 35586, 35575, 35565, 35571, 35574, 35580, 35947, 35949, 35987, + 36084, 36420, 36401, 36404, 36418, 36409, 36405, 36667, 36655, 36664, + 36659, 36776, 36774, 36981, 36980, 36984, 36978, 36988, 36986, 37172, + 37266, 37664, 37686, 37624, 37683, 37679, 37666, 37628, 37675, 37636, + 37658, 37648, 37670, 37665, 37653, 37678, 37657, 38331, 38567, 38568, + 38570, 38613, 38670, 38673, 38678, 38669, 38675, 38671, 38747, 38748, + 38758, 38808, 38960, 38968, 38971, 38967, 38957, 38969, 38948, 39184, + 39208, 39198, 39195, 39201, 39194, 39405, 39394, 39409, 39608, 39612, + 39675, 39661, 39720, 39825, 40213, 40227, 40230, 40232, 40210, 40219, + 40664, 40660, 40845, 40860, 20778, 20767, 20769, 20786, 21237, 22158, + 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, + 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, + 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, + 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, 25986, + 25987, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, 27299, + 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, 28657, + 28639, 28640, 28635, 28644, 28651, 28655, 28544, 28652, 28641, 28649, + 28629, 28654, 28656, 29159, 29151, 29166, 29158, 29157, 29165, 29164, + 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, 29862, 29864, + 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, 30631, 30637, + 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, 31319, 31423, + 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, 31966, 31970, + 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, 32323, 32299, + 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, 32319, 32303, + 32580, 32755, 32764, 32881, 32882, 32880, 32879, 32883, 33222, 33219, + 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, 33289, 33393, + 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, 34183, 34216, + 34186, 34407, 34752, 34769, 34739, 34770, 34758, 34731, 34747, 34746, + 34760, 34763, 35131, 35126, 35140, 35128, 35133, 35244, 35598, 35607, + 35609, 35611, 35594, 35616, 35613, 35588, 35600, 35905, 35903, 35955, + 36090, 36093, 36092, 36088, 36091, 36264, 36425, 36427, 36424, 36426, + 36676, 36670, 36674, 36677, 36671, 36991, 36989, 36996, 36993, 36994, + 36992, 37177, 37283, 37278, 37276, 37709, 37762, 37672, 37749, 37706, + 37733, 37707, 37656, 37758, 37740, 37723, 37744, 37722, 37716, 38346, + 38347, 38348, 38344, 38342, 38577, 38584, 38614, 38684, 38686, 38816, + 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, 39850, 39853, + 40251, 40255, 40587, 40655, 40670, 40668, 40669, 40667, 40766, 40779, + 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, 25139, 25844, + 25842, 25854, 25862, 25850, 25851, 25847, 26039, 26332, 26406, 27315, + 27308, 27331, 27323, 27320, 27330, 27310, 27311, 27487, 27512, 27567, + 28681, 28683, 28670, 28678, 28666, 28689, 28687, 29179, 29180, 29182, + 29176, 29559, 29557, 29863, 29887, 29973, 30294, 30296, 30290, 30653, + 30655, 30651, 30652, 30990, 31150, 31329, 31330, 31328, 31428, 31429, + 31787, 31783, 31786, 31774, 31779, 31777, 31975, 32340, 32341, 32350, + 32346, 32353, 32338, 32345, 32584, 32761, 32763, 32887, 32886, 33229, + 33231, 33290, 34255, 34217, 34253, 34256, 34249, 34224, 34234, 34233, + 34214, 34799, 34796, 34802, 34784, 35206, 35250, 35316, 35624, 35641, + 35628, 35627, 35920, 36101, 36441, 36451, 36454, 36452, 36447, 36437, + 36544, 36681, 36685, 36999, 36995, 37000, 37291, 37292, 37328, 37780, + 37770, 37782, 37794, 37811, 37806, 37804, 37808, 37784, 37786, 37783, + 38356, 38358, 38352, 38357, 38626, 38620, 38617, 38619, 38622, 38692, + 38819, 38822, 38829, 38905, 38989, 38991, 38988, 38990, 38995, 39098, + 39230, 39231, 39229, 39214, 39333, 39438, 39617, 39683, 39686, 39759, + 39758, 39757, 39882, 39881, 39933, 39880, 39872, 40273, 40285, 40288, + 40672, 40725, 40748, 20787, 22181, 22750, 22751, 22754, 23541, 40848, + 24300, 25074, 25079, 25078, 25077, 25856, 25871, 26336, 26333, 27365, + 27357, 27354, 27347, 28699, 28703, 28712, 28698, 28701, 28693, 28696, + 29190, 29197, 29272, 29346, 29560, 29562, 29885, 29898, 29923, 30087, + 30086, 30303, 30305, 30663, 31001, 31153, 31339, 31337, 31806, 31807, + 31800, 31805, 31799, 31808, 32363, 32365, 32377, 32361, 32362, 32645, + 32371, 32694, 32697, 32696, 33240, 34281, 34269, 34282, 34261, 34276, + 34277, 34295, 34811, 34821, 34829, 34809, 34814, 35168, 35167, 35158, + 35166, 35649, 35676, 35672, 35657, 35674, 35662, 35663, 35654, 35673, + 36104, 36106, 36476, 36466, 36487, 36470, 36460, 36474, 36468, 36692, + 36686, 36781, 37002, 37003, 37297, 37294, 37857, 37841, 37855, 37827, + 37832, 37852, 37853, 37846, 37858, 37837, 37848, 37860, 37847, 37864, + 38364, 38580, 38627, 38698, 38695, 38753, 38876, 38907, 39006, 39000, + 39003, 39100, 39237, 39241, 39446, 39449, 39693, 39912, 39911, 39894, + 39899, 40329, 40289, 40306, 40298, 40300, 40594, 40599, 40595, 40628, + 21240, 22184, 22199, 22198, 22196, 22204, 22756, 23360, 23363, 23421, + 23542, 24009, 25080, 25082, 25880, 25876, 25881, 26342, 26407, 27372, + 28734, 28720, 28722, 29200, 29563, 29903, 30306, 30309, 31014, 31018, + 31020, 31019, 31431, 31478, 31820, 31811, 31821, 31983, 31984, 36782, + 32381, 32380, 32386, 32588, 32768, 33242, 33382, 34299, 34297, 34321, + 34298, 34310, 34315, 34311, 34314, 34836, 34837, 35172, 35258, 35320, + 35696, 35692, 35686, 35695, 35679, 35691, 36111, 36109, 36489, 36481, + 36485, 36482, 37300, 37323, 37912, 37891, 37885, 38369, 38704, 39108, + 39250, 39249, 39336, 39467, 39472, 39479, 39477, 39955, 39949, 40569, + 40629, 40680, 40751, 40799, 40803, 40801, 20791, 20792, 22209, 22208, + 22210, 22804, 23660, 24013, 25084, 25086, 25885, 25884, 26005, 26345, + 27387, 27396, 27386, 27570, 28748, 29211, 29351, 29910, 29908, 30313, + 30675, 31824, 32399, 32396, 32700, 34327, 34349, 34330, 34851, 34850, + 34849, 34847, 35178, 35180, 35261, 35700, 35703, 35709, 36115, 36490, + 36493, 36491, 36703, 36783, 37306, 37934, 37939, 37941, 37946, 37944, + 37938, 37931, 38370, 38712, 38713, 38706, 38911, 39015, 39013, 39255, + 39493, 39491, 39488, 39486, 39631, 39764, 39761, 39981, 39973, 40367, + 40372, 40386, 40376, 40605, 40687, 40729, 40796, 40806, 40807, 20796, + 20795, 22216, 22218, 22217, 23423, 24020, 24018, 24398, 25087, 25892, + 27402, 27489, 28753, 28760, 29568, 29924, 30090, 30318, 30316, 31155, + 31840, 31839, 32894, 32893, 33247, 35186, 35183, 35324, 35712, 36118, + 36119, 36497, 36499, 36705, 37192, 37956, 37969, 37970, 38717, 38718, + 38851, 38849, 39019, 39253, 39509, 39501, 39634, 39706, 40009, 39985, + 39998, 39995, 40403, 40407, 40756, 40812, 40810, 40852, 22220, 24022, + 25088, 25891, 25899, 25898, 26348, 27408, 29914, 31434, 31844, 31843, + 31845, 32403, 32406, 32404, 33250, 34360, 34367, 34865, 35722, 37008, + 37007, 37987, 37984, 37988, 38760, 39023, 39260, 39514, 39515, 39511, + 39635, 39636, 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, + 22761, 25900, 28766, 30321, 30322, 30679, 32592, 32648, 34870, 34873, + 34914, 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, + 38724, 38854, 39024, 39519, 39714, 39768, 40031, 40441, 40442, 40572, + 40573, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, 34875, + 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, 40652, + 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, 36522, + 37317, 38013, 38014, 38012, 40055, 40056, 40695, 35924, 38015, 40474, + 29224, 39530, 39729, 40475, 40478, 31858, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 20022, 20031, 20101, 20128, + 20866, 20886, 20907, 21241, 21304, 21353, 21430, 22794, 23424, 24027, + 12083, 24191, 24308, 24400, 24417, 25908, 26080, 30098, 30326, 36789, + 38582, 168, 710, 12541, 12542, 12445, 12446, 12291, 20189, 12293, + 12294, 12295, 12540, 65339, 65341, 10045, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 12449, + 12450, 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, + 12460, 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, + 12470, 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, + 12480, 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, + 12490, 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, + 12500, 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, + 12510, 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, + 12520, 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, + 12530, 12531, 12532, 12533, 12534, 1040, 1041, 1042, 1043, 1044, + 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, + 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, + 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, + 1074, 1075, 1076, 1077, 1105, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, + 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, + 1103, 8679, 8632, 8633, 12751, 131276, 20058, 131210, 20994, 17553, + 40880, 20872, 40881, 161287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 65506, 65508, 65287, 65282, 12849, 8470, + 8481, 12443, 12444, 11904, 11908, 11910, 11911, 11912, 11914, 11916, + 11917, 11925, 11932, 11933, 11941, 11943, 11946, 11948, 11950, 11958, + 11964, 11966, 11974, 11978, 11980, 11981, 11983, 11990, 11991, 11998, + 12003, 0x0000, 0x0000, 0x0000, 643, 592, 603, 596, 629, 339, + 248, 331, 650, 618, 20034, 20060, 20981, 21274, 21378, 19975, + 19980, 20039, 20109, 22231, 64012, 23662, 24435, 19983, 20871, 19982, + 20014, 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, + 22787, 22828, 23568, 24063, 26081, 27571, 27596, 27668, 29247, 20017, + 20028, 20200, 20188, 20201, 20193, 20189, 20186, 21004, 21276, 21324, + 22306, 22307, 22807, 22831, 23425, 23428, 23570, 23611, 23668, 23667, + 24068, 24192, 24194, 24521, 25097, 25168, 27669, 27702, 27715, 27711, + 27707, 29358, 29360, 29578, 31160, 32906, 38430, 20238, 20248, 20268, + 20213, 20244, 20209, 20224, 20215, 20232, 20253, 20226, 20229, 20258, + 20243, 20228, 20212, 20242, 20913, 21011, 21001, 21008, 21158, 21282, + 21279, 21325, 21386, 21511, 22241, 22239, 22318, 22314, 22324, 22844, + 22912, 22908, 22917, 22907, 22910, 22903, 22911, 23382, 23573, 23589, + 23676, 23674, 23675, 23678, 24031, 24181, 24196, 24322, 24346, 24436, + 24533, 24532, 24527, 25180, 25182, 25188, 25185, 25190, 25186, 25177, + 25184, 25178, 25189, 26095, 26094, 26430, 26425, 26424, 26427, 26426, + 26431, 26428, 26419, 27672, 27718, 27730, 27740, 27727, 27722, 27732, + 27723, 27724, 28785, 29278, 29364, 29365, 29582, 29994, 30335, 31349, + 32593, 33400, 33404, 33408, 33405, 33407, 34381, 35198, 37017, 37015, + 37016, 37019, 37012, 38434, 38436, 38432, 38435, 20310, 20283, 20322, + 20297, 20307, 20324, 20286, 20327, 20306, 20319, 20289, 20312, 20269, + 20275, 20287, 20321, 20879, 20921, 21020, 21022, 21025, 21165, 21166, + 21257, 21347, 21362, 21390, 21391, 21552, 21559, 21546, 21588, 21573, + 21529, 21532, 21541, 21528, 21565, 21583, 21569, 21544, 21540, 21575, + 22254, 22247, 22245, 22337, 22341, 22348, 22345, 22347, 22354, 22790, + 22848, 22950, 22936, 22944, 22935, 22926, 22946, 22928, 22927, 22951, + 22945, 23438, 23442, 23592, 23594, 23693, 23695, 23688, 23691, 23689, + 23698, 23690, 23686, 23699, 23701, 24032, 24074, 24078, 24203, 24201, + 24204, 24200, 24205, 24325, 24349, 24440, 24438, 24530, 24529, 24528, + 24557, 24552, 24558, 24563, 24545, 24548, 24547, 24570, 24559, 24567, + 24571, 24576, 24564, 25146, 25219, 25228, 25230, 25231, 25236, 25223, + 25201, 25211, 25210, 25200, 25217, 25224, 25207, 25213, 25202, 25204, + 25911, 26096, 26100, 26099, 26098, 26101, 26437, 26439, 26457, 26453, + 26444, 26440, 26461, 26445, 26458, 26443, 27600, 27673, 27674, 27768, + 27751, 27755, 27780, 27787, 27791, 27761, 27759, 27753, 27802, 27757, + 27783, 27797, 27804, 27750, 27763, 27749, 27771, 27790, 28788, 28794, + 29283, 29375, 29373, 29379, 29382, 29377, 29370, 29381, 29589, 29591, + 29587, 29588, 29586, 30010, 30009, 30100, 30101, 30337, 31037, 32820, + 32917, 32921, 32912, 32914, 32924, 33424, 33423, 33413, 33422, 33425, + 33427, 33418, 33411, 33412, 35960, 36809, 36799, 37023, 37025, 37029, + 37022, 37031, 37024, 38448, 38440, 38447, 38445, 20019, 20376, 20348, + 20357, 20349, 20352, 20359, 20342, 20340, 20361, 20356, 20343, 20300, + 20375, 20330, 20378, 20345, 20353, 20344, 20368, 20380, 20372, 20382, + 20370, 20354, 20373, 20331, 20334, 20894, 20924, 20926, 21045, 21042, + 21043, 21062, 21041, 21180, 21258, 21259, 21308, 21394, 21396, 21639, + 21631, 21633, 21649, 21634, 21640, 21611, 21626, 21630, 21605, 21612, + 21620, 21606, 21645, 21615, 21601, 21600, 21656, 21603, 21607, 21604, + 22263, 22265, 22383, 22386, 22381, 22379, 22385, 22384, 22390, 22400, + 22389, 22395, 22387, 22388, 22370, 22376, 22397, 22796, 22853, 22965, + 22970, 22991, 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, + 22961, 22973, 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, + 23620, 23623, 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, + 23715, 23725, 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, + 24087, 24084, 24089, 24360, 24354, 24355, 24356, 24404, 24450, 24446, + 24445, 24542, 24549, 24621, 24614, 24601, 24626, 24587, 24628, 24586, + 24599, 24627, 24602, 24606, 24620, 24610, 24589, 24592, 24622, 24595, + 24593, 24588, 24585, 24604, 25108, 25149, 25261, 25268, 25297, 25278, + 25258, 25270, 25290, 25262, 25267, 25263, 25275, 25257, 25264, 25272, + 25917, 26024, 26043, 26121, 26108, 26116, 26130, 26120, 26107, 26115, + 26123, 26125, 26117, 26109, 26129, 26128, 26358, 26378, 26501, 26476, + 26510, 26514, 26486, 26491, 26520, 26502, 26500, 26484, 26509, 26508, + 26490, 26527, 26513, 26521, 26499, 26493, 26497, 26488, 26489, 26516, + 27429, 27520, 27518, 27614, 27677, 27795, 27884, 27883, 27886, 27865, + 27830, 27860, 27821, 27879, 27831, 27856, 27842, 27834, 27843, 27846, + 27885, 27890, 27858, 27869, 27828, 27786, 27805, 27776, 27870, 27840, + 27952, 27853, 27847, 27824, 27897, 27855, 27881, 27857, 28820, 28824, + 28805, 28819, 28806, 28804, 28817, 28822, 28802, 28826, 28803, 29290, + 29398, 29387, 29400, 29385, 29404, 29394, 29396, 29402, 29388, 29393, + 29604, 29601, 29613, 29606, 29602, 29600, 29612, 29597, 29917, 29928, + 30015, 30016, 30014, 30092, 30104, 30383, 30451, 30449, 30448, 30453, + 30712, 30716, 30713, 30715, 30714, 30711, 31042, 31039, 31173, 31352, + 31355, 31483, 31861, 31997, 32821, 32911, 32942, 32931, 32952, 32949, + 32941, 33312, 33440, 33472, 33451, 33434, 33432, 33435, 33461, 33447, + 33454, 33468, 33438, 33466, 33460, 33448, 33441, 33449, 33474, 33444, + 33475, 33462, 33442, 34416, 34415, 34413, 34414, 35926, 36818, 36811, + 36819, 36813, 36822, 36821, 36823, 37042, 37044, 37039, 37043, 37040, + 38457, 38461, 38460, 38458, 38467, 20429, 20421, 20435, 20402, 20425, + 20427, 20417, 20436, 20444, 20441, 20411, 20403, 20443, 20423, 20438, + 20410, 20416, 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, + 21399, 21398, 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, + 33549, 21687, 21678, 21718, 21686, 21701, 21702, 21664, 21616, 21692, + 21666, 21694, 21618, 21726, 21680, 22453, 22430, 22431, 22436, 22412, + 22423, 22429, 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, + 22772, 22797, 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, + 23037, 23036, 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, + 23008, 23038, 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, + 23755, 23771, 23774, 23770, 23753, 23751, 23754, 23766, 23763, 23764, + 23759, 23752, 23750, 23758, 23775, 23800, 24057, 24097, 24098, 24099, + 24096, 24100, 24240, 24228, 24226, 24219, 24227, 24229, 24327, 24366, + 24406, 24454, 24631, 24633, 24660, 24690, 24670, 24645, 24659, 24647, + 24649, 24667, 24652, 24640, 24642, 24671, 24612, 24644, 24664, 24678, + 24686, 25154, 25155, 25295, 25357, 25355, 25333, 25358, 25347, 25323, + 25337, 25359, 25356, 25336, 25334, 25344, 25363, 25364, 25338, 25365, + 25339, 25328, 25921, 25923, 26026, 26047, 26166, 26145, 26162, 26165, + 26140, 26150, 26146, 26163, 26155, 26170, 26141, 26164, 26169, 26158, + 26383, 26384, 26561, 26610, 26568, 26554, 26588, 26555, 26616, 26584, + 26560, 26551, 26565, 26603, 26596, 26591, 26549, 26573, 26547, 26615, + 26614, 26606, 26595, 26562, 26553, 26574, 26599, 26608, 26546, 26620, + 26566, 26605, 26572, 26542, 26598, 26587, 26618, 26569, 26570, 26563, + 26602, 26571, 27432, 27522, 27524, 27574, 27606, 27608, 27616, 27680, + 27681, 27944, 27956, 27949, 27935, 27964, 27967, 27922, 27914, 27866, + 27955, 27908, 27929, 27962, 27930, 27921, 27904, 27933, 27970, 27905, + 27928, 27959, 27907, 27919, 27968, 27911, 27936, 27948, 27912, 27938, + 27913, 27920, 28855, 28831, 28862, 28849, 28848, 28833, 28852, 28853, + 28841, 29249, 29257, 29258, 29292, 29296, 29299, 29294, 29386, 29412, + 29416, 29419, 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, + 29637, 29625, 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, + 29638, 29624, 29643, 29932, 29934, 29998, 30023, 30024, 30119, 30122, + 30329, 30404, 30472, 30467, 30468, 30469, 30474, 30455, 30459, 30458, + 30695, 30696, 30726, 30737, 30738, 30725, 30736, 30735, 30734, 30729, + 30723, 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, + 31190, 31182, 31360, 31358, 31441, 31488, 31489, 31866, 31864, 31865, + 31871, 31872, 31873, 32003, 32008, 32001, 32600, 32657, 32653, 32702, + 32775, 32782, 32783, 32788, 32823, 32984, 32967, 32992, 32977, 32968, + 32962, 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, + 32983, 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, + 33512, 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, + 33525, 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, + 33517, 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, + 35283, 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, + 37055, 37077, 37061, 37054, 37063, 37067, 37064, 37332, 37331, 38484, + 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, + 20528, 20507, 20469, 20468, 20531, 20535, 20524, 20470, 20471, 20503, + 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, + 20938, 20932, 20933, 20936, 20942, 21089, 21082, 21074, 21086, 21087, + 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, 21778, 21735, + 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, 21765, 21745, + 21770, 21755, 21751, 21752, 21728, 21774, 21763, 21771, 22273, 22274, + 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, 22456, 22454, + 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, 23062, 23085, + 23086, 23061, 23055, 23063, 23050, 23070, 23091, 23404, 23463, 23469, + 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, 23799, 23808, + 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, 24368, 24423, + 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, 24705, 24733, + 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, 25158, 25330, + 25360, 25430, 25388, 25412, 25413, 25398, 25411, 25572, 25401, 25419, + 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, 25389, 25415, + 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, 25926, 26054, + 26051, 26052, 26050, 26186, 26207, 26183, 26193, 26386, 26387, 26655, + 26650, 26697, 26674, 26675, 26683, 26699, 26703, 26646, 26673, 26652, + 26677, 26667, 26669, 26671, 26702, 26692, 26676, 26653, 26642, 26644, + 26662, 26664, 26670, 26701, 26682, 26661, 26656, 27436, 27439, 27437, + 27441, 27444, 27501, 32898, 27528, 27622, 27620, 27624, 27619, 27618, + 27623, 27685, 28026, 28003, 28004, 28022, 27917, 28001, 28050, 27992, + 28002, 28013, 28015, 28049, 28045, 28143, 28031, 28038, 27998, 28007, + 28000, 28055, 28016, 28028, 27999, 28034, 28056, 27951, 28008, 28043, + 28030, 28032, 28036, 27926, 28035, 28027, 28029, 28021, 28048, 28892, + 28883, 28881, 28893, 28875, 32569, 28898, 28887, 28882, 28894, 28896, + 28884, 28877, 28869, 28870, 28871, 28890, 28878, 28897, 29250, 29304, + 29303, 29302, 29440, 29434, 29428, 29438, 29430, 29427, 29435, 29441, + 29651, 29657, 29669, 29654, 29628, 29671, 29667, 29673, 29660, 29650, + 29659, 29652, 29661, 29658, 29655, 29656, 29672, 29918, 29919, 29940, + 29941, 29985, 30043, 30047, 30128, 30145, 30139, 30148, 30144, 30143, + 30134, 30138, 30346, 30409, 30493, 30491, 30480, 30483, 30482, 30499, + 30481, 30485, 30489, 30490, 30498, 30503, 30755, 30764, 30754, 30773, + 30767, 30760, 30766, 30763, 30753, 30761, 30771, 30762, 30769, 31060, + 31067, 31055, 31068, 31059, 31058, 31057, 31211, 31212, 31200, 31214, + 31213, 31210, 31196, 31198, 31197, 31366, 31369, 31365, 31371, 31372, + 31370, 31367, 31448, 31504, 31492, 31507, 31493, 31503, 31496, 31498, + 31502, 31497, 31506, 31876, 31889, 31882, 31884, 31880, 31885, 31877, + 32030, 32029, 32017, 32014, 32024, 32022, 32019, 32031, 32018, 32015, + 32012, 32604, 32609, 32606, 32608, 32605, 32603, 32662, 32658, 32707, + 32706, 32704, 32790, 32830, 32825, 33018, 33010, 33017, 33013, 33025, + 33019, 33024, 33281, 33327, 33317, 33587, 33581, 33604, 33561, 33617, + 33573, 33622, 33599, 33601, 33574, 33564, 33570, 33602, 33614, 33563, + 33578, 33544, 33596, 33613, 33558, 33572, 33568, 33591, 33583, 33577, + 33607, 33605, 33612, 33619, 33566, 33580, 33611, 33575, 33608, 34387, + 34386, 34466, 34472, 34454, 34445, 34449, 34462, 34439, 34455, 34438, + 34443, 34458, 34437, 34469, 34457, 34465, 34471, 34453, 34456, 34446, + 34461, 34448, 34452, 34883, 34884, 34925, 34933, 34934, 34930, 34944, + 34929, 34943, 34927, 34947, 34942, 34932, 34940, 35346, 35911, 35927, + 35963, 36004, 36003, 36214, 36216, 36277, 36279, 36278, 36561, 36563, + 36862, 36853, 36866, 36863, 36859, 36868, 36860, 36854, 37078, 37088, + 37081, 37082, 37091, 37087, 37093, 37080, 37083, 37079, 37084, 37092, + 37200, 37198, 37199, 37333, 37346, 37338, 38492, 38495, 38588, 39139, + 39647, 39727, 20095, 20592, 20586, 20577, 20574, 20576, 20563, 20555, + 20573, 20594, 20552, 20557, 20545, 20571, 20554, 20578, 20501, 20549, + 20575, 20585, 20587, 20579, 20580, 20550, 20544, 20590, 20595, 20567, + 20561, 20944, 21099, 21101, 21100, 21102, 21206, 21203, 21293, 21404, + 21877, 21878, 21820, 21837, 21840, 21812, 21802, 21841, 21858, 21814, + 21813, 21808, 21842, 21829, 21772, 21810, 21861, 21838, 21817, 21832, + 21805, 21819, 21824, 21835, 22282, 22279, 22523, 22548, 22498, 22518, + 22492, 22516, 22528, 22509, 22525, 22536, 22520, 22539, 22515, 22479, + 22535, 22510, 22499, 22514, 22501, 22508, 22497, 22542, 22524, 22544, + 22503, 22529, 22540, 22513, 22505, 22512, 22541, 22532, 22876, 23136, + 23128, 23125, 23143, 23134, 23096, 23093, 23149, 23120, 23135, 23141, + 23148, 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, + 23182, 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, + 23106, 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, + 23834, 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, + 23843, 23839, 23854, 24126, 24116, 24241, 24244, 24249, 24242, 24243, + 24374, 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, + 24762, 24787, 24788, 24783, 24804, 24793, 24797, 24776, 24753, 24795, + 24759, 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, + 25469, 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, + 25488, 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, + 25503, 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, + 26209, 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, + 26733, 26734, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, + 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, + 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, + 26769, 26764, 26762, 26749, 27446, 27443, 27447, 27448, 27537, 27535, + 27533, 27534, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, + 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, + 28094, 28133, 28124, 28125, 28123, 28148, 28106, 28093, 28141, 28144, + 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, + 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, + 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, + 28939, 28930, 28942, 29310, 29307, 29308, 29311, 29469, 29463, 29447, + 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, + 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, + 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, 30155, 30156, + 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, 30513, 30514, + 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, + 30794, 30796, 30758, 30789, 30800, 31076, 31079, 31081, 31082, 31075, + 31083, 31073, 31163, 31226, 31224, 31222, 31223, 31375, 31380, 31376, + 31541, 31559, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, + 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, + 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, + 32041, 32065, 32071, 32062, 32063, 32074, 32059, 32040, 32611, 32661, + 32668, 32669, 32667, 32714, 32715, 32717, 32720, 32721, 32711, 32719, + 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, 33049, + 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, 33058, + 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, 33704, + 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, 33653, + 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, 33662, + 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, 33654, + 33690, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, + 34504, 34489, 34483, 34488, 34508, 34484, 34491, 34492, 34499, 34493, + 34494, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, 34977, + 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, 34963, + 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, 35897, + 35899, 35932, 35933, 35965, 36005, 36221, 36219, 36217, 36284, 36290, + 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, 36576, 36577, + 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, 37104, 37108, + 37106, 37107, 37076, 37099, 37100, 37097, 37206, 37208, 37210, 37203, + 37205, 37356, 37364, 37361, 37363, 37368, 37348, 37369, 37354, 37355, + 37367, 37352, 37358, 38266, 38278, 38280, 38524, 38509, 38507, 38513, + 38511, 38591, 38762, 38916, 39141, 39319, 20635, 20629, 20628, 20638, + 20619, 20643, 20611, 20620, 20622, 20637, 20584, 20636, 20626, 20610, + 20615, 20831, 20948, 21266, 21265, 21412, 21415, 21905, 21928, 21925, + 21933, 21879, 22085, 21922, 21907, 21896, 21903, 21941, 21889, 21923, + 21906, 21924, 21885, 21900, 21926, 21887, 21909, 21921, 21902, 22284, + 22569, 22583, 22553, 22558, 22567, 22563, 22568, 22517, 22600, 22565, + 22556, 22555, 22579, 22591, 22582, 22574, 22585, 22584, 22573, 22572, + 22587, 22881, 23215, 23188, 23199, 23162, 23202, 23198, 23160, 23206, + 23164, 23205, 23212, 23189, 23214, 23095, 23172, 23178, 23191, 23171, + 23179, 23209, 23163, 23165, 23180, 23196, 23183, 23187, 23197, 23530, + 23501, 23499, 23508, 23505, 23498, 23502, 23564, 23600, 23863, 23875, + 23915, 23873, 23883, 23871, 23861, 23889, 23886, 23893, 23859, 23866, + 23890, 23869, 23857, 23897, 23874, 23865, 23881, 23864, 23868, 23858, + 23862, 23872, 23877, 24132, 24129, 24408, 24486, 24485, 24491, 24777, + 24761, 24780, 24802, 24782, 24772, 24852, 24818, 24842, 24854, 24837, + 24821, 24851, 24824, 24828, 24830, 24769, 24835, 24856, 24861, 24848, + 24831, 24836, 24843, 25162, 25492, 25521, 25520, 25550, 25573, 25576, + 25583, 25539, 25757, 25587, 25546, 25568, 25590, 25557, 25586, 25589, + 25697, 25567, 25534, 25565, 25564, 25540, 25560, 25555, 25538, 25543, + 25548, 25547, 25544, 25584, 25559, 25561, 25906, 25959, 25962, 25956, + 25948, 25960, 25957, 25996, 26013, 26014, 26030, 26064, 26066, 26236, + 26220, 26235, 26240, 26225, 26233, 26218, 26226, 26369, 26892, 26835, + 26884, 26844, 26922, 26860, 26858, 26865, 26895, 26838, 26871, 26859, + 26852, 26870, 26899, 26896, 26867, 26849, 26887, 26828, 26888, 26992, + 26804, 26897, 26863, 26822, 26900, 26872, 26832, 26877, 26876, 26856, + 26891, 26890, 26903, 26830, 26824, 26845, 26846, 26854, 26868, 26833, + 26886, 26836, 26857, 26901, 26917, 26823, 27449, 27451, 27455, 27452, + 27540, 27543, 27545, 27541, 27581, 27632, 27634, 27635, 27696, 28156, + 28230, 28231, 28191, 28233, 28296, 28220, 28221, 28229, 28258, 28203, + 28223, 28225, 28253, 28275, 28188, 28211, 28235, 28224, 28241, 28219, + 28163, 28206, 28254, 28264, 28252, 28257, 28209, 28200, 28256, 28273, + 28267, 28217, 28194, 28208, 28243, 28261, 28199, 28280, 28260, 28279, + 28245, 28281, 28242, 28262, 28213, 28214, 28250, 28960, 28958, 28975, + 28923, 28974, 28977, 28963, 28965, 28962, 28978, 28959, 28968, 28986, + 28955, 29259, 29274, 29320, 29321, 29318, 29317, 29323, 29458, 29451, + 29488, 29474, 29489, 29491, 29479, 29490, 29485, 29478, 29475, 29493, + 29452, 29742, 29740, 29744, 29739, 29718, 29722, 29729, 29741, 29745, + 29732, 29731, 29725, 29737, 29728, 29746, 29947, 29999, 30063, 30060, + 30183, 30170, 30177, 30182, 30173, 30175, 30180, 30167, 30357, 30354, + 30426, 30534, 30535, 30532, 30541, 30533, 30538, 30542, 30539, 30540, + 30686, 30700, 30816, 30820, 30821, 30812, 30829, 30833, 30826, 30830, + 30832, 30825, 30824, 30814, 30818, 31092, 31091, 31090, 31088, 31234, + 31242, 31235, 31244, 31236, 31385, 31462, 31460, 31562, 31547, 31556, + 31560, 31564, 31566, 31552, 31576, 31557, 31906, 31902, 31912, 31905, + 32088, 32111, 32099, 32083, 32086, 32103, 32106, 32079, 32109, 32092, + 32107, 32082, 32084, 32105, 32081, 32095, 32078, 32574, 32575, 32613, + 32614, 32674, 32672, 32673, 32727, 32849, 32847, 32848, 33022, 32980, + 33091, 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, + 33271, 33272, 33273, 33284, 33340, 33341, 33343, 33397, 33595, 33743, + 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, 33782, 33808, + 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, 33752, 33791, + 33761, 33739, 33742, 33750, 33781, 33737, 33801, 33807, 33758, 33809, + 33798, 33730, 33779, 33749, 33786, 33735, 33745, 33770, 33811, 33731, + 33772, 33774, 33732, 33787, 33751, 33762, 33819, 33755, 33790, 34520, + 34530, 34534, 34515, 34531, 34522, 34538, 34525, 34539, 34524, 34540, + 34537, 34519, 34536, 34513, 34888, 34902, 34901, 35002, 35031, 35001, + 35000, 35008, 35006, 34998, 35004, 34999, 35005, 34994, 35073, 35017, + 35221, 35224, 35223, 35293, 35290, 35291, 35406, 35405, 35385, 35417, + 35392, 35415, 35416, 35396, 35397, 35410, 35400, 35409, 35402, 35404, + 35407, 35935, 35969, 35968, 36026, 36030, 36016, 36025, 36021, 36228, + 36224, 36233, 36312, 36307, 36301, 36295, 36310, 36316, 36303, 36309, + 36313, 36296, 36311, 36293, 36591, 36599, 36602, 36601, 36582, 36590, + 36581, 36597, 36583, 36584, 36598, 36587, 36593, 36588, 36596, 36585, + 36909, 36916, 36911, 37126, 37164, 37124, 37119, 37116, 37128, 37113, + 37115, 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, + 37216, 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, + 37394, 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, + 37399, 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, 38536, + 38537, 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, + 38766, 38919, 39081, 39147, 40166, 40697, 20099, 20100, 20150, 20669, + 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, + 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, 21115, + 21116, 21955, 21979, 21964, 21968, 21963, 21962, 21981, 21952, 21972, + 21956, 21993, 21951, 21970, 21901, 21967, 21973, 21986, 21974, 21960, + 22002, 21965, 21977, 21954, 22292, 22611, 22632, 22628, 22607, 22605, + 22601, 22639, 22613, 22606, 22621, 22617, 22629, 22619, 22589, 22627, + 22641, 22780, 23239, 23236, 23243, 23226, 23224, 23217, 23221, 23216, + 23231, 23240, 23227, 23238, 23223, 23232, 23242, 23220, 23222, 23245, + 23225, 23184, 23510, 23512, 23513, 23583, 23603, 23921, 23907, 23882, + 23909, 23922, 23916, 23902, 23912, 23911, 23906, 24048, 24143, 24142, + 24138, 24141, 24139, 24261, 24268, 24262, 24267, 24263, 24384, 24495, + 24493, 24823, 24905, 24906, 24875, 24901, 24886, 24882, 24878, 24902, + 24879, 24911, 24873, 24896, 25120, 37224, 25123, 25125, 25124, 25541, + 25585, 25579, 25616, 25618, 25609, 25632, 25636, 25651, 25667, 25631, + 25621, 25624, 25657, 25655, 25634, 25635, 25612, 25638, 25648, 25640, + 25665, 25653, 25647, 25610, 25626, 25664, 25637, 25639, 25611, 25575, + 25627, 25646, 25633, 25614, 25967, 26002, 26067, 26246, 26252, 26261, + 26256, 26251, 26250, 26265, 26260, 26232, 26400, 26982, 26975, 26936, + 26958, 26978, 26993, 26943, 26949, 26986, 26937, 26946, 26967, 26969, + 27002, 26952, 26953, 26933, 26988, 26931, 26941, 26981, 26864, 27000, + 26932, 26985, 26944, 26991, 26948, 26998, 26968, 26945, 26996, 26956, + 26939, 26955, 26935, 26972, 26959, 26961, 26930, 26962, 26927, 27003, + 26940, 27462, 27461, 27459, 27458, 27464, 27457, 27547, 64013, 27643, + 27644, 27641, 27639, 27640, 28315, 28374, 28360, 28303, 28352, 28319, + 28307, 28308, 28320, 28337, 28345, 28358, 28370, 28349, 28353, 28318, + 28361, 28343, 28336, 28365, 28326, 28367, 28338, 28350, 28355, 28380, + 28376, 28313, 28306, 28302, 28301, 28324, 28321, 28351, 28339, 28368, + 28362, 28311, 28334, 28323, 28999, 29012, 29010, 29027, 29024, 28993, + 29021, 29026, 29042, 29048, 29034, 29025, 28994, 29016, 28995, 29003, + 29040, 29023, 29008, 29011, 28996, 29005, 29018, 29263, 29325, 29324, + 29329, 29328, 29326, 29500, 29506, 29499, 29498, 29504, 29514, 29513, + 29764, 29770, 29771, 29778, 29777, 29783, 29760, 29775, 29776, 29774, + 29762, 29766, 29773, 29780, 29921, 29951, 29950, 29949, 29981, 30073, + 30071, 27011, 30191, 30223, 30211, 30199, 30206, 30204, 30201, 30200, + 30224, 30203, 30198, 30189, 30197, 30205, 30361, 30389, 30429, 30549, + 30559, 30560, 30546, 30550, 30554, 30569, 30567, 30548, 30553, 30573, + 30688, 30855, 30874, 30868, 30863, 30852, 30869, 30853, 30854, 30881, + 30851, 30841, 30873, 30848, 30870, 30843, 31100, 31106, 31101, 31097, + 31249, 31256, 31257, 31250, 31255, 31253, 31266, 31251, 31259, 31248, + 31395, 31394, 31390, 31467, 31590, 31588, 31597, 31604, 31593, 31602, + 31589, 31603, 31601, 31600, 31585, 31608, 31606, 31587, 31922, 31924, + 31919, 32136, 32134, 32128, 32141, 32127, 32133, 32122, 32142, 32123, + 32131, 32124, 32140, 32148, 32132, 32125, 32146, 32621, 32619, 32615, + 32616, 32620, 32678, 32677, 32679, 32731, 32732, 32801, 33124, 33120, + 33143, 33116, 33129, 33115, 33122, 33138, 26401, 33118, 33142, 33127, + 33135, 33092, 33121, 33309, 33353, 33348, 33344, 33346, 33349, 34033, + 33855, 33878, 33910, 33913, 33935, 33933, 33893, 33873, 33856, 33926, + 33895, 33840, 33869, 33917, 33882, 33881, 33908, 33907, 33885, 34055, + 33886, 33847, 33850, 33844, 33914, 33859, 33912, 33842, 33861, 33833, + 33753, 33867, 33839, 33858, 33837, 33887, 33904, 33849, 33870, 33868, + 33874, 33903, 33989, 33934, 33851, 33863, 33846, 33843, 33896, 33918, + 33860, 33835, 33888, 33876, 33902, 33872, 34571, 34564, 34551, 34572, + 34554, 34518, 34549, 34637, 34552, 34574, 34569, 34561, 34550, 34573, + 34565, 35030, 35019, 35021, 35022, 35038, 35035, 35034, 35020, 35024, + 35205, 35227, 35295, 35301, 35300, 35297, 35296, 35298, 35292, 35302, + 35446, 35462, 35455, 35425, 35391, 35447, 35458, 35460, 35445, 35459, + 35457, 35444, 35450, 35900, 35915, 35914, 35941, 35940, 35942, 35974, + 35972, 35973, 36044, 36200, 36201, 36241, 36236, 36238, 36239, 36237, + 36243, 36244, 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, + 36329, 36323, 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, + 36608, 36613, 36615, 36616, 36610, 36619, 36946, 36927, 36932, 36937, + 36925, 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, 37230, + 37231, 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, + 37422, 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, + 37473, 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, + 37462, 37426, 38303, 38300, 38302, 38299, 38546, 38547, 38545, 38551, + 38606, 38650, 38653, 38648, 38645, 38771, 38775, 38776, 38770, 38927, + 38925, 38926, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, + 39595, 39771, 40170, 40173, 40167, 40576, 40701, 20710, 20692, 20695, + 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, 20719, + 20707, 20704, 20952, 21120, 21121, 21225, 21227, 21296, 21420, 22055, + 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, 22010, + 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, 22657, + 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, 22664, + 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, 23274, + 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, 23261, + 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, 23933, + 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, 23949, + 23929, 23935, 24152, 24153, 24147, 24280, 24273, 24279, 24270, 24284, + 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, 24872, + 24897, 24926, 24945, 24947, 24914, 24915, 24946, 24940, 24960, 24948, + 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, 25127, + 25131, 25643, 25677, 25691, 25693, 25716, 25718, 25714, 25715, 25725, + 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, 25696, + 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, 26016, + 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, 27040, + 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, 27021, + 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, 27082, + 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, 27024, + 27074, 27061, 27045, 27078, 27466, 27469, 27467, 27550, 27551, 27552, + 27587, 27588, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, + 28411, 28462, 28425, 28494, 28441, 28442, 28455, 28440, 28475, 28434, + 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, + 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, + 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, + 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, + 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, + 29813, 29810, 29799, 29806, 29952, 29954, 29955, 30077, 30096, 30230, + 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, + 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, + 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, + 31114, 31115, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, + 31275, 31306, 31280, 31279, 31272, 31270, 31400, 31403, 31404, 31470, + 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, + 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, + 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, + 32196, 32198, 32203, 32204, 32175, 32185, 32150, 32188, 32159, 32166, + 32174, 32169, 32161, 32201, 32627, 32738, 32739, 32741, 32734, 32804, + 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, + 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, + 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, + 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, 33960, 34006, + 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, 33937, + 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, 34585, + 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, 34605, + 34620, 34578, 34618, 34609, 34613, 34626, 34598, 34599, 34616, 34596, + 34586, 34608, 34577, 35063, 35047, 35057, 35058, 35066, 35070, 35054, + 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, 35230, + 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, 35901, + 35944, 35945, 36053, 36047, 36055, 36246, 36361, 36354, 36351, 36365, + 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, 36624, + 36625, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, 37146, + 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, 37494, + 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, 37497, + 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, 37512, + 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, 37533, + 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, 38787, + 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, 39085, + 39086, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, 39354, + 39362, 39357, 39367, 39601, 39651, 39655, 39742, 39743, 39776, 39777, + 39775, 40177, 40178, 40181, 40615, 20735, 20739, 20784, 20728, 20742, + 20743, 20726, 20734, 20747, 20748, 20733, 20746, 21131, 21132, 21233, + 21231, 22088, 22082, 22092, 22069, 22081, 22090, 22089, 22086, 22104, + 22106, 22080, 22067, 22077, 22060, 22078, 22072, 22058, 22074, 22298, + 22699, 22685, 22705, 22688, 22691, 22703, 22700, 22693, 22689, 22783, + 23295, 23284, 23293, 23287, 23286, 23299, 23288, 23298, 23289, 23297, + 23303, 23301, 23311, 23655, 23961, 23959, 23967, 23954, 23970, 23955, + 23957, 23968, 23964, 23969, 23962, 23966, 24169, 24157, 24160, 24156, + 32243, 24283, 24286, 24289, 24393, 24498, 24971, 24963, 24953, 25009, + 25008, 24994, 24969, 24987, 24979, 25007, 25005, 24991, 24978, 25002, + 24993, 24973, 24934, 25011, 25133, 25710, 25712, 25750, 25760, 25733, + 25751, 25756, 25743, 25739, 25738, 25740, 25763, 25759, 25704, 25777, + 25752, 25974, 25978, 25977, 25979, 26034, 26035, 26293, 26288, 26281, + 26290, 26295, 26282, 26287, 27136, 27142, 27159, 27109, 27128, 27157, + 27121, 27108, 27168, 27135, 27116, 27106, 27163, 27165, 27134, 27175, + 27122, 27118, 27156, 27127, 27111, 27200, 27144, 27110, 27131, 27149, + 27132, 27115, 27145, 27140, 27160, 27173, 27151, 27126, 27174, 27143, + 27124, 27158, 27473, 27557, 27555, 27554, 27558, 27649, 27648, 27647, + 27650, 28481, 28454, 28542, 28551, 28614, 28562, 28557, 28553, 28556, + 28514, 28495, 28549, 28506, 28566, 28534, 28524, 28546, 28501, 28530, + 28498, 28496, 28503, 28564, 28563, 28509, 28416, 28513, 28523, 28541, + 28519, 28560, 28499, 28555, 28521, 28543, 28565, 28515, 28535, 28522, + 28539, 29106, 29103, 29083, 29104, 29088, 29082, 29097, 29109, 29085, + 29093, 29086, 29092, 29089, 29098, 29084, 29095, 29107, 29336, 29338, + 29528, 29522, 29534, 29535, 29536, 29533, 29531, 29537, 29530, 29529, + 29538, 29831, 29833, 29834, 29830, 29825, 29821, 29829, 29832, 29820, + 29817, 29960, 29959, 30078, 30245, 30238, 30233, 30237, 30236, 30243, + 30234, 30248, 30235, 30364, 30365, 30366, 30363, 30605, 30607, 30601, + 30600, 30925, 30907, 30927, 30924, 30929, 30926, 30932, 30920, 30915, + 30916, 30921, 31130, 31137, 31136, 31132, 31138, 31131, 27510, 31289, + 31410, 31412, 31411, 31671, 31691, 31678, 31660, 31694, 31663, 31673, + 31690, 31669, 31941, 31944, 31948, 31947, 32247, 32219, 32234, 32231, + 32215, 32225, 32259, 32250, 32230, 32246, 32241, 32240, 32238, 32223, + 32630, 32684, 32688, 32685, 32749, 32747, 32746, 32748, 32742, 32744, + 32868, 32871, 33187, 33183, 33182, 33173, 33186, 33177, 33175, 33302, + 33359, 33363, 33362, 33360, 33358, 33361, 34084, 34107, 34063, 34048, + 34089, 34062, 34057, 34061, 34079, 34058, 34087, 34076, 34043, 34091, + 34042, 34056, 34060, 34036, 34090, 34034, 34069, 34039, 34027, 34035, + 34044, 34066, 34026, 34025, 34070, 34046, 34088, 34077, 34094, 34050, + 34045, 34078, 34038, 34097, 34086, 34023, 34024, 34032, 34031, 34041, + 34072, 34080, 34096, 34059, 34073, 34095, 34402, 34646, 34659, 34660, + 34679, 34785, 34675, 34648, 34644, 34651, 34642, 34657, 34650, 34641, + 34654, 34669, 34666, 34640, 34638, 34655, 34653, 34671, 34668, 34682, + 34670, 34652, 34661, 34639, 34683, 34677, 34658, 34663, 34665, 34906, + 35077, 35084, 35092, 35083, 35095, 35096, 35097, 35078, 35094, 35089, + 35086, 35081, 35234, 35236, 35235, 35309, 35312, 35308, 35535, 35526, + 35512, 35539, 35537, 35540, 35541, 35515, 35543, 35518, 35520, 35525, + 35544, 35523, 35514, 35517, 35545, 35902, 35917, 35983, 36069, 36063, + 36057, 36072, 36058, 36061, 36071, 36256, 36252, 36257, 36251, 36384, + 36387, 36389, 36388, 36398, 36373, 36379, 36374, 36369, 36377, 36390, + 36391, 36372, 36370, 36376, 36371, 36380, 36375, 36378, 36652, 36644, + 36632, 36634, 36640, 36643, 36630, 36631, 36979, 36976, 36975, 36967, + 36971, 37167, 37163, 37161, 37162, 37170, 37158, 37166, 37253, 37254, + 37258, 37249, 37250, 37252, 37248, 37584, 37571, 37572, 37568, 37593, + 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, + 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, + 37598, 37607, 37585, 37587, 37557, 37601, 37574, 37556, 38268, 38316, + 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, 38746, + 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, 38952, + 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, 39190, 39191, + 39189, 39388, 39373, 39375, 39379, 39380, 39374, 39369, 39382, 39384, + 39371, 39383, 39372, 39603, 39660, 39659, 39667, 39666, 39665, 39750, + 39747, 39783, 39796, 39793, 39782, 39798, 39797, 39792, 39784, 39780, + 39788, 40188, 40186, 40189, 40191, 40183, 40199, 40192, 40185, 40187, + 40200, 40197, 40196, 40579, 40659, 40719, 40720, 20764, 20755, 20759, + 20762, 20753, 20958, 21300, 21473, 22128, 22112, 22126, 22131, 22118, + 22115, 22125, 22130, 22110, 22135, 22300, 22299, 22728, 22717, 22729, + 22719, 22714, 22722, 22716, 22726, 23319, 23321, 23323, 23329, 23316, + 23315, 23312, 23318, 23336, 23322, 23328, 23326, 23535, 23980, 23985, + 23977, 23975, 23989, 23984, 23982, 23978, 23976, 23986, 23981, 23983, + 23988, 24167, 24168, 24166, 24175, 24297, 24295, 24294, 24296, 24293, + 24395, 24508, 24989, 25000, 24982, 25029, 25012, 25030, 25025, 25036, + 25018, 25023, 25016, 24972, 25815, 25814, 25808, 25807, 25801, 25789, + 25737, 25795, 25819, 25843, 25817, 25907, 25983, 25980, 26018, 26312, + 26302, 26304, 26314, 26315, 26319, 26301, 26299, 26298, 26316, 26403, + 27188, 27238, 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, + 27227, 27217, 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, + 27215, 27220, 27247, 27241, 27232, 27196, 27230, 27222, 27221, 27213, + 27214, 27206, 27477, 27476, 27478, 27559, 27562, 27563, 27592, 27591, + 27652, 27651, 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, + 28510, 28612, 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, + 28588, 28586, 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, + 28594, 28592, 29125, 29122, 29119, 29112, 29142, 29120, 29121, 29131, + 29140, 29130, 29127, 29135, 29117, 29144, 29116, 29126, 29146, 29147, + 29341, 29342, 29545, 29542, 29543, 29548, 29541, 29547, 29546, 29823, + 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, 30253, + 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, 30618, + 30621, 30625, 30620, 30619, 30626, 30627, 30613, 30617, 30615, 30941, + 30953, 30949, 30954, 30942, 30947, 30939, 30945, 30946, 30957, 30943, + 30944, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, 31415, + 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, 31700, + 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, 31952, + 31953, 32274, 32289, 32279, 32268, 32287, 32288, 32275, 32270, 32284, + 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, 32293, 32292, + 32579, 32635, 32636, 32634, 32689, 32751, 32810, 32809, 32876, 33201, + 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, 33202, 33207, + 33191, 33266, 33365, 33366, 33367, 34134, 34117, 34155, 34125, 34131, + 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, 34119, + 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, 34144, + 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, 34715, + 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, 34681, 34695, + 34723, 34693, 34704, 34705, 34717, 34692, 34708, 34716, 34714, 34697, + 35102, 35110, 35120, 35117, 35118, 35111, 35121, 35106, 35113, 35107, + 35119, 35116, 35103, 35313, 35552, 35554, 35570, 35572, 35573, 35549, + 35604, 35556, 35551, 35568, 35528, 35550, 35553, 35560, 35583, 35567, + 35579, 35985, 35986, 35984, 36085, 36078, 36081, 36080, 36083, 36204, + 36206, 36261, 36263, 36403, 36414, 36408, 36416, 36421, 36406, 36412, + 36413, 36417, 36400, 36415, 36541, 36662, 36654, 36661, 36658, 36665, + 36663, 36660, 36982, 36985, 36987, 36998, 37114, 37171, 37173, 37174, + 37267, 37264, 37265, 37261, 37263, 37671, 37662, 37640, 37663, 37638, + 37647, 37754, 37688, 37692, 37659, 37667, 37650, 37633, 37702, 37677, + 37646, 37645, 37579, 37661, 37626, 37669, 37651, 37625, 37623, 37684, + 37634, 37668, 37631, 37673, 37689, 37685, 37674, 37652, 37644, 37643, + 37630, 37641, 37632, 37627, 37654, 38332, 38349, 38334, 38329, 38330, + 38326, 38335, 38325, 38333, 38569, 38612, 38667, 38674, 38672, 38809, + 38807, 38804, 38896, 38904, 38965, 38959, 38962, 39204, 39199, 39207, + 39209, 39326, 39406, 39404, 39397, 39396, 39408, 39395, 39402, 39401, + 39399, 39609, 39615, 39604, 39611, 39670, 39674, 39673, 39671, 39731, + 39808, 39813, 39815, 39804, 39806, 39803, 39810, 39827, 39826, 39824, + 39802, 39829, 39805, 39816, 40229, 40215, 40224, 40222, 40212, 40233, + 40221, 40216, 40226, 40208, 40217, 40223, 40584, 40582, 40583, 40622, + 40621, 40661, 40662, 40698, 40722, 40765, 20774, 20773, 20770, 20772, + 20768, 20777, 21236, 22163, 22156, 22157, 22150, 22148, 22147, 22142, + 22146, 22143, 22145, 22742, 22740, 22735, 22738, 23341, 23333, 23346, + 23331, 23340, 23335, 23334, 23343, 23342, 23419, 23537, 23538, 23991, + 24172, 24170, 24510, 24507, 25027, 25013, 25020, 25063, 25056, 25061, + 25060, 25064, 25054, 25839, 25833, 25827, 25835, 25828, 25832, 25985, + 25984, 26038, 26074, 26322, 27277, 27286, 27265, 27301, 27273, 27295, + 27291, 27297, 27294, 27271, 27283, 27278, 27285, 27267, 27304, 27300, + 27281, 27263, 27302, 27290, 27269, 27276, 27282, 27483, 27565, 27657, + 28620, 28585, 28660, 28628, 28643, 28636, 28653, 28647, 28646, 28638, + 28658, 28637, 28642, 28648, 29153, 29169, 29160, 29170, 29156, 29168, + 29154, 29555, 29550, 29551, 29847, 29874, 29867, 29840, 29866, 29869, + 29873, 29861, 29871, 29968, 29969, 29970, 29967, 30084, 30275, 30280, + 30281, 30279, 30372, 30441, 30645, 30635, 30642, 30647, 30646, 30644, + 30641, 30632, 30704, 30963, 30973, 30978, 30971, 30972, 30962, 30981, + 30969, 30974, 30980, 31147, 31144, 31324, 31323, 31318, 31320, 31316, + 31322, 31422, 31424, 31425, 31749, 31759, 31730, 31744, 31743, 31739, + 31758, 31732, 31755, 31731, 31746, 31753, 31747, 31745, 31736, 31741, + 31750, 31728, 31729, 31760, 31754, 31976, 32301, 32316, 32322, 32307, + 38984, 32312, 32298, 32329, 32320, 32327, 32297, 32332, 32304, 32315, + 32310, 32324, 32314, 32581, 32639, 32638, 32637, 32756, 32754, 32812, + 33211, 33220, 33228, 33226, 33221, 33223, 33212, 33257, 33371, 33370, + 33372, 34179, 34176, 34191, 34215, 34197, 34208, 34187, 34211, 34171, + 34212, 34202, 34206, 34167, 34172, 34185, 34209, 34170, 34168, 34135, + 34190, 34198, 34182, 34189, 34201, 34205, 34177, 34210, 34178, 34184, + 34181, 34169, 34166, 34200, 34192, 34207, 34408, 34750, 34730, 34733, + 34757, 34736, 34732, 34745, 34741, 34748, 34734, 34761, 34755, 34754, + 34764, 34743, 34735, 34756, 34762, 34740, 34742, 34751, 34744, 34749, + 34782, 34738, 35125, 35123, 35132, 35134, 35137, 35154, 35127, 35138, + 35245, 35247, 35246, 35314, 35315, 35614, 35608, 35606, 35601, 35589, + 35595, 35618, 35599, 35602, 35605, 35591, 35597, 35592, 35590, 35612, + 35603, 35610, 35919, 35952, 35954, 35953, 35951, 35989, 35988, 36089, + 36207, 36430, 36429, 36435, 36432, 36428, 36423, 36675, 36672, 36997, + 36990, 37176, 37274, 37282, 37275, 37273, 37279, 37281, 37277, 37280, + 37793, 37763, 37807, 37732, 37718, 37703, 37756, 37720, 37724, 37750, + 37705, 37712, 37713, 37728, 37741, 37775, 37708, 37738, 37753, 37719, + 37717, 37714, 37711, 37745, 37751, 37755, 37729, 37726, 37731, 37735, + 37760, 37710, 37721, 38343, 38336, 38345, 38339, 38341, 38327, 38574, + 38576, 38572, 38688, 38687, 38680, 38685, 38681, 38810, 38817, 38812, + 38814, 38813, 38869, 38868, 38897, 38977, 38980, 38986, 38985, 38981, + 38979, 39205, 39211, 39212, 39210, 39219, 39218, 39215, 39213, 39217, + 39216, 39320, 39331, 39329, 39426, 39418, 39412, 39415, 39417, 39416, + 39414, 39419, 39421, 39422, 39420, 39427, 39614, 39678, 39677, 39681, + 39676, 39752, 39834, 39848, 39838, 39835, 39846, 39841, 39845, 39844, + 39814, 39842, 39840, 39855, 40243, 40257, 40295, 40246, 40238, 40239, + 40241, 40248, 40240, 40261, 40258, 40259, 40254, 40247, 40256, 40253, + 32757, 40237, 40586, 40585, 40589, 40624, 40648, 40666, 40699, 40703, + 40740, 40739, 40738, 40788, 40864, 20785, 20781, 20782, 22168, 22172, + 22167, 22170, 22173, 22169, 22896, 23356, 23657, 23658, 24000, 24173, + 24174, 25048, 25055, 25069, 25070, 25073, 25066, 25072, 25067, 25046, + 25065, 25855, 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, + 26330, 26331, 26328, 27333, 27321, 27325, 27361, 27334, 27322, 27318, + 27319, 27335, 27316, 27309, 27486, 27593, 27659, 28679, 28684, 28685, + 28673, 28677, 28692, 28686, 28671, 28672, 28667, 28710, 28668, 28663, + 28682, 29185, 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, + 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, + 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30975, + 30988, 30995, 30996, 30985, 30992, 30994, 30993, 31149, 31148, 31327, + 31772, 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, + 31781, 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, + 32352, 32343, 32339, 32693, 32691, 32759, 32760, 32885, 33233, 33234, + 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, + 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, + 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, + 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, + 34776, 34787, 34724, 34775, 34777, 34817, 34804, 34792, 34781, 35155, + 35147, 35151, 35148, 35142, 35152, 35153, 35145, 35626, 35623, 35619, + 35635, 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, + 35622, 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, + 35992, 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, + 36438, 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, + 36678, 36679, 36680, 36683, 37160, 37178, 37179, 37182, 37288, 37285, + 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, + 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37773, + 37809, 37777, 37810, 37796, 37800, 37812, 37795, 37797, 38354, 38355, + 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, + 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, + 38873, 38870, 38872, 38906, 38992, 38993, 38994, 39096, 39233, 39228, + 39226, 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, + 39430, 39616, 39644, 39688, 39684, 39685, 39721, 39733, 39754, 39756, + 39755, 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, + 39876, 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, + 40278, 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, + 40671, 40705, 40704, 40726, 40741, 40747, 40746, 40745, 40744, 40780, + 40789, 20788, 20789, 21142, 21239, 21428, 22187, 22189, 22182, 22183, + 22186, 22188, 22746, 22749, 22747, 22802, 23357, 23358, 23359, 24003, + 24176, 24511, 25083, 25863, 25872, 25869, 25865, 25868, 25870, 25988, + 26078, 26077, 26334, 27367, 27360, 27340, 27345, 27353, 27339, 27359, + 27356, 27344, 27371, 27343, 27341, 27358, 27488, 27568, 27660, 28697, + 28711, 28704, 28694, 28715, 28705, 28706, 28707, 28713, 28695, 28708, + 28700, 28714, 29196, 29194, 29191, 29186, 29189, 29349, 29350, 29348, + 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, 30665, 30666, + 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, 31152, 31335, + 31336, 31795, 31804, 31801, 31788, 31803, 31980, 31978, 32374, 32373, + 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, 32587, 32586, + 32643, 32646, 32695, 32765, 32766, 32888, 33239, 33237, 33380, 33377, + 33379, 34283, 34289, 34285, 34265, 34273, 34280, 34266, 34263, 34284, + 34290, 34296, 34264, 34271, 34275, 34268, 34257, 34288, 34278, 34287, + 34270, 34274, 34816, 34810, 34819, 34806, 34807, 34825, 34828, 34827, + 34822, 34812, 34824, 34815, 34826, 34818, 35170, 35162, 35163, 35159, + 35169, 35164, 35160, 35165, 35161, 35208, 35255, 35254, 35318, 35664, + 35656, 35658, 35648, 35667, 35670, 35668, 35659, 35669, 35665, 35650, + 35666, 35671, 35907, 35959, 35958, 35994, 36102, 36103, 36105, 36268, + 36266, 36269, 36267, 36461, 36472, 36467, 36458, 36463, 36475, 36546, + 36690, 36689, 36687, 36688, 36691, 36788, 37184, 37183, 37296, 37293, + 37854, 37831, 37839, 37826, 37850, 37840, 37881, 37868, 37836, 37849, + 37801, 37862, 37834, 37844, 37870, 37859, 37845, 37828, 37838, 37824, + 37842, 37863, 38269, 38362, 38363, 38625, 38697, 38699, 38700, 38696, + 38694, 38835, 38839, 38838, 38877, 38878, 38879, 39004, 39001, 39005, + 38999, 39103, 39101, 39099, 39102, 39240, 39239, 39235, 39334, 39335, + 39450, 39445, 39461, 39453, 39460, 39451, 39458, 39456, 39463, 39459, + 39454, 39452, 39444, 39618, 39691, 39690, 39694, 39692, 39735, 39914, + 39915, 39904, 39902, 39908, 39910, 39906, 39920, 39892, 39895, 39916, + 39900, 39897, 39909, 39893, 39905, 39898, 40311, 40321, 40330, 40324, + 40328, 40305, 40320, 40312, 40326, 40331, 40332, 40317, 40299, 40308, + 40309, 40304, 40297, 40325, 40307, 40315, 40322, 40303, 40313, 40319, + 40327, 40296, 40596, 40593, 40640, 40700, 40749, 40768, 40769, 40781, + 40790, 40791, 40792, 21303, 22194, 22197, 22195, 22755, 23365, 24006, + 24007, 24302, 24303, 24512, 24513, 25081, 25879, 25878, 25877, 25875, + 26079, 26344, 26339, 26340, 27379, 27376, 27370, 27368, 27385, 27377, + 27374, 27375, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, + 28735, 28730, 28729, 28736, 28731, 28723, 28737, 29203, 29204, 29352, + 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, 30670, 30671, + 30669, 30706, 31013, 31011, 31015, 31016, 31012, 31017, 31154, 31342, + 31340, 31341, 31479, 31817, 31816, 31818, 31815, 31813, 31982, 32379, + 32382, 32385, 32384, 32698, 32767, 32889, 33243, 33241, 33291, 33384, + 33385, 34338, 34303, 34305, 34302, 34331, 34304, 34294, 34308, 34313, + 34309, 34316, 34301, 34841, 34832, 34833, 34839, 34835, 34838, 35171, + 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, 35685, 35687, + 35693, 36270, 36486, 36488, 36484, 36697, 36694, 36695, 36693, 36696, + 36698, 37005, 37187, 37185, 37303, 37301, 37298, 37299, 37899, 37907, + 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, 37913, 37901, + 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, 37897, 37880, + 37898, 37887, 37884, 37900, 37878, 37905, 37894, 38366, 38368, 38367, + 38702, 38703, 38841, 38843, 38909, 38910, 39008, 39010, 39011, 39007, + 39105, 39106, 39248, 39246, 39257, 39244, 39243, 39251, 39474, 39476, + 39473, 39468, 39466, 39478, 39465, 39470, 39480, 39469, 39623, 39626, + 39622, 39696, 39698, 39697, 39947, 39944, 39927, 39941, 39954, 39928, + 40000, 39943, 39950, 39942, 39959, 39956, 39945, 40351, 40345, 40356, + 40349, 40338, 40344, 40336, 40347, 40352, 40340, 40348, 40362, 40343, + 40353, 40346, 40354, 40360, 40350, 40355, 40383, 40361, 40342, 40358, + 40359, 40601, 40603, 40602, 40677, 40676, 40679, 40678, 40752, 40750, + 40795, 40800, 40798, 40797, 40793, 40849, 20794, 20793, 21144, 21143, + 22211, 22205, 22206, 23368, 23367, 24011, 24015, 24305, 25085, 25883, + 27394, 27388, 27395, 27384, 27392, 28739, 28740, 28746, 28744, 28745, + 28741, 28742, 29213, 29210, 29209, 29566, 29975, 30314, 30672, 31021, + 31025, 31023, 31828, 31827, 31986, 32394, 32391, 32392, 32395, 32390, + 32397, 32589, 32699, 32816, 33245, 34328, 34346, 34342, 34335, 34339, + 34332, 34329, 34343, 34350, 34337, 34336, 34345, 34334, 34341, 34857, + 34845, 34843, 34848, 34852, 34844, 34859, 34890, 35181, 35177, 35182, + 35179, 35322, 35705, 35704, 35653, 35706, 35707, 36112, 36116, 36271, + 36494, 36492, 36702, 36699, 36701, 37190, 37188, 37189, 37305, 37951, + 37947, 37942, 37929, 37949, 37948, 37936, 37945, 37930, 37943, 37932, + 37952, 37937, 38373, 38372, 38371, 38709, 38714, 38847, 38881, 39012, + 39113, 39110, 39104, 39256, 39254, 39481, 39485, 39494, 39492, 39490, + 39489, 39482, 39487, 39629, 39701, 39703, 39704, 39702, 39738, 39762, + 39979, 39965, 39964, 39980, 39971, 39976, 39977, 39972, 39969, 40375, + 40374, 40380, 40385, 40391, 40394, 40399, 40382, 40389, 40387, 40379, + 40373, 40398, 40377, 40378, 40364, 40392, 40369, 40365, 40396, 40371, + 40397, 40370, 40570, 40604, 40683, 40686, 40685, 40731, 40728, 40730, + 40753, 40782, 40805, 40804, 40850, 20153, 22214, 22213, 22219, 22897, + 23371, 23372, 24021, 24017, 24306, 25889, 25888, 25894, 25890, 27403, + 27400, 27401, 27661, 28757, 28758, 28759, 28754, 29214, 29215, 29353, + 29567, 29912, 29909, 29913, 29911, 30317, 30381, 31029, 31156, 31344, + 31345, 31831, 31836, 31833, 31835, 31834, 31988, 31985, 32401, 32591, + 32647, 33246, 33387, 34356, 34357, 34355, 34348, 34354, 34358, 34860, + 34856, 34854, 34858, 34853, 35185, 35263, 35262, 35323, 35710, 35716, + 35714, 35718, 35717, 35711, 36117, 36501, 36500, 36506, 36498, 36496, + 36502, 36503, 36704, 36706, 37191, 37964, 37968, 37962, 37963, 37967, + 37959, 37957, 37960, 37961, 37958, 38719, 38883, 39018, 39017, 39115, + 39252, 39259, 39502, 39507, 39508, 39500, 39503, 39496, 39498, 39497, + 39506, 39504, 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, + 39999, 40004, 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, + 39990, 40411, 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, + 40425, 40409, 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, + 40755, 40754, 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, + 22898, 23373, 24024, 34863, 24399, 25089, 25091, 25092, 25897, 25893, + 26006, 26347, 27409, 27410, 27407, 27594, 28763, 28762, 29218, 29570, + 29569, 29571, 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, + 34361, 34364, 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, + 35188, 35187, 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, + 36708, 36707, 37308, 37986, 37973, 37981, 37975, 37982, 38852, 38853, + 38912, 39510, 39513, 39710, 39711, 39712, 40018, 40024, 40016, 40010, + 40013, 40011, 40021, 40025, 40012, 40014, 40443, 40439, 40431, 40419, + 40427, 40440, 40420, 40438, 40417, 40430, 40422, 40434, 40432, 40418, + 40428, 40436, 40435, 40424, 40429, 40642, 40656, 40690, 40691, 40710, + 40732, 40760, 40759, 40758, 40771, 40783, 40817, 40816, 40814, 40815, + 22227, 22221, 23374, 23661, 25901, 26349, 26350, 27411, 28767, 28769, + 28765, 28768, 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, + 32407, 32649, 33389, 34371, 34872, 34871, 34869, 34891, 35732, 35733, + 36510, 36511, 36512, 36509, 37310, 37309, 37314, 37995, 37992, 37993, + 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, + 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, + 40453, 40448, 40449, 40457, 40447, 40445, 40452, 40608, 40734, 40774, + 40820, 40821, 40822, 22228, 25902, 26040, 27416, 27417, 27415, 27418, + 28770, 29222, 29354, 30680, 30681, 31033, 31849, 31851, 31990, 32410, + 32408, 32411, 32409, 33248, 33249, 34374, 34375, 34376, 35193, 35194, + 35196, 35195, 35327, 35736, 35737, 36517, 36516, 36515, 37998, 37997, + 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, + 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, + 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, + 38004, 38008, 38006, 38005, 39520, 40052, 40051, 40049, 40053, 40468, + 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, 34878, 34877, + 34879, 35742, 35996, 36521, 36553, 38731, 39027, 39028, 39116, 39265, + 39339, 39524, 39526, 39527, 39716, 40469, 40471, 40776, 25095, 27422, + 29223, 34380, 36520, 38018, 38016, 38017, 39529, 39528, 39726, 40473, + 29225, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, + 28777, 28778, 40612, 40830, 40777, 40856, 30849, 37561, 35023, 22715, + 24658, 31911, 23290, 9556, 9574, 9559, 9568, 9580, 9571, 9562, + 9577, 9565, 9554, 9572, 9557, 9566, 9578, 9569, 9560, 9575, + 9563, 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, + 9553, 9552, 9581, 9582, 9584, 9583, 65517, 132423, 37595, 132575, + 147397, 34124, 17077, 29679, 20917, 13897, 149826, 166372, 37700, 137691, + 33518, 146632, 30780, 26436, 25311, 149811, 166314, 131744, 158643, 135941, + 20395, 140525, 20488, 159017, 162436, 144896, 150193, 140563, 20521, 131966, + 24484, 131968, 131911, 28379, 132127, 20605, 20737, 13434, 20750, 39020, + 14147, 33814, 149924, 132231, 20832, 144308, 20842, 134143, 139516, 131813, + 140592, 132494, 143923, 137603, 23426, 34685, 132531, 146585, 20914, 20920, + 40244, 20937, 20943, 20945, 15580, 20947, 150182, 20915, 20962, 21314, + 20973, 33741, 26942, 145197, 24443, 21003, 21030, 21052, 21173, 21079, + 21140, 21177, 21189, 31765, 34114, 21216, 34317, 158483, 21253, 166622, + 21833, 28377, 147328, 133460, 147436, 21299, 21316, 134114, 27851, 136998, + 26651, 29653, 24650, 16042, 14540, 136936, 29149, 17570, 21357, 21364, + 165547, 21374, 21375, 136598, 136723, 30694, 21395, 166555, 21408, 21419, + 21422, 29607, 153458, 16217, 29596, 21441, 21445, 27721, 20041, 22526, + 21465, 15019, 134031, 21472, 147435, 142755, 21494, 134263, 21523, 28793, + 21803, 26199, 27995, 21613, 158547, 134516, 21853, 21647, 21668, 18342, + 136973, 134877, 15796, 134477, 166332, 140952, 21831, 19693, 21551, 29719, + 21894, 21929, 22021, 137431, 147514, 17746, 148533, 26291, 135348, 22071, + 26317, 144010, 26276, 26285, 22093, 22095, 30961, 22257, 38791, 21502, + 22272, 22255, 22253, 166758, 13859, 135759, 22342, 147877, 27758, 28811, + 22338, 14001, 158846, 22502, 136214, 22531, 136276, 148323, 22566, 150517, + 22620, 22698, 13665, 22752, 22748, 135740, 22779, 23551, 22339, 172368, + 148088, 37843, 13729, 22815, 26790, 14019, 28249, 136766, 23076, 21843, + 136850, 34053, 22985, 134478, 158849, 159018, 137180, 23001, 137211, 137138, + 159142, 28017, 137256, 136917, 23033, 159301, 23211, 23139, 14054, 149929, + 23159, 14088, 23190, 29797, 23251, 159649, 140628, 15749, 137489, 14130, + 136888, 24195, 21200, 23414, 25992, 23420, 162318, 16388, 18525, 131588, + 23509, 24928, 137780, 154060, 132517, 23539, 23453, 19728, 23557, 138052, + 23571, 29646, 23572, 138405, 158504, 23625, 18653, 23685, 23785, 23791, + 23947, 138745, 138807, 23824, 23832, 23878, 138916, 23738, 24023, 33532, + 14381, 149761, 139337, 139635, 33415, 14390, 15298, 24110, 27274, 24181, + 24186, 148668, 134355, 21414, 20151, 24272, 21416, 137073, 24073, 24308, + 164994, 24313, 24315, 14496, 24316, 26686, 37915, 24333, 131521, 194708, + 15070, 18606, 135994, 24378, 157832, 140240, 24408, 140401, 24419, 38845, + 159342, 24434, 37696, 166454, 24487, 23990, 15711, 152144, 139114, 159992, + 140904, 37334, 131742, 166441, 24625, 26245, 137335, 14691, 15815, 13881, + 22416, 141236, 31089, 15936, 24734, 24740, 24755, 149890, 149903, 162387, + 29860, 20705, 23200, 24932, 33828, 24898, 194726, 159442, 24961, 20980, + 132694, 24967, 23466, 147383, 141407, 25043, 166813, 170333, 25040, 14642, + 141696, 141505, 24611, 24924, 25886, 25483, 131352, 25285, 137072, 25301, + 142861, 25452, 149983, 14871, 25656, 25592, 136078, 137212, 25744, 28554, + 142902, 38932, 147596, 153373, 25825, 25829, 38011, 14950, 25658, 14935, + 25933, 28438, 150056, 150051, 25989, 25965, 25951, 143486, 26037, 149824, + 19255, 26065, 16600, 137257, 26080, 26083, 24543, 144384, 26136, 143863, + 143864, 26180, 143780, 143781, 26187, 134773, 26215, 152038, 26227, 26228, + 138813, 143921, 165364, 143816, 152339, 30661, 141559, 39332, 26370, 148380, + 150049, 15147, 27130, 145346, 26462, 26471, 26466, 147917, 168173, 26583, + 17641, 26658, 28240, 37436, 26625, 144358, 159136, 26717, 144495, 27105, + 27147, 166623, 26995, 26819, 144845, 26881, 26880, 15666, 14849, 144956, + 15232, 26540, 26977, 166474, 17148, 26934, 27032, 15265, 132041, 33635, + 20624, 27129, 144985, 139562, 27205, 145155, 27293, 15347, 26545, 27336, + 168348, 15373, 27421, 133411, 24798, 27445, 27508, 141261, 28341, 146139, + 132021, 137560, 14144, 21537, 146266, 27617, 147196, 27612, 27703, 140427, + 149745, 158545, 27738, 33318, 27769, 146876, 17605, 146877, 147876, 149772, + 149760, 146633, 14053, 15595, 134450, 39811, 143865, 140433, 32655, 26679, + 159013, 159137, 159211, 28054, 27996, 28284, 28420, 149887, 147589, 159346, + 34099, 159604, 20935, 27804, 28189, 33838, 166689, 28207, 146991, 29779, + 147330, 31180, 28239, 23185, 143435, 28664, 14093, 28573, 146992, 28410, + 136343, 147517, 17749, 37872, 28484, 28508, 15694, 28532, 168304, 15675, + 28575, 147780, 28627, 147601, 147797, 147513, 147440, 147380, 147775, 20959, + 147798, 147799, 147776, 156125, 28747, 28798, 28839, 28801, 28876, 28885, + 28886, 28895, 16644, 15848, 29108, 29078, 148087, 28971, 28997, 23176, + 29002, 29038, 23708, 148325, 29007, 37730, 148161, 28972, 148570, 150055, + 150050, 29114, 166888, 28861, 29198, 37954, 29205, 22801, 37955, 29220, + 37697, 153093, 29230, 29248, 149876, 26813, 29269, 29271, 15957, 143428, + 26637, 28477, 29314, 29482, 29483, 149539, 165931, 18669, 165892, 29480, + 29486, 29647, 29610, 134202, 158254, 29641, 29769, 147938, 136935, 150052, + 26147, 14021, 149943, 149901, 150011, 29687, 29717, 26883, 150054, 29753, + 132547, 16087, 29788, 141485, 29792, 167602, 29767, 29668, 29814, 33721, + 29804, 14128, 29812, 37873, 27180, 29826, 18771, 150156, 147807, 150137, + 166799, 23366, 166915, 137374, 29896, 137608, 29966, 29929, 29982, 167641, + 137803, 23511, 167596, 37765, 30029, 30026, 30055, 30062, 151426, 16132, + 150803, 30094, 29789, 30110, 30132, 30210, 30252, 30289, 30287, 30319, + 30326, 156661, 30352, 33263, 14328, 157969, 157966, 30369, 30373, 30391, + 30412, 159647, 33890, 151709, 151933, 138780, 30494, 30502, 30528, 25775, + 152096, 30552, 144044, 30639, 166244, 166248, 136897, 30708, 30729, 136054, + 150034, 26826, 30895, 30919, 30931, 38565, 31022, 153056, 30935, 31028, + 30897, 161292, 36792, 34948, 166699, 155779, 140828, 31110, 35072, 26882, + 31104, 153687, 31133, 162617, 31036, 31145, 28202, 160038, 16040, 31174, + 168205, 31188, +}; + +static const unsigned long myencoding_map_euc_kr[] = { + 44034, 44035, 44037, 44038, 44043, 44044, 44045, 44046, 44047, 44056, + 44062, 44063, 44065, 44066, 44067, 44069, 44070, 44071, 44072, 44073, + 44074, 44075, 44078, 44082, 44083, 44084, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44085, 44086, 44087, 44090, 44091, 44093, 44094, 44095, + 44097, 44098, 44099, 44100, 44101, 44102, 44103, 44104, 44105, 44106, + 44108, 44110, 44111, 44112, 44113, 44114, 44115, 44117, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44118, 44119, 44121, 44122, 44123, 44125, + 44126, 44127, 44128, 44129, 44130, 44131, 44132, 44133, 44134, 44135, + 44136, 44137, 44138, 44139, 44140, 44141, 44142, 44143, 44146, 44147, + 44149, 44150, 44153, 44155, 44156, 44157, 44158, 44159, 44162, 44167, + 44168, 44173, 44174, 44175, 44177, 44178, 44179, 44181, 44182, 44183, + 44184, 44185, 44186, 44187, 44190, 44194, 44195, 44196, 44197, 44198, + 44199, 44203, 44205, 44206, 44209, 44210, 44211, 44212, 44213, 44214, + 44215, 44218, 44222, 44223, 44224, 44226, 44227, 44229, 44230, 44231, + 44233, 44234, 44235, 44237, 44238, 44239, 44240, 44241, 44242, 44243, + 44244, 44246, 44248, 44249, 44250, 44251, 44252, 44253, 44254, 44255, + 44258, 44259, 44261, 44262, 44265, 44267, 44269, 44270, 44274, 44276, + 44279, 44280, 44281, 44282, 44283, 44286, 44287, 44289, 44290, 44291, + 44293, 44295, 44296, 44297, 44298, 44299, 44302, 44304, 44306, 44307, + 44308, 44309, 44310, 44311, 44313, 44314, 44315, 44317, 44318, 44319, + 44321, 44322, 44323, 44324, 44325, 44326, 44327, 44328, 44330, 44331, + 44334, 44335, 44336, 44337, 44338, 44339, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44342, 44343, 44345, 44346, 44347, 44349, 44350, 44351, + 44352, 44353, 44354, 44355, 44358, 44360, 44362, 44363, 44364, 44365, + 44366, 44367, 44369, 44370, 44371, 44373, 44374, 44375, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44377, 44378, 44379, 44380, 44381, 44382, + 44383, 44384, 44386, 44388, 44389, 44390, 44391, 44392, 44393, 44394, + 44395, 44398, 44399, 44401, 44402, 44407, 44408, 44409, 44410, 44414, + 44416, 44419, 44420, 44421, 44422, 44423, 44426, 44427, 44429, 44430, + 44431, 44433, 44434, 44435, 44436, 44437, 44438, 44439, 44440, 44441, + 44442, 44443, 44446, 44447, 44448, 44449, 44450, 44451, 44453, 44454, + 44455, 44456, 44457, 44458, 44459, 44460, 44461, 44462, 44463, 44464, + 44465, 44466, 44467, 44468, 44469, 44470, 44472, 44473, 44474, 44475, + 44476, 44477, 44478, 44479, 44482, 44483, 44485, 44486, 44487, 44489, + 44490, 44491, 44492, 44493, 44494, 44495, 44498, 44500, 44501, 44502, + 44503, 44504, 44505, 44506, 44507, 44509, 44510, 44511, 44513, 44514, + 44515, 44517, 44518, 44519, 44520, 44521, 44522, 44523, 44524, 44525, + 44526, 44527, 44528, 44529, 44530, 44531, 44532, 44533, 44534, 44535, + 44538, 44539, 44541, 44542, 44546, 44547, 44548, 44549, 44550, 44551, + 44554, 44556, 44558, 44559, 44560, 44561, 44562, 44563, 44565, 44566, + 44567, 44568, 44569, 44570, 44571, 44572, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44573, 44574, 44575, 44576, 44577, 44578, 44579, 44580, + 44581, 44582, 44583, 44584, 44585, 44586, 44587, 44588, 44589, 44590, + 44591, 44594, 44595, 44597, 44598, 44601, 44603, 44604, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44605, 44606, 44607, 44610, 44612, 44615, + 44616, 44617, 44619, 44623, 44625, 44626, 44627, 44629, 44631, 44632, + 44633, 44634, 44635, 44638, 44642, 44643, 44644, 44646, 44647, 44650, + 44651, 44653, 44654, 44655, 44657, 44658, 44659, 44660, 44661, 44662, + 44663, 44666, 44670, 44671, 44672, 44673, 44674, 44675, 44678, 44679, + 44680, 44681, 44682, 44683, 44685, 44686, 44687, 44688, 44689, 44690, + 44691, 44692, 44693, 44694, 44695, 44696, 44697, 44698, 44699, 44700, + 44701, 44702, 44703, 44704, 44705, 44706, 44707, 44708, 44709, 44710, + 44711, 44712, 44713, 44714, 44715, 44716, 44717, 44718, 44719, 44720, + 44721, 44722, 44723, 44724, 44725, 44726, 44727, 44728, 44729, 44730, + 44731, 44735, 44737, 44738, 44739, 44741, 44742, 44743, 44744, 44745, + 44746, 44747, 44750, 44754, 44755, 44756, 44757, 44758, 44759, 44762, + 44763, 44765, 44766, 44767, 44768, 44769, 44770, 44771, 44772, 44773, + 44774, 44775, 44777, 44778, 44780, 44782, 44783, 44784, 44785, 44786, + 44787, 44789, 44790, 44791, 44793, 44794, 44795, 44797, 44798, 44799, + 44800, 44801, 44802, 44803, 44804, 44805, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 44806, 44809, 44810, 44811, 44812, 44814, 44815, 44817, + 44818, 44819, 44820, 44821, 44822, 44823, 44824, 44825, 44826, 44827, + 44828, 44829, 44830, 44831, 44832, 44833, 44834, 44835, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 44836, 44837, 44838, 44839, 44840, 44841, + 44842, 44843, 44846, 44847, 44849, 44851, 44853, 44854, 44855, 44856, + 44857, 44858, 44859, 44862, 44864, 44868, 44869, 44870, 44871, 44874, + 44875, 44876, 44877, 44878, 44879, 44881, 44882, 44883, 44884, 44885, + 44886, 44887, 44888, 44889, 44890, 44891, 44894, 44895, 44896, 44897, + 44898, 44899, 44902, 44903, 44904, 44905, 44906, 44907, 44908, 44909, + 44910, 44911, 44912, 44913, 44914, 44915, 44916, 44917, 44918, 44919, + 44920, 44922, 44923, 44924, 44925, 44926, 44927, 44929, 44930, 44931, + 44933, 44934, 44935, 44937, 44938, 44939, 44940, 44941, 44942, 44943, + 44946, 44947, 44948, 44950, 44951, 44952, 44953, 44954, 44955, 44957, + 44958, 44959, 44960, 44961, 44962, 44963, 44964, 44965, 44966, 44967, + 44968, 44969, 44970, 44971, 44972, 44973, 44974, 44975, 44976, 44977, + 44978, 44979, 44980, 44981, 44982, 44983, 44986, 44987, 44989, 44990, + 44991, 44993, 44994, 44995, 44996, 44997, 44998, 45002, 45004, 45007, + 45008, 45009, 45010, 45011, 45013, 45014, 45015, 45016, 45017, 45018, + 45019, 45021, 45022, 45023, 45024, 45025, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45026, 45027, 45028, 45029, 45030, 45031, 45034, 45035, + 45036, 45037, 45038, 45039, 45042, 45043, 45045, 45046, 45047, 45049, + 45050, 45051, 45052, 45053, 45054, 45055, 45058, 45059, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45061, 45062, 45063, 45064, 45065, 45066, + 45067, 45069, 45070, 45071, 45073, 45074, 45075, 45077, 45078, 45079, + 45080, 45081, 45082, 45083, 45086, 45087, 45088, 45089, 45090, 45091, + 45092, 45093, 45094, 45095, 45097, 45098, 45099, 45100, 45101, 45102, + 45103, 45104, 45105, 45106, 45107, 45108, 45109, 45110, 45111, 45112, + 45113, 45114, 45115, 45116, 45117, 45118, 45119, 45120, 45121, 45122, + 45123, 45126, 45127, 45129, 45131, 45133, 45135, 45136, 45137, 45138, + 45142, 45144, 45146, 45147, 45148, 45150, 45151, 45152, 45153, 45154, + 45155, 45156, 45157, 45158, 45159, 45160, 45161, 45162, 45163, 45164, + 45165, 45166, 45167, 45168, 45169, 45170, 45171, 45172, 45173, 45174, + 45175, 45176, 45177, 45178, 45179, 45182, 45183, 45185, 45186, 45187, + 45189, 45190, 45191, 45192, 45193, 45194, 45195, 45198, 45200, 45202, + 45203, 45204, 45205, 45206, 45207, 45211, 45213, 45214, 45219, 45220, + 45221, 45222, 45223, 45226, 45232, 45234, 45238, 45239, 45241, 45242, + 45243, 45245, 45246, 45247, 45248, 45249, 45250, 45251, 45254, 45258, + 45259, 45260, 45261, 45262, 45263, 45266, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45267, 45269, 45270, 45271, 45273, 45274, 45275, 45276, + 45277, 45278, 45279, 45281, 45282, 45283, 45284, 45286, 45287, 45288, + 45289, 45290, 45291, 45292, 45293, 45294, 45295, 45296, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45297, 45298, 45299, 45300, 45301, 45302, + 45303, 45304, 45305, 45306, 45307, 45308, 45309, 45310, 45311, 45312, + 45313, 45314, 45315, 45316, 45317, 45318, 45319, 45322, 45325, 45326, + 45327, 45329, 45332, 45333, 45334, 45335, 45338, 45342, 45343, 45344, + 45345, 45346, 45350, 45351, 45353, 45354, 45355, 45357, 45358, 45359, + 45360, 45361, 45362, 45363, 45366, 45370, 45371, 45372, 45373, 45374, + 45375, 45378, 45379, 45381, 45382, 45383, 45385, 45386, 45387, 45388, + 45389, 45390, 45391, 45394, 45395, 45398, 45399, 45401, 45402, 45403, + 45405, 45406, 45407, 45409, 45410, 45411, 45412, 45413, 45414, 45415, + 45416, 45417, 45418, 45419, 45420, 45421, 45422, 45423, 45424, 45425, + 45426, 45427, 45428, 45429, 45430, 45431, 45434, 45435, 45437, 45438, + 45439, 45441, 45443, 45444, 45445, 45446, 45447, 45450, 45452, 45454, + 45455, 45456, 45457, 45461, 45462, 45463, 45465, 45466, 45467, 45469, + 45470, 45471, 45472, 45473, 45474, 45475, 45476, 45477, 45478, 45479, + 45481, 45482, 45483, 45484, 45485, 45486, 45487, 45488, 45489, 45490, + 45491, 45492, 45493, 45494, 45495, 45496, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45497, 45498, 45499, 45500, 45501, 45502, 45503, 45504, + 45505, 45506, 45507, 45508, 45509, 45510, 45511, 45512, 45513, 45514, + 45515, 45517, 45518, 45519, 45521, 45522, 45523, 45525, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45526, 45527, 45528, 45529, 45530, 45531, + 45534, 45536, 45537, 45538, 45539, 45540, 45541, 45542, 45543, 45546, + 45547, 45549, 45550, 45551, 45553, 45554, 45555, 45556, 45557, 45558, + 45559, 45560, 45562, 45564, 45566, 45567, 45568, 45569, 45570, 45571, + 45574, 45575, 45577, 45578, 45581, 45582, 45583, 45584, 45585, 45586, + 45587, 45590, 45592, 45594, 45595, 45596, 45597, 45598, 45599, 45601, + 45602, 45603, 45604, 45605, 45606, 45607, 45608, 45609, 45610, 45611, + 45612, 45613, 45614, 45615, 45616, 45617, 45618, 45619, 45621, 45622, + 45623, 45624, 45625, 45626, 45627, 45629, 45630, 45631, 45632, 45633, + 45634, 45635, 45636, 45637, 45638, 45639, 45640, 45641, 45642, 45643, + 45644, 45645, 45646, 45647, 45648, 45649, 45650, 45651, 45652, 45653, + 45654, 45655, 45657, 45658, 45659, 45661, 45662, 45663, 45665, 45666, + 45667, 45668, 45669, 45670, 45671, 45674, 45675, 45676, 45677, 45678, + 45679, 45680, 45681, 45682, 45683, 45686, 45687, 45688, 45689, 45690, + 45691, 45693, 45694, 45695, 45696, 45697, 45698, 45699, 45702, 45703, + 45704, 45706, 45707, 45708, 45709, 45710, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45711, 45714, 45715, 45717, 45718, 45719, 45723, 45724, + 45725, 45726, 45727, 45730, 45732, 45735, 45736, 45737, 45739, 45741, + 45742, 45743, 45745, 45746, 45747, 45749, 45750, 45751, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45752, 45753, 45754, 45755, 45756, 45757, + 45758, 45759, 45760, 45761, 45762, 45763, 45764, 45765, 45766, 45767, + 45770, 45771, 45773, 45774, 45775, 45777, 45779, 45780, 45781, 45782, + 45783, 45786, 45788, 45790, 45791, 45792, 45793, 45795, 45799, 45801, + 45802, 45808, 45809, 45810, 45814, 45820, 45821, 45822, 45826, 45827, + 45829, 45830, 45831, 45833, 45834, 45835, 45836, 45837, 45838, 45839, + 45842, 45846, 45847, 45848, 45849, 45850, 45851, 45853, 45854, 45855, + 45856, 45857, 45858, 45859, 45860, 45861, 45862, 45863, 45864, 45865, + 45866, 45867, 45868, 45869, 45870, 45871, 45872, 45873, 45874, 45875, + 45876, 45877, 45878, 45879, 45880, 45881, 45882, 45883, 45884, 45885, + 45886, 45887, 45888, 45889, 45890, 45891, 45892, 45893, 45894, 45895, + 45896, 45897, 45898, 45899, 45900, 45901, 45902, 45903, 45904, 45905, + 45906, 45907, 45911, 45913, 45914, 45917, 45920, 45921, 45922, 45923, + 45926, 45928, 45930, 45932, 45933, 45935, 45938, 45939, 45941, 45942, + 45943, 45945, 45946, 45947, 45948, 45949, 45950, 45951, 45954, 45958, + 45959, 45960, 45961, 45962, 45963, 45965, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 45966, 45967, 45969, 45970, 45971, 45973, 45974, 45975, + 45976, 45977, 45978, 45979, 45980, 45981, 45982, 45983, 45986, 45987, + 45988, 45989, 45990, 45991, 45993, 45994, 45995, 45997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 45998, 45999, 46000, 46001, 46002, 46003, + 46004, 46005, 46006, 46007, 46008, 46009, 46010, 46011, 46012, 46013, + 46014, 46015, 46016, 46017, 46018, 46019, 46022, 46023, 46025, 46026, + 46029, 46031, 46033, 46034, 46035, 46038, 46040, 46042, 46044, 46046, + 46047, 46049, 46050, 46051, 46053, 46054, 46055, 46057, 46058, 46059, + 46060, 46061, 46062, 46063, 46064, 46065, 46066, 46067, 46068, 46069, + 46070, 46071, 46072, 46073, 46074, 46075, 46077, 46078, 46079, 46080, + 46081, 46082, 46083, 46084, 46085, 46086, 46087, 46088, 46089, 46090, + 46091, 46092, 46093, 46094, 46095, 46097, 46098, 46099, 46100, 46101, + 46102, 46103, 46105, 46106, 46107, 46109, 46110, 46111, 46113, 46114, + 46115, 46116, 46117, 46118, 46119, 46122, 46124, 46125, 46126, 46127, + 46128, 46129, 46130, 46131, 46133, 46134, 46135, 46136, 46137, 46138, + 46139, 46140, 46141, 46142, 46143, 46144, 46145, 46146, 46147, 46148, + 46149, 46150, 46151, 46152, 46153, 46154, 46155, 46156, 46157, 46158, + 46159, 46162, 46163, 46165, 46166, 46167, 46169, 46170, 46171, 46172, + 46173, 46174, 46175, 46178, 46180, 46182, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46183, 46184, 46185, 46186, 46187, 46189, 46190, 46191, + 46192, 46193, 46194, 46195, 46196, 46197, 46198, 46199, 46200, 46201, + 46202, 46203, 46204, 46205, 46206, 46207, 46209, 46210, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46211, 46212, 46213, 46214, 46215, 46217, + 46218, 46219, 46220, 46221, 46222, 46223, 46224, 46225, 46226, 46227, + 46228, 46229, 46230, 46231, 46232, 46233, 46234, 46235, 46236, 46238, + 46239, 46240, 46241, 46242, 46243, 46245, 46246, 46247, 46249, 46250, + 46251, 46253, 46254, 46255, 46256, 46257, 46258, 46259, 46260, 46262, + 46264, 46266, 46267, 46268, 46269, 46270, 46271, 46273, 46274, 46275, + 46277, 46278, 46279, 46281, 46282, 46283, 46284, 46285, 46286, 46287, + 46289, 46290, 46291, 46292, 46294, 46295, 46296, 46297, 46298, 46299, + 46302, 46303, 46305, 46306, 46309, 46311, 46312, 46313, 46314, 46315, + 46318, 46320, 46322, 46323, 46324, 46325, 46326, 46327, 46329, 46330, + 46331, 46332, 46333, 46334, 46335, 46336, 46337, 46338, 46339, 46340, + 46341, 46342, 46343, 46344, 46345, 46346, 46347, 46348, 46349, 46350, + 46351, 46352, 46353, 46354, 46355, 46358, 46359, 46361, 46362, 46365, + 46366, 46367, 46368, 46369, 46370, 46371, 46374, 46379, 46380, 46381, + 46382, 46383, 46386, 46387, 46389, 46390, 46391, 46393, 46394, 46395, + 46396, 46397, 46398, 46399, 46402, 46406, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46407, 46408, 46409, 46410, 46414, 46415, 46417, 46418, + 46419, 46421, 46422, 46423, 46424, 46425, 46426, 46427, 46430, 46434, + 46435, 46436, 46437, 46438, 46439, 46440, 46441, 46442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46443, 46444, 46445, 46446, 46447, 46448, + 46449, 46450, 46451, 46452, 46453, 46454, 46455, 46456, 46457, 46458, + 46459, 46460, 46461, 46462, 46463, 46464, 46465, 46466, 46467, 46468, + 46469, 46470, 46471, 46472, 46473, 46474, 46475, 46476, 46477, 46478, + 46479, 46480, 46481, 46482, 46483, 46484, 46485, 46486, 46487, 46488, + 46489, 46490, 46491, 46492, 46493, 46494, 46495, 46498, 46499, 46501, + 46502, 46503, 46505, 46508, 46509, 46510, 46511, 46514, 46518, 46519, + 46520, 46521, 46522, 46526, 46527, 46529, 46530, 46531, 46533, 46534, + 46535, 46536, 46537, 46538, 46539, 46542, 46546, 46547, 46548, 46549, + 46550, 46551, 46553, 46554, 46555, 46556, 46557, 46558, 46559, 46560, + 46561, 46562, 46563, 46564, 46565, 46566, 46567, 46568, 46569, 46570, + 46571, 46573, 46574, 46575, 46576, 46577, 46578, 46579, 46580, 46581, + 46582, 46583, 46584, 46585, 46586, 46587, 46588, 46589, 46590, 46591, + 46592, 46593, 46594, 46595, 46596, 46597, 46598, 46599, 46600, 46601, + 46602, 46603, 46604, 46605, 46606, 46607, 46610, 46611, 46613, 46614, + 46615, 46617, 46618, 46619, 46620, 46621, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46622, 46623, 46624, 46625, 46626, 46627, 46628, 46630, + 46631, 46632, 46633, 46634, 46635, 46637, 46638, 46639, 46640, 46641, + 46642, 46643, 46645, 46646, 46647, 46648, 46649, 46650, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46651, 46652, 46653, 46654, 46655, 46656, + 46657, 46658, 46659, 46660, 46661, 46662, 46663, 46665, 46666, 46667, + 46668, 46669, 46670, 46671, 46672, 46673, 46674, 46675, 46676, 46677, + 46678, 46679, 46680, 46681, 46682, 46683, 46684, 46685, 46686, 46687, + 46688, 46689, 46690, 46691, 46693, 46694, 46695, 46697, 46698, 46699, + 46700, 46701, 46702, 46703, 46704, 46705, 46706, 46707, 46708, 46709, + 46710, 46711, 46712, 46713, 46714, 46715, 46716, 46717, 46718, 46719, + 46720, 46721, 46722, 46723, 46724, 46725, 46726, 46727, 46728, 46729, + 46730, 46731, 46732, 46733, 46734, 46735, 46736, 46737, 46738, 46739, + 46740, 46741, 46742, 46743, 46744, 46745, 46746, 46747, 46750, 46751, + 46753, 46754, 46755, 46757, 46758, 46759, 46760, 46761, 46762, 46765, + 46766, 46767, 46768, 46770, 46771, 46772, 46773, 46774, 46775, 46776, + 46777, 46778, 46779, 46780, 46781, 46782, 46783, 46784, 46785, 46786, + 46787, 46788, 46789, 46790, 46791, 46792, 46793, 46794, 46795, 46796, + 46797, 46798, 46799, 46800, 46801, 46802, 46803, 46805, 46806, 46807, + 46808, 46809, 46810, 46811, 46812, 46813, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 46814, 46815, 46816, 46817, 46818, 46819, 46820, 46821, + 46822, 46823, 46824, 46825, 46826, 46827, 46828, 46829, 46830, 46831, + 46833, 46834, 46835, 46837, 46838, 46839, 46841, 46842, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 46843, 46844, 46845, 46846, 46847, 46850, + 46851, 46852, 46854, 46855, 46856, 46857, 46858, 46859, 46860, 46861, + 46862, 46863, 46864, 46865, 46866, 46867, 46868, 46869, 46870, 46871, + 46872, 46873, 46874, 46875, 46876, 46877, 46878, 46879, 46880, 46881, + 46882, 46883, 46884, 46885, 46886, 46887, 46890, 46891, 46893, 46894, + 46897, 46898, 46899, 46900, 46901, 46902, 46903, 46906, 46908, 46909, + 46910, 46911, 46912, 46913, 46914, 46915, 46917, 46918, 46919, 46921, + 46922, 46923, 46925, 46926, 46927, 46928, 46929, 46930, 46931, 46934, + 46935, 46936, 46937, 46938, 46939, 46940, 46941, 46942, 46943, 46945, + 46946, 46947, 46949, 46950, 46951, 46953, 46954, 46955, 46956, 46957, + 46958, 46959, 46962, 46964, 46966, 46967, 46968, 46969, 46970, 46971, + 46974, 46975, 46977, 46978, 46979, 46981, 46982, 46983, 46984, 46985, + 46986, 46987, 46990, 46995, 46996, 46997, 47002, 47003, 47005, 47006, + 47007, 47009, 47010, 47011, 47012, 47013, 47014, 47015, 47018, 47022, + 47023, 47024, 47025, 47026, 47027, 47030, 47031, 47033, 47034, 47035, + 47036, 47037, 47038, 47039, 47040, 47041, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47042, 47043, 47044, 47045, 47046, 47048, 47050, 47051, + 47052, 47053, 47054, 47055, 47056, 47057, 47058, 47059, 47060, 47061, + 47062, 47063, 47064, 47065, 47066, 47067, 47068, 47069, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47070, 47071, 47072, 47073, 47074, 47075, + 47076, 47077, 47078, 47079, 47080, 47081, 47082, 47083, 47086, 47087, + 47089, 47090, 47091, 47093, 47094, 47095, 47096, 47097, 47098, 47099, + 47102, 47106, 47107, 47108, 47109, 47110, 47114, 47115, 47117, 47118, + 47119, 47121, 47122, 47123, 47124, 47125, 47126, 47127, 47130, 47132, + 47134, 47135, 47136, 47137, 47138, 47139, 47142, 47143, 47145, 47146, + 47147, 47149, 47150, 47151, 47152, 47153, 47154, 47155, 47158, 47162, + 47163, 47164, 47165, 47166, 47167, 47169, 47170, 47171, 47173, 47174, + 47175, 47176, 47177, 47178, 47179, 47180, 47181, 47182, 47183, 47184, + 47186, 47188, 47189, 47190, 47191, 47192, 47193, 47194, 47195, 47198, + 47199, 47201, 47202, 47203, 47205, 47206, 47207, 47208, 47209, 47210, + 47211, 47214, 47216, 47218, 47219, 47220, 47221, 47222, 47223, 47225, + 47226, 47227, 47229, 47230, 47231, 47232, 47233, 47234, 47235, 47236, + 47237, 47238, 47239, 47240, 47241, 47242, 47243, 47244, 47246, 47247, + 47248, 47249, 47250, 47251, 47252, 47253, 47254, 47255, 47256, 47257, + 47258, 47259, 47260, 47261, 47262, 47263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47264, 47265, 47266, 47267, 47268, 47269, 47270, 47271, + 47273, 47274, 47275, 47276, 47277, 47278, 47279, 47281, 47282, 47283, + 47285, 47286, 47287, 47289, 47290, 47291, 47292, 47293, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47294, 47295, 47298, 47300, 47302, 47303, + 47304, 47305, 47306, 47307, 47309, 47310, 47311, 47313, 47314, 47315, + 47317, 47318, 47319, 47320, 47321, 47322, 47323, 47324, 47326, 47328, + 47330, 47331, 47332, 47333, 47334, 47335, 47338, 47339, 47341, 47342, + 47343, 47345, 47346, 47347, 47348, 47349, 47350, 47351, 47354, 47356, + 47358, 47359, 47360, 47361, 47362, 47363, 47365, 47366, 47367, 47368, + 47369, 47370, 47371, 47372, 47373, 47374, 47375, 47376, 47377, 47378, + 47379, 47380, 47381, 47382, 47383, 47385, 47386, 47387, 47388, 47389, + 47390, 47391, 47393, 47394, 47395, 47396, 47397, 47398, 47399, 47400, + 47401, 47402, 47403, 47404, 47405, 47406, 47407, 47408, 47409, 47410, + 47411, 47412, 47413, 47414, 47415, 47416, 47417, 47418, 47419, 47422, + 47423, 47425, 47426, 47427, 47429, 47430, 47431, 47432, 47433, 47434, + 47435, 47437, 47438, 47440, 47442, 47443, 47444, 47445, 47446, 47447, + 47450, 47451, 47453, 47454, 47455, 47457, 47458, 47459, 47460, 47461, + 47462, 47463, 47466, 47468, 47470, 47471, 47472, 47473, 47474, 47475, + 47478, 47479, 47481, 47482, 47483, 47485, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47486, 47487, 47488, 47489, 47490, 47491, 47494, 47496, + 47499, 47500, 47503, 47504, 47505, 47506, 47507, 47508, 47509, 47510, + 47511, 47512, 47513, 47514, 47515, 47516, 47517, 47518, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47519, 47520, 47521, 47522, 47523, 47524, + 47525, 47526, 47527, 47528, 47529, 47530, 47531, 47534, 47535, 47537, + 47538, 47539, 47541, 47542, 47543, 47544, 47545, 47546, 47547, 47550, + 47552, 47554, 47555, 47556, 47557, 47558, 47559, 47562, 47563, 47565, + 47571, 47572, 47573, 47574, 47575, 47578, 47580, 47583, 47584, 47586, + 47590, 47591, 47593, 47594, 47595, 47597, 47598, 47599, 47600, 47601, + 47602, 47603, 47606, 47611, 47612, 47613, 47614, 47615, 47618, 47619, + 47620, 47621, 47622, 47623, 47625, 47626, 47627, 47628, 47629, 47630, + 47631, 47632, 47633, 47634, 47635, 47636, 47638, 47639, 47640, 47641, + 47642, 47643, 47644, 47645, 47646, 47647, 47648, 47649, 47650, 47651, + 47652, 47653, 47654, 47655, 47656, 47657, 47658, 47659, 47660, 47661, + 47662, 47663, 47664, 47665, 47666, 47667, 47668, 47669, 47670, 47671, + 47674, 47675, 47677, 47678, 47679, 47681, 47683, 47684, 47685, 47686, + 47687, 47690, 47692, 47695, 47696, 47697, 47698, 47702, 47703, 47705, + 47706, 47707, 47709, 47710, 47711, 47712, 47713, 47714, 47715, 47718, + 47722, 47723, 47724, 47725, 47726, 47727, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47730, 47731, 47733, 47734, 47735, 47737, 47738, 47739, + 47740, 47741, 47742, 47743, 47744, 47745, 47746, 47750, 47752, 47753, + 47754, 47755, 47757, 47758, 47759, 47760, 47761, 47762, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47763, 47764, 47765, 47766, 47767, 47768, + 47769, 47770, 47771, 47772, 47773, 47774, 47775, 47776, 47777, 47778, + 47779, 47780, 47781, 47782, 47783, 47786, 47789, 47790, 47791, 47793, + 47795, 47796, 47797, 47798, 47799, 47802, 47804, 47806, 47807, 47808, + 47809, 47810, 47811, 47813, 47814, 47815, 47817, 47818, 47819, 47820, + 47821, 47822, 47823, 47824, 47825, 47826, 47827, 47828, 47829, 47830, + 47831, 47834, 47835, 47836, 47837, 47838, 47839, 47840, 47841, 47842, + 47843, 47844, 47845, 47846, 47847, 47848, 47849, 47850, 47851, 47852, + 47853, 47854, 47855, 47856, 47857, 47858, 47859, 47860, 47861, 47862, + 47863, 47864, 47865, 47866, 47867, 47869, 47870, 47871, 47873, 47874, + 47875, 47877, 47878, 47879, 47880, 47881, 47882, 47883, 47884, 47886, + 47888, 47890, 47891, 47892, 47893, 47894, 47895, 47897, 47898, 47899, + 47901, 47902, 47903, 47905, 47906, 47907, 47908, 47909, 47910, 47911, + 47912, 47914, 47916, 47917, 47918, 47919, 47920, 47921, 47922, 47923, + 47927, 47929, 47930, 47935, 47936, 47937, 47938, 47939, 47942, 47944, + 47946, 47947, 47948, 47950, 47953, 47954, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 47955, 47957, 47958, 47959, 47961, 47962, 47963, 47964, + 47965, 47966, 47967, 47968, 47970, 47972, 47973, 47974, 47975, 47976, + 47977, 47978, 47979, 47981, 47982, 47983, 47984, 47985, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 47986, 47987, 47988, 47989, 47990, 47991, + 47992, 47993, 47994, 47995, 47996, 47997, 47998, 47999, 48000, 48001, + 48002, 48003, 48004, 48005, 48006, 48007, 48009, 48010, 48011, 48013, + 48014, 48015, 48017, 48018, 48019, 48020, 48021, 48022, 48023, 48024, + 48025, 48026, 48027, 48028, 48029, 48030, 48031, 48032, 48033, 48034, + 48035, 48037, 48038, 48039, 48041, 48042, 48043, 48045, 48046, 48047, + 48048, 48049, 48050, 48051, 48053, 48054, 48056, 48057, 48058, 48059, + 48060, 48061, 48062, 48063, 48065, 48066, 48067, 48069, 48070, 48071, + 48073, 48074, 48075, 48076, 48077, 48078, 48079, 48081, 48082, 48084, + 48085, 48086, 48087, 48088, 48089, 48090, 48091, 48092, 48093, 48094, + 48095, 48096, 48097, 48098, 48099, 48100, 48101, 48102, 48103, 48104, + 48105, 48106, 48107, 48108, 48109, 48110, 48111, 48112, 48113, 48114, + 48115, 48116, 48117, 48118, 48119, 48122, 48123, 48125, 48126, 48129, + 48131, 48132, 48133, 48134, 48135, 48138, 48142, 48144, 48146, 48147, + 48153, 48154, 48160, 48161, 48162, 48163, 48166, 48168, 48170, 48171, + 48172, 48174, 48175, 48178, 48179, 48181, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48182, 48183, 48185, 48186, 48187, 48188, 48189, 48190, + 48191, 48194, 48198, 48199, 48200, 48202, 48203, 48206, 48207, 48209, + 48210, 48211, 48212, 48213, 48214, 48215, 48216, 48217, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48218, 48219, 48220, 48222, 48223, 48224, + 48225, 48226, 48227, 48228, 48229, 48230, 48231, 48232, 48233, 48234, + 48235, 48236, 48237, 48238, 48239, 48240, 48241, 48242, 48243, 48244, + 48245, 48246, 48247, 48248, 48249, 48250, 48251, 48252, 48253, 48254, + 48255, 48256, 48257, 48258, 48259, 48262, 48263, 48265, 48266, 48269, + 48271, 48272, 48273, 48274, 48275, 48278, 48280, 48283, 48284, 48285, + 48286, 48287, 48290, 48291, 48293, 48294, 48297, 48298, 48299, 48300, + 48301, 48302, 48303, 48306, 48310, 48311, 48312, 48313, 48314, 48315, + 48318, 48319, 48321, 48322, 48323, 48325, 48326, 48327, 48328, 48329, + 48330, 48331, 48332, 48334, 48338, 48339, 48340, 48342, 48343, 48345, + 48346, 48347, 48349, 48350, 48351, 48352, 48353, 48354, 48355, 48356, + 48357, 48358, 48359, 48360, 48361, 48362, 48363, 48364, 48365, 48366, + 48367, 48368, 48369, 48370, 48371, 48375, 48377, 48378, 48379, 48381, + 48382, 48383, 48384, 48385, 48386, 48387, 48390, 48392, 48394, 48395, + 48396, 48397, 48398, 48399, 48401, 48402, 48403, 48405, 48406, 48407, + 48408, 48409, 48410, 48411, 48412, 48413, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48414, 48415, 48416, 48417, 48418, 48419, 48421, 48422, + 48423, 48424, 48425, 48426, 48427, 48429, 48430, 48431, 48432, 48433, + 48434, 48435, 48436, 48437, 48438, 48439, 48440, 48441, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48442, 48443, 48444, 48445, 48446, 48447, + 48449, 48450, 48451, 48452, 48453, 48454, 48455, 48458, 48459, 48461, + 48462, 48463, 48465, 48466, 48467, 48468, 48469, 48470, 48471, 48474, + 48475, 48476, 48477, 48478, 48479, 48480, 48481, 48482, 48483, 48485, + 48486, 48487, 48489, 48490, 48491, 48492, 48493, 48494, 48495, 48496, + 48497, 48498, 48499, 48500, 48501, 48502, 48503, 48504, 48505, 48506, + 48507, 48508, 48509, 48510, 48511, 48514, 48515, 48517, 48518, 48523, + 48524, 48525, 48526, 48527, 48530, 48532, 48534, 48535, 48536, 48539, + 48541, 48542, 48543, 48544, 48545, 48546, 48547, 48549, 48550, 48551, + 48552, 48553, 48554, 48555, 48556, 48557, 48558, 48559, 48561, 48562, + 48563, 48564, 48565, 48566, 48567, 48569, 48570, 48571, 48572, 48573, + 48574, 48575, 48576, 48577, 48578, 48579, 48580, 48581, 48582, 48583, + 48584, 48585, 48586, 48587, 48588, 48589, 48590, 48591, 48592, 48593, + 48594, 48595, 48598, 48599, 48601, 48602, 48603, 48605, 48606, 48607, + 48608, 48609, 48610, 48611, 48612, 48613, 48614, 48615, 48616, 48618, + 48619, 48620, 48621, 48622, 48623, 48625, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48626, 48627, 48629, 48630, 48631, 48633, 48634, 48635, + 48636, 48637, 48638, 48639, 48641, 48642, 48644, 48646, 48647, 48648, + 48649, 48650, 48651, 48654, 48655, 48657, 48658, 48659, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48661, 48662, 48663, 48664, 48665, 48666, + 48667, 48670, 48672, 48673, 48674, 48675, 48676, 48677, 48678, 48679, + 48680, 48681, 48682, 48683, 48684, 48685, 48686, 48687, 48688, 48689, + 48690, 48691, 48692, 48693, 48694, 48695, 48696, 48697, 48698, 48699, + 48700, 48701, 48702, 48703, 48704, 48705, 48706, 48707, 48710, 48711, + 48713, 48714, 48715, 48717, 48719, 48720, 48721, 48722, 48723, 48726, + 48728, 48732, 48733, 48734, 48735, 48738, 48739, 48741, 48742, 48743, + 48745, 48747, 48748, 48749, 48750, 48751, 48754, 48758, 48759, 48760, + 48761, 48762, 48766, 48767, 48769, 48770, 48771, 48773, 48774, 48775, + 48776, 48777, 48778, 48779, 48782, 48786, 48787, 48788, 48789, 48790, + 48791, 48794, 48795, 48796, 48797, 48798, 48799, 48800, 48801, 48802, + 48803, 48804, 48805, 48806, 48807, 48809, 48810, 48811, 48812, 48813, + 48814, 48815, 48816, 48817, 48818, 48819, 48820, 48821, 48822, 48823, + 48824, 48825, 48826, 48827, 48828, 48829, 48830, 48831, 48832, 48833, + 48834, 48835, 48836, 48837, 48838, 48839, 48840, 48841, 48842, 48843, + 48844, 48845, 48846, 48847, 48850, 48851, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 48853, 48854, 48857, 48858, 48859, 48860, 48861, 48862, + 48863, 48865, 48866, 48870, 48871, 48872, 48873, 48874, 48875, 48877, + 48878, 48879, 48880, 48881, 48882, 48883, 48884, 48885, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 48886, 48887, 48888, 48889, 48890, 48891, + 48892, 48893, 48894, 48895, 48896, 48898, 48899, 48900, 48901, 48902, + 48903, 48906, 48907, 48908, 48909, 48910, 48911, 48912, 48913, 48914, + 48915, 48916, 48917, 48918, 48919, 48922, 48926, 48927, 48928, 48929, + 48930, 48931, 48932, 48933, 48934, 48935, 48936, 48937, 48938, 48939, + 48940, 48941, 48942, 48943, 48944, 48945, 48946, 48947, 48948, 48949, + 48950, 48951, 48952, 48953, 48954, 48955, 48956, 48957, 48958, 48959, + 48962, 48963, 48965, 48966, 48967, 48969, 48970, 48971, 48972, 48973, + 48974, 48975, 48978, 48979, 48980, 48982, 48983, 48984, 48985, 48986, + 48987, 48988, 48989, 48990, 48991, 48992, 48993, 48994, 48995, 48996, + 48997, 48998, 48999, 49000, 49001, 49002, 49003, 49004, 49005, 49006, + 49007, 49008, 49009, 49010, 49011, 49012, 49013, 49014, 49015, 49016, + 49017, 49018, 49019, 49020, 49021, 49022, 49023, 49024, 49025, 49026, + 49027, 49028, 49029, 49030, 49031, 49032, 49033, 49034, 49035, 49036, + 49037, 49038, 49039, 49040, 49041, 49042, 49043, 49045, 49046, 49047, + 49048, 49049, 49050, 49051, 49052, 49053, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49054, 49055, 49056, 49057, 49058, 49059, 49060, 49061, + 49062, 49063, 49064, 49065, 49066, 49067, 49068, 49069, 49070, 49071, + 49073, 49074, 49075, 49076, 49077, 49078, 49079, 49080, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49081, 49082, 49083, 49084, 49085, 49086, + 49087, 49088, 49089, 49090, 49091, 49092, 49094, 49095, 49096, 49097, + 49098, 49099, 49102, 49103, 49105, 49106, 49107, 49109, 49110, 49111, + 49112, 49113, 49114, 49115, 49117, 49118, 49120, 49122, 49123, 49124, + 49125, 49126, 49127, 49128, 49129, 49130, 49131, 49132, 49133, 49134, + 49135, 49136, 49137, 49138, 49139, 49140, 49141, 49142, 49143, 49144, + 49145, 49146, 49147, 49148, 49149, 49150, 49151, 49152, 49153, 49154, + 49155, 49156, 49157, 49158, 49159, 49160, 49161, 49162, 49163, 49164, + 49165, 49166, 49167, 49168, 49169, 49170, 49171, 49172, 49173, 49174, + 49175, 49176, 49177, 49178, 49179, 49180, 49181, 49182, 49183, 49184, + 49185, 49186, 49187, 49188, 49189, 49190, 49191, 49192, 49193, 49194, + 49195, 49196, 49197, 49198, 49199, 49200, 49201, 49202, 49203, 49204, + 49205, 49206, 49207, 49208, 49209, 49210, 49211, 49213, 49214, 49215, + 49216, 49217, 49218, 49219, 49220, 49221, 49222, 49223, 49224, 49225, + 49226, 49227, 49228, 49229, 49230, 49231, 49232, 49234, 49235, 49236, + 49237, 49238, 49239, 49241, 49242, 49243, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49245, 49246, 49247, 49249, 49250, 49251, 49252, 49253, + 49254, 49255, 49258, 49259, 49260, 49261, 49262, 49263, 49264, 49265, + 49266, 49267, 49268, 49269, 49270, 49271, 49272, 49273, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49274, 49275, 49276, 49277, 49278, 49279, + 49280, 49281, 49282, 49283, 49284, 49285, 49286, 49287, 49288, 49289, + 49290, 49291, 49292, 49293, 49294, 49295, 49298, 49299, 49301, 49302, + 49303, 49305, 49306, 49307, 49308, 49309, 49310, 49311, 49314, 49316, + 49318, 49319, 49320, 49321, 49322, 49323, 49326, 49329, 49330, 49335, + 49336, 49337, 49338, 49339, 49342, 49346, 49347, 49348, 49350, 49351, + 49354, 49355, 49357, 49358, 49359, 49361, 49362, 49363, 49364, 49365, + 49366, 49367, 49370, 49374, 49375, 49376, 49377, 49378, 49379, 49382, + 49383, 49385, 49386, 49387, 49389, 49390, 49391, 49392, 49393, 49394, + 49395, 49398, 49400, 49402, 49403, 49404, 49405, 49406, 49407, 49409, + 49410, 49411, 49413, 49414, 49415, 49417, 49418, 49419, 49420, 49421, + 49422, 49423, 49425, 49426, 49427, 49428, 49430, 49431, 49432, 49433, + 49434, 49435, 49441, 49442, 49445, 49448, 49449, 49450, 49451, 49454, + 49458, 49459, 49460, 49461, 49463, 49466, 49467, 49469, 49470, 49471, + 49473, 49474, 49475, 49476, 49477, 49478, 49479, 49482, 49486, 49487, + 49488, 49489, 49490, 49491, 49494, 49495, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49497, 49498, 49499, 49501, 49502, 49503, 49504, 49505, + 49506, 49507, 49510, 49514, 49515, 49516, 49517, 49518, 49519, 49521, + 49522, 49523, 49525, 49526, 49527, 49529, 49530, 49531, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49532, 49533, 49534, 49535, 49536, 49537, + 49538, 49539, 49540, 49542, 49543, 49544, 49545, 49546, 49547, 49551, + 49553, 49554, 49555, 49557, 49559, 49560, 49561, 49562, 49563, 49566, + 49568, 49570, 49571, 49572, 49574, 49575, 49578, 49579, 49581, 49582, + 49583, 49585, 49586, 49587, 49588, 49589, 49590, 49591, 49592, 49593, + 49594, 49595, 49596, 49598, 49599, 49600, 49601, 49602, 49603, 49605, + 49606, 49607, 49609, 49610, 49611, 49613, 49614, 49615, 49616, 49617, + 49618, 49619, 49621, 49622, 49625, 49626, 49627, 49628, 49629, 49630, + 49631, 49633, 49634, 49635, 49637, 49638, 49639, 49641, 49642, 49643, + 49644, 49645, 49646, 49647, 49650, 49652, 49653, 49654, 49655, 49656, + 49657, 49658, 49659, 49662, 49663, 49665, 49666, 49667, 49669, 49670, + 49671, 49672, 49673, 49674, 49675, 49678, 49680, 49682, 49683, 49684, + 49685, 49686, 49687, 49690, 49691, 49693, 49694, 49697, 49698, 49699, + 49700, 49701, 49702, 49703, 49706, 49708, 49710, 49712, 49715, 49717, + 49718, 49719, 49720, 49721, 49722, 49723, 49724, 49725, 49726, 49727, + 49728, 49729, 49730, 49731, 49732, 49733, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49734, 49735, 49737, 49738, 49739, 49740, 49741, 49742, + 49743, 49746, 49747, 49749, 49750, 49751, 49753, 49754, 49755, 49756, + 49757, 49758, 49759, 49761, 49762, 49763, 49764, 49766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49767, 49768, 49769, 49770, 49771, 49774, + 49775, 49777, 49778, 49779, 49781, 49782, 49783, 49784, 49785, 49786, + 49787, 49790, 49792, 49794, 49795, 49796, 49797, 49798, 49799, 49802, + 49803, 49804, 49805, 49806, 49807, 49809, 49810, 49811, 49812, 49813, + 49814, 49815, 49817, 49818, 49820, 49822, 49823, 49824, 49825, 49826, + 49827, 49830, 49831, 49833, 49834, 49835, 49838, 49839, 49840, 49841, + 49842, 49843, 49846, 49848, 49850, 49851, 49852, 49853, 49854, 49855, + 49856, 49857, 49858, 49859, 49860, 49861, 49862, 49863, 49864, 49865, + 49866, 49867, 49868, 49869, 49870, 49871, 49872, 49873, 49874, 49875, + 49876, 49877, 49878, 49879, 49880, 49881, 49882, 49883, 49886, 49887, + 49889, 49890, 49893, 49894, 49895, 49896, 49897, 49898, 49902, 49904, + 49906, 49907, 49908, 49909, 49911, 49914, 49917, 49918, 49919, 49921, + 49922, 49923, 49924, 49925, 49926, 49927, 49930, 49931, 49934, 49935, + 49936, 49937, 49938, 49942, 49943, 49945, 49946, 49947, 49949, 49950, + 49951, 49952, 49953, 49954, 49955, 49958, 49959, 49962, 49963, 49964, + 49965, 49966, 49967, 49968, 49969, 49970, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 49971, 49972, 49973, 49974, 49975, 49976, 49977, 49978, + 49979, 49980, 49981, 49982, 49983, 49984, 49985, 49986, 49987, 49988, + 49990, 49991, 49992, 49993, 49994, 49995, 49996, 49997, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 49998, 49999, 50000, 50001, 50002, 50003, + 50004, 50005, 50006, 50007, 50008, 50009, 50010, 50011, 50012, 50013, + 50014, 50015, 50016, 50017, 50018, 50019, 50020, 50021, 50022, 50023, + 50026, 50027, 50029, 50030, 50031, 50033, 50035, 50036, 50037, 50038, + 50039, 50042, 50043, 50046, 50047, 50048, 50049, 50050, 50051, 50053, + 50054, 50055, 50057, 50058, 50059, 50061, 50062, 50063, 50064, 50065, + 50066, 50067, 50068, 50069, 50070, 50071, 50072, 50073, 50074, 50075, + 50076, 50077, 50078, 50079, 50080, 50081, 50082, 50083, 50084, 50085, + 50086, 50087, 50088, 50089, 50090, 50091, 50092, 50093, 50094, 50095, + 50096, 50097, 50098, 50099, 50100, 50101, 50102, 50103, 50104, 50105, + 50106, 50107, 50108, 50109, 50110, 50111, 50113, 50114, 50115, 50116, + 50117, 50118, 50119, 50120, 50121, 50122, 50123, 50124, 50125, 50126, + 50127, 50128, 50129, 50130, 50131, 50132, 50133, 50134, 50135, 50138, + 50139, 50141, 50142, 50145, 50147, 50148, 50149, 50150, 50151, 50154, + 50155, 50156, 50158, 50159, 50160, 50161, 50162, 50163, 50166, 50167, + 50169, 50170, 50171, 50172, 50173, 50174, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50175, 50176, 50177, 50178, 50179, 50180, 50181, 50182, + 50183, 50185, 50186, 50187, 50188, 50189, 50190, 50191, 50193, 50194, + 50195, 50196, 50197, 50198, 50199, 50200, 50201, 50202, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50203, 50204, 50205, 50206, 50207, 50208, + 50209, 50210, 50211, 50213, 50214, 50215, 50216, 50217, 50218, 50219, + 50221, 50222, 50223, 50225, 50226, 50227, 50229, 50230, 50231, 50232, + 50233, 50234, 50235, 50238, 50239, 50240, 50241, 50242, 50243, 50244, + 50245, 50246, 50247, 50249, 50250, 50251, 50252, 50253, 50254, 50255, + 50256, 50257, 50258, 50259, 50260, 50261, 50262, 50263, 50264, 50265, + 50266, 50267, 50268, 50269, 50270, 50271, 50272, 50273, 50274, 50275, + 50278, 50279, 50281, 50282, 50283, 50285, 50286, 50287, 50288, 50289, + 50290, 50291, 50294, 50295, 50296, 50298, 50299, 50300, 50301, 50302, + 50303, 50305, 50306, 50307, 50308, 50309, 50310, 50311, 50312, 50313, + 50314, 50315, 50316, 50317, 50318, 50319, 50320, 50321, 50322, 50323, + 50325, 50326, 50327, 50328, 50329, 50330, 50331, 50333, 50334, 50335, + 50336, 50337, 50338, 50339, 50340, 50341, 50342, 50343, 50344, 50345, + 50346, 50347, 50348, 50349, 50350, 50351, 50352, 50353, 50354, 50355, + 50356, 50357, 50358, 50359, 50361, 50362, 50363, 50365, 50366, 50367, + 50368, 50369, 50370, 50371, 50372, 50373, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50374, 50375, 50376, 50377, 50378, 50379, 50380, 50381, + 50382, 50383, 50384, 50385, 50386, 50387, 50388, 50389, 50390, 50391, + 50392, 50393, 50394, 50395, 50396, 50397, 50398, 50399, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50400, 50401, 50402, 50403, 50404, 50405, + 50406, 50407, 50408, 50410, 50411, 50412, 50413, 50414, 50415, 50418, + 50419, 50421, 50422, 50423, 50425, 50427, 50428, 50429, 50430, 50434, + 50435, 50436, 50437, 50438, 50439, 50440, 50441, 50442, 50443, 50445, + 50446, 50447, 50449, 50450, 50451, 50453, 50454, 50455, 50456, 50457, + 50458, 50459, 50461, 50462, 50463, 50464, 50465, 50466, 50467, 50468, + 50469, 50470, 50471, 50474, 50475, 50477, 50478, 50479, 50481, 50482, + 50483, 50484, 50485, 50486, 50487, 50490, 50492, 50494, 50495, 50496, + 50497, 50498, 50499, 50502, 50503, 50507, 50511, 50512, 50513, 50514, + 50518, 50522, 50523, 50524, 50527, 50530, 50531, 50533, 50534, 50535, + 50537, 50538, 50539, 50540, 50541, 50542, 50543, 50546, 50550, 50551, + 50552, 50553, 50554, 50555, 50558, 50559, 50561, 50562, 50563, 50565, + 50566, 50568, 50569, 50570, 50571, 50574, 50576, 50578, 50579, 50580, + 50582, 50585, 50586, 50587, 50589, 50590, 50591, 50593, 50594, 50595, + 50596, 50597, 50598, 50599, 50600, 50602, 50603, 50604, 50605, 50606, + 50607, 50608, 50609, 50610, 50611, 50614, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50615, 50618, 50623, 50624, 50625, 50626, 50627, 50635, + 50637, 50639, 50642, 50643, 50645, 50646, 50647, 50649, 50650, 50651, + 50652, 50653, 50654, 50655, 50658, 50660, 50662, 50663, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50664, 50665, 50666, 50667, 50671, 50673, + 50674, 50675, 50677, 50680, 50681, 50682, 50683, 50690, 50691, 50692, + 50697, 50698, 50699, 50701, 50702, 50703, 50705, 50706, 50707, 50708, + 50709, 50710, 50711, 50714, 50717, 50718, 50719, 50720, 50721, 50722, + 50723, 50726, 50727, 50729, 50730, 50731, 50735, 50737, 50738, 50742, + 50744, 50746, 50748, 50749, 50750, 50751, 50754, 50755, 50757, 50758, + 50759, 50761, 50762, 50763, 50764, 50765, 50766, 50767, 50770, 50774, + 50775, 50776, 50777, 50778, 50779, 50782, 50783, 50785, 50786, 50787, + 50788, 50789, 50790, 50791, 50792, 50793, 50794, 50795, 50797, 50798, + 50800, 50802, 50803, 50804, 50805, 50806, 50807, 50810, 50811, 50813, + 50814, 50815, 50817, 50818, 50819, 50820, 50821, 50822, 50823, 50826, + 50828, 50830, 50831, 50832, 50833, 50834, 50835, 50838, 50839, 50841, + 50842, 50843, 50845, 50846, 50847, 50848, 50849, 50850, 50851, 50854, + 50856, 50858, 50859, 50860, 50861, 50862, 50863, 50866, 50867, 50869, + 50870, 50871, 50875, 50876, 50877, 50878, 50879, 50882, 50884, 50886, + 50887, 50888, 50889, 50890, 50891, 50894, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 50895, 50897, 50898, 50899, 50901, 50902, 50903, 50904, + 50905, 50906, 50907, 50910, 50911, 50914, 50915, 50916, 50917, 50918, + 50919, 50922, 50923, 50925, 50926, 50927, 50929, 50930, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 50931, 50932, 50933, 50934, 50935, 50938, + 50939, 50940, 50942, 50943, 50944, 50945, 50946, 50947, 50950, 50951, + 50953, 50954, 50955, 50957, 50958, 50959, 50960, 50961, 50962, 50963, + 50966, 50968, 50970, 50971, 50972, 50973, 50974, 50975, 50978, 50979, + 50981, 50982, 50983, 50985, 50986, 50987, 50988, 50989, 50990, 50991, + 50994, 50996, 50998, 51000, 51001, 51002, 51003, 51006, 51007, 51009, + 51010, 51011, 51013, 51014, 51015, 51016, 51017, 51019, 51022, 51024, + 51033, 51034, 51035, 51037, 51038, 51039, 51041, 51042, 51043, 51044, + 51045, 51046, 51047, 51049, 51050, 51052, 51053, 51054, 51055, 51056, + 51057, 51058, 51059, 51062, 51063, 51065, 51066, 51067, 51071, 51072, + 51073, 51074, 51078, 51083, 51084, 51085, 51087, 51090, 51091, 51093, + 51097, 51099, 51100, 51101, 51102, 51103, 51106, 51111, 51112, 51113, + 51114, 51115, 51118, 51119, 51121, 51122, 51123, 51125, 51126, 51127, + 51128, 51129, 51130, 51131, 51134, 51138, 51139, 51140, 51141, 51142, + 51143, 51146, 51147, 51149, 51151, 51153, 51154, 51155, 51156, 51157, + 51158, 51159, 51161, 51162, 51163, 51164, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51166, 51167, 51168, 51169, 51170, 51171, 51173, 51174, + 51175, 51177, 51178, 51179, 51181, 51182, 51183, 51184, 51185, 51186, + 51187, 51188, 51189, 51190, 51191, 51192, 51193, 51194, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51195, 51196, 51197, 51198, 51199, 51202, + 51203, 51205, 51206, 51207, 51209, 51211, 51212, 51213, 51214, 51215, + 51218, 51220, 51223, 51224, 51225, 51226, 51227, 51230, 51231, 51233, + 51234, 51235, 51237, 51238, 51239, 51240, 51241, 51242, 51243, 51246, + 51248, 51250, 51251, 51252, 51253, 51254, 51255, 51257, 51258, 51259, + 51261, 51262, 51263, 51265, 51266, 51267, 51268, 51269, 51270, 51271, + 51274, 51275, 51278, 51279, 51280, 51281, 51282, 51283, 51285, 51286, + 51287, 51288, 51289, 51290, 51291, 51292, 51293, 51294, 51295, 51296, + 51297, 51298, 51299, 51300, 51301, 51302, 51303, 51304, 51305, 51306, + 51307, 51308, 51309, 51310, 51311, 51314, 51315, 51317, 51318, 51319, + 51321, 51323, 51324, 51325, 51326, 51327, 51330, 51332, 51336, 51337, + 51338, 51342, 51343, 51344, 51345, 51346, 51347, 51349, 51350, 51351, + 51352, 51353, 51354, 51355, 51356, 51358, 51360, 51362, 51363, 51364, + 51365, 51366, 51367, 51369, 51370, 51371, 51372, 51373, 51374, 51375, + 51376, 51377, 51378, 51379, 51380, 51381, 51382, 51383, 51384, 51385, + 51386, 51387, 51390, 51391, 51392, 51393, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51394, 51395, 51397, 51398, 51399, 51401, 51402, 51403, + 51405, 51406, 51407, 51408, 51409, 51410, 51411, 51414, 51416, 51418, + 51419, 51420, 51421, 51422, 51423, 51426, 51427, 51429, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51430, 51431, 51432, 51433, 51434, 51435, + 51436, 51437, 51438, 51439, 51440, 51441, 51442, 51443, 51444, 51446, + 51447, 51448, 51449, 51450, 51451, 51454, 51455, 51457, 51458, 51459, + 51463, 51464, 51465, 51466, 51467, 51470, 12288, 12289, 12290, 183, + 8229, 8230, 168, 12291, 173, 8213, 8741, 65340, 8764, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12304, 12305, 177, 215, 247, 8800, 8804, + 8805, 8734, 8756, 176, 8242, 8243, 8451, 8491, 65504, 65505, + 65509, 9794, 9792, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 167, 8251, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, + 9632, 9651, 9650, 9661, 9660, 8594, 8592, 8593, 8595, 8596, + 12307, 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 8743, 8744, 65506, + 51472, 51474, 51475, 51476, 51477, 51478, 51479, 51481, 51482, 51483, + 51484, 51485, 51486, 51487, 51488, 51489, 51490, 51491, 51492, 51493, + 51494, 51495, 51496, 51497, 51498, 51499, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51501, 51502, 51503, 51504, 51505, 51506, 51507, 51509, + 51510, 51511, 51512, 51513, 51514, 51515, 51516, 51517, 51518, 51519, + 51520, 51521, 51522, 51523, 51524, 51525, 51526, 51527, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51528, 51529, 51530, 51531, 51532, 51533, + 51534, 51535, 51538, 51539, 51541, 51542, 51543, 51545, 51546, 51547, + 51548, 51549, 51550, 51551, 51554, 51556, 51557, 51558, 51559, 51560, + 51561, 51562, 51563, 51565, 51566, 51567, 8658, 8660, 8704, 8707, + 180, 65374, 711, 728, 733, 730, 729, 184, 731, 161, + 191, 720, 8750, 8721, 8719, 164, 8457, 8240, 9665, 9664, + 9655, 9654, 9828, 9824, 9825, 9829, 9831, 9827, 8857, 9672, + 9635, 9680, 9681, 9618, 9636, 9637, 9640, 9639, 9638, 9641, + 9832, 9743, 9742, 9756, 9758, 182, 8224, 8225, 8597, 8599, + 8601, 8598, 8600, 9837, 9833, 9834, 9836, 12927, 12828, 8470, + 13255, 8482, 13250, 13272, 8481, 8364, 174, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51569, 51570, 51571, 51573, 51574, 51575, 51576, 51577, 51578, 51579, + 51581, 51582, 51583, 51584, 51585, 51586, 51587, 51588, 51589, 51590, + 51591, 51594, 51595, 51597, 51598, 51599, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51601, 51602, 51603, 51604, 51605, 51606, 51607, 51610, + 51612, 51614, 51615, 51616, 51617, 51618, 51619, 51620, 51621, 51622, + 51623, 51624, 51625, 51626, 51627, 51628, 51629, 51630, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51631, 51632, 51633, 51634, 51635, 51636, + 51637, 51638, 51639, 51640, 51641, 51642, 51643, 51644, 51645, 51646, + 51647, 51650, 51651, 51653, 51654, 51657, 51659, 51660, 51661, 51662, + 51663, 51666, 51668, 51671, 51672, 51675, 65281, 65282, 65283, 65284, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65510, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 51678, 51679, 51681, 51683, 51685, 51686, 51688, 51689, 51690, 51691, + 51694, 51698, 51699, 51700, 51701, 51702, 51703, 51706, 51707, 51709, + 51710, 51711, 51713, 51714, 51715, 51716, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51717, 51718, 51719, 51722, 51726, 51727, 51728, 51729, + 51730, 51731, 51733, 51734, 51735, 51737, 51738, 51739, 51740, 51741, + 51742, 51743, 51744, 51745, 51746, 51747, 51748, 51749, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51750, 51751, 51752, 51754, 51755, 51756, + 51757, 51758, 51759, 51760, 51761, 51762, 51763, 51764, 51765, 51766, + 51767, 51768, 51769, 51770, 51771, 51772, 51773, 51774, 51775, 51776, + 51777, 51778, 51779, 51780, 51781, 51782, 12593, 12594, 12595, 12596, + 12597, 12598, 12599, 12600, 12601, 12602, 12603, 12604, 12605, 12606, + 12607, 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615, 12616, + 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625, 12626, + 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635, 12636, + 12637, 12638, 12639, 12640, 12641, 12642, 12643, 12644, 12645, 12646, + 12647, 12648, 12649, 12650, 12651, 12652, 12653, 12654, 12655, 12656, + 12657, 12658, 12659, 12660, 12661, 12662, 12663, 12664, 12665, 12666, + 12667, 12668, 12669, 12670, 12671, 12672, 12673, 12674, 12675, 12676, + 12677, 12678, 12679, 12680, 12681, 12682, 12683, 12684, 12685, 12686, + 51783, 51784, 51785, 51786, 51787, 51790, 51791, 51793, 51794, 51795, + 51797, 51798, 51799, 51800, 51801, 51802, 51803, 51806, 51810, 51811, + 51812, 51813, 51814, 51815, 51817, 51818, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51819, 51820, 51821, 51822, 51823, 51824, 51825, 51826, + 51827, 51828, 51829, 51830, 51831, 51832, 51833, 51834, 51835, 51836, + 51838, 51839, 51840, 51841, 51842, 51843, 51845, 51846, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51847, 51848, 51849, 51850, 51851, 51852, + 51853, 51854, 51855, 51856, 51857, 51858, 51859, 51860, 51861, 51862, + 51863, 51865, 51866, 51867, 51868, 51869, 51870, 51871, 51872, 51873, + 51874, 51875, 51876, 51877, 51878, 51879, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, + 8553, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, + 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, + 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 963, 964, 965, + 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51880, 51881, 51882, 51883, 51884, 51885, 51886, 51887, 51888, 51889, + 51890, 51891, 51892, 51893, 51894, 51895, 51896, 51897, 51898, 51899, + 51902, 51903, 51905, 51906, 51907, 51909, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 51910, 51911, 51912, 51913, 51914, 51915, 51918, 51920, + 51922, 51924, 51925, 51926, 51927, 51930, 51931, 51932, 51933, 51934, + 51935, 51937, 51938, 51939, 51940, 51941, 51942, 51943, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 51944, 51945, 51946, 51947, 51949, 51950, + 51951, 51952, 51953, 51954, 51955, 51957, 51958, 51959, 51960, 51961, + 51962, 51963, 51964, 51965, 51966, 51967, 51968, 51969, 51970, 51971, + 51972, 51973, 51974, 51975, 51977, 51978, 9472, 9474, 9484, 9488, + 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, 9487, + 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, + 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, + 9498, 9497, 9494, 9493, 9486, 9485, 9502, 9503, 9505, 9506, + 9510, 9511, 9513, 9514, 9517, 9518, 9521, 9522, 9525, 9526, + 9529, 9530, 9533, 9534, 9536, 9537, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 51979, 51980, 51981, 51982, 51983, 51985, 51986, 51987, 51989, 51990, + 51991, 51993, 51994, 51995, 51996, 51997, 51998, 51999, 52002, 52003, + 52004, 52005, 52006, 52007, 52008, 52009, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52010, 52011, 52012, 52013, 52014, 52015, 52016, 52017, + 52018, 52019, 52020, 52021, 52022, 52023, 52024, 52025, 52026, 52027, + 52028, 52029, 52030, 52031, 52032, 52034, 52035, 52036, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52037, 52038, 52039, 52042, 52043, 52045, + 52046, 52047, 52049, 52050, 52051, 52052, 52053, 52054, 52055, 52058, + 52059, 52060, 52062, 52063, 52064, 52065, 52066, 52067, 52069, 52070, + 52071, 52072, 52073, 52074, 52075, 52076, 13205, 13206, 13207, 8467, + 13208, 13252, 13219, 13220, 13221, 13222, 13209, 13210, 13211, 13212, + 13213, 13214, 13215, 13216, 13217, 13218, 13258, 13197, 13198, 13199, + 13263, 13192, 13193, 13256, 13223, 13224, 13232, 13233, 13234, 13235, + 13236, 13237, 13238, 13239, 13240, 13241, 13184, 13185, 13186, 13187, + 13188, 13242, 13243, 13244, 13245, 13246, 13247, 13200, 13201, 13202, + 13203, 13204, 8486, 13248, 13249, 13194, 13195, 13196, 13270, 13253, + 13229, 13230, 13231, 13275, 13225, 13226, 13227, 13228, 13277, 13264, + 13267, 13251, 13257, 13276, 13254, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52077, 52078, 52079, 52080, 52081, 52082, 52083, 52084, 52085, 52086, + 52087, 52090, 52091, 52092, 52093, 52094, 52095, 52096, 52097, 52098, + 52099, 52100, 52101, 52102, 52103, 52104, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52105, 52106, 52107, 52108, 52109, 52110, 52111, 52112, + 52113, 52114, 52115, 52116, 52117, 52118, 52119, 52120, 52121, 52122, + 52123, 52125, 52126, 52127, 52128, 52129, 52130, 52131, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52132, 52133, 52134, 52135, 52136, 52137, + 52138, 52139, 52140, 52141, 52142, 52143, 52144, 52145, 52146, 52147, + 52148, 52149, 52150, 52151, 52153, 52154, 52155, 52156, 52157, 52158, + 52159, 52160, 52161, 52162, 52163, 52164, 198, 208, 170, 294, + 0x0000, 306, 0x0000, 319, 321, 216, 338, 186, 222, 358, + 330, 0x0000, 12896, 12897, 12898, 12899, 12900, 12901, 12902, 12903, + 12904, 12905, 12906, 12907, 12908, 12909, 12910, 12911, 12912, 12913, + 12914, 12915, 12916, 12917, 12918, 12919, 12920, 12921, 12922, 12923, + 9424, 9425, 9426, 9427, 9428, 9429, 9430, 9431, 9432, 9433, + 9434, 9435, 9436, 9437, 9438, 9439, 9440, 9441, 9442, 9443, + 9444, 9445, 9446, 9447, 9448, 9449, 9312, 9313, 9314, 9315, + 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, 9324, 9325, + 9326, 189, 8531, 8532, 188, 190, 8539, 8540, 8541, 8542, + 52165, 52166, 52167, 52168, 52169, 52170, 52171, 52172, 52173, 52174, + 52175, 52176, 52177, 52178, 52179, 52181, 52182, 52183, 52184, 52185, + 52186, 52187, 52188, 52189, 52190, 52191, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52192, 52193, 52194, 52195, 52197, 52198, 52200, 52202, + 52203, 52204, 52205, 52206, 52207, 52208, 52209, 52210, 52211, 52212, + 52213, 52214, 52215, 52216, 52217, 52218, 52219, 52220, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52221, 52222, 52223, 52224, 52225, 52226, + 52227, 52228, 52229, 52230, 52231, 52232, 52233, 52234, 52235, 52238, + 52239, 52241, 52242, 52243, 52245, 52246, 52247, 52248, 52249, 52250, + 52251, 52254, 52255, 52256, 52259, 52260, 230, 273, 240, 295, + 305, 307, 312, 320, 322, 248, 339, 223, 254, 359, + 331, 329, 12800, 12801, 12802, 12803, 12804, 12805, 12806, 12807, + 12808, 12809, 12810, 12811, 12812, 12813, 12814, 12815, 12816, 12817, + 12818, 12819, 12820, 12821, 12822, 12823, 12824, 12825, 12826, 12827, + 9372, 9373, 9374, 9375, 9376, 9377, 9378, 9379, 9380, 9381, + 9382, 9383, 9384, 9385, 9386, 9387, 9388, 9389, 9390, 9391, + 9392, 9393, 9394, 9395, 9396, 9397, 9332, 9333, 9334, 9335, + 9336, 9337, 9338, 9339, 9340, 9341, 9342, 9343, 9344, 9345, + 9346, 185, 178, 179, 8308, 8319, 8321, 8322, 8323, 8324, + 52261, 52262, 52266, 52267, 52269, 52271, 52273, 52274, 52275, 52276, + 52277, 52278, 52279, 52282, 52287, 52288, 52289, 52290, 52291, 52294, + 52295, 52297, 52298, 52299, 52301, 52302, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52303, 52304, 52305, 52306, 52307, 52310, 52314, 52315, + 52316, 52317, 52318, 52319, 52321, 52322, 52323, 52325, 52327, 52329, + 52330, 52331, 52332, 52333, 52334, 52335, 52337, 52338, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52339, 52340, 52342, 52343, 52344, 52345, + 52346, 52347, 52348, 52349, 52350, 52351, 52352, 52353, 52354, 52355, + 52356, 52357, 52358, 52359, 52360, 52361, 52362, 52363, 52364, 52365, + 52366, 52367, 52368, 52369, 52370, 52371, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52372, 52373, 52374, 52375, 52378, 52379, 52381, 52382, 52383, 52385, + 52386, 52387, 52388, 52389, 52390, 52391, 52394, 52398, 52399, 52400, + 52401, 52402, 52403, 52406, 52407, 52409, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52410, 52411, 52413, 52414, 52415, 52416, 52417, 52418, + 52419, 52422, 52424, 52426, 52427, 52428, 52429, 52430, 52431, 52433, + 52434, 52435, 52437, 52438, 52439, 52440, 52441, 52442, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52443, 52444, 52445, 52446, 52447, 52448, + 52449, 52450, 52451, 52453, 52454, 52455, 52456, 52457, 52458, 52459, + 52461, 52462, 52463, 52465, 52466, 52467, 52468, 52469, 52470, 52471, + 52472, 52473, 52474, 52475, 52476, 52477, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52478, 52479, 52480, 52482, 52483, 52484, 52485, 52486, 52487, 52490, + 52491, 52493, 52494, 52495, 52497, 52498, 52499, 52500, 52501, 52502, + 52503, 52506, 52508, 52510, 52511, 52512, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52513, 52514, 52515, 52517, 52518, 52519, 52521, 52522, + 52523, 52525, 52526, 52527, 52528, 52529, 52530, 52531, 52532, 52533, + 52534, 52535, 52536, 52538, 52539, 52540, 52541, 52542, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52543, 52544, 52545, 52546, 52547, 52548, + 52549, 52550, 52551, 52552, 52553, 52554, 52555, 52556, 52557, 52558, + 52559, 52560, 52561, 52562, 52563, 52564, 52565, 52566, 52567, 52568, + 52569, 52570, 52571, 52573, 52574, 52575, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52577, 52578, 52579, 52581, 52582, 52583, 52584, 52585, 52586, 52587, + 52590, 52592, 52594, 52595, 52596, 52597, 52598, 52599, 52601, 52602, + 52603, 52604, 52605, 52606, 52607, 52608, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52609, 52610, 52611, 52612, 52613, 52614, 52615, 52617, + 52618, 52619, 52620, 52621, 52622, 52623, 52624, 52625, 52626, 52627, + 52630, 52631, 52633, 52634, 52635, 52637, 52638, 52639, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52640, 52641, 52642, 52643, 52646, 52648, + 52650, 52651, 52652, 52653, 52654, 52655, 52657, 52658, 52659, 52660, + 52661, 52662, 52663, 52664, 52665, 52666, 52667, 52668, 52669, 52670, + 52671, 52672, 52673, 52674, 52675, 52677, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52678, 52679, 52680, 52681, 52682, 52683, 52685, 52686, 52687, 52689, + 52690, 52691, 52692, 52693, 52694, 52695, 52696, 52697, 52698, 52699, + 52700, 52701, 52702, 52703, 52704, 52705, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52706, 52707, 52708, 52709, 52710, 52711, 52713, 52714, + 52715, 52717, 52718, 52719, 52721, 52722, 52723, 52724, 52725, 52726, + 52727, 52730, 52732, 52734, 52735, 52736, 52737, 52738, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52739, 52741, 52742, 52743, 52745, 52746, + 52747, 52749, 52750, 52751, 52752, 52753, 52754, 52755, 52757, 52758, + 52759, 52760, 52762, 52763, 52764, 52765, 52766, 52767, 52770, 52771, + 52773, 52774, 52775, 52777, 52778, 52779, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52780, 52781, 52782, 52783, 52786, 52788, 52790, 52791, 52792, 52793, + 52794, 52795, 52796, 52797, 52798, 52799, 52800, 52801, 52802, 52803, + 52804, 52805, 52806, 52807, 52808, 52809, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52810, 52811, 52812, 52813, 52814, 52815, 52816, 52817, + 52818, 52819, 52820, 52821, 52822, 52823, 52826, 52827, 52829, 52830, + 52834, 52835, 52836, 52837, 52838, 52839, 52842, 52844, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52846, 52847, 52848, 52849, 52850, 52851, + 52854, 52855, 52857, 52858, 52859, 52861, 52862, 52863, 52864, 52865, + 52866, 52867, 52870, 52872, 52874, 52875, 52876, 52877, 52878, 52879, + 52882, 52883, 52885, 52886, 52887, 52889, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 52890, 52891, 52892, 52893, 52894, 52895, 52898, 52902, 52903, 52904, + 52905, 52906, 52907, 52910, 52911, 52912, 52913, 52914, 52915, 52916, + 52917, 52918, 52919, 52920, 52921, 52922, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 52923, 52924, 52925, 52926, 52927, 52928, 52930, 52931, + 52932, 52933, 52934, 52935, 52936, 52937, 52938, 52939, 52940, 52941, + 52942, 52943, 52944, 52945, 52946, 52947, 52948, 52949, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 52950, 52951, 52952, 52953, 52954, 52955, + 52956, 52957, 52958, 52959, 52960, 52961, 52962, 52963, 52966, 52967, + 52969, 52970, 52973, 52974, 52975, 52976, 52977, 52978, 52979, 52982, + 52986, 52987, 52988, 52989, 52990, 52991, 44032, 44033, 44036, 44039, + 44040, 44041, 44042, 44048, 44049, 44050, 44051, 44052, 44053, 44054, + 44055, 44057, 44058, 44059, 44060, 44061, 44064, 44068, 44076, 44077, + 44079, 44080, 44081, 44088, 44089, 44092, 44096, 44107, 44109, 44116, + 44120, 44124, 44144, 44145, 44148, 44151, 44152, 44154, 44160, 44161, + 44163, 44164, 44165, 44166, 44169, 44170, 44171, 44172, 44176, 44180, + 44188, 44189, 44191, 44192, 44193, 44200, 44201, 44202, 44204, 44207, + 44208, 44216, 44217, 44219, 44220, 44221, 44225, 44228, 44232, 44236, + 44245, 44247, 44256, 44257, 44260, 44263, 44264, 44266, 44268, 44271, + 44272, 44273, 44275, 44277, 44278, 44284, 44285, 44288, 44292, 44294, + 52994, 52995, 52997, 52998, 52999, 53001, 53002, 53003, 53004, 53005, + 53006, 53007, 53010, 53012, 53014, 53015, 53016, 53017, 53018, 53019, + 53021, 53022, 53023, 53025, 53026, 53027, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53029, 53030, 53031, 53032, 53033, 53034, 53035, 53038, + 53042, 53043, 53044, 53045, 53046, 53047, 53049, 53050, 53051, 53052, + 53053, 53054, 53055, 53056, 53057, 53058, 53059, 53060, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53061, 53062, 53063, 53064, 53065, 53066, + 53067, 53068, 53069, 53070, 53071, 53072, 53073, 53074, 53075, 53078, + 53079, 53081, 53082, 53083, 53085, 53086, 53087, 53088, 53089, 53090, + 53091, 53094, 53096, 53098, 53099, 53100, 44300, 44301, 44303, 44305, + 44312, 44316, 44320, 44329, 44332, 44333, 44340, 44341, 44344, 44348, + 44356, 44357, 44359, 44361, 44368, 44372, 44376, 44385, 44387, 44396, + 44397, 44400, 44403, 44404, 44405, 44406, 44411, 44412, 44413, 44415, + 44417, 44418, 44424, 44425, 44428, 44432, 44444, 44445, 44452, 44471, + 44480, 44481, 44484, 44488, 44496, 44497, 44499, 44508, 44512, 44516, + 44536, 44537, 44540, 44543, 44544, 44545, 44552, 44553, 44555, 44557, + 44564, 44592, 44593, 44596, 44599, 44600, 44602, 44608, 44609, 44611, + 44613, 44614, 44618, 44620, 44621, 44622, 44624, 44628, 44630, 44636, + 44637, 44639, 44640, 44641, 44645, 44648, 44649, 44652, 44656, 44664, + 53101, 53102, 53103, 53106, 53107, 53109, 53110, 53111, 53113, 53114, + 53115, 53116, 53117, 53118, 53119, 53121, 53122, 53123, 53124, 53126, + 53127, 53128, 53129, 53130, 53131, 53133, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53134, 53135, 53136, 53137, 53138, 53139, 53140, 53141, + 53142, 53143, 53144, 53145, 53146, 53147, 53148, 53149, 53150, 53151, + 53152, 53154, 53155, 53156, 53157, 53158, 53159, 53161, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53162, 53163, 53164, 53165, 53166, 53167, + 53169, 53170, 53171, 53172, 53173, 53174, 53175, 53176, 53177, 53178, + 53179, 53180, 53181, 53182, 53183, 53184, 53185, 53186, 53187, 53189, + 53190, 53191, 53192, 53193, 53194, 53195, 44665, 44667, 44668, 44669, + 44676, 44677, 44684, 44732, 44733, 44734, 44736, 44740, 44748, 44749, + 44751, 44752, 44753, 44760, 44761, 44764, 44776, 44779, 44781, 44788, + 44792, 44796, 44807, 44808, 44813, 44816, 44844, 44845, 44848, 44850, + 44852, 44860, 44861, 44863, 44865, 44866, 44867, 44872, 44873, 44880, + 44892, 44893, 44900, 44901, 44921, 44928, 44932, 44936, 44944, 44945, + 44949, 44956, 44984, 44985, 44988, 44992, 44999, 45000, 45001, 45003, + 45005, 45006, 45012, 45020, 45032, 45033, 45040, 45041, 45044, 45048, + 45056, 45057, 45060, 45068, 45072, 45076, 45084, 45085, 45096, 45124, + 45125, 45128, 45130, 45132, 45134, 45139, 45140, 45141, 45143, 45145, + 53196, 53197, 53198, 53199, 53200, 53201, 53202, 53203, 53204, 53205, + 53206, 53207, 53208, 53209, 53210, 53211, 53212, 53213, 53214, 53215, + 53218, 53219, 53221, 53222, 53223, 53225, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53226, 53227, 53228, 53229, 53230, 53231, 53234, 53236, + 53238, 53239, 53240, 53241, 53242, 53243, 53245, 53246, 53247, 53249, + 53250, 53251, 53253, 53254, 53255, 53256, 53257, 53258, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53259, 53260, 53261, 53262, 53263, 53264, + 53266, 53267, 53268, 53269, 53270, 53271, 53273, 53274, 53275, 53276, + 53277, 53278, 53279, 53280, 53281, 53282, 53283, 53284, 53285, 53286, + 53287, 53288, 53289, 53290, 53291, 53292, 45149, 45180, 45181, 45184, + 45188, 45196, 45197, 45199, 45201, 45208, 45209, 45210, 45212, 45215, + 45216, 45217, 45218, 45224, 45225, 45227, 45228, 45229, 45230, 45231, + 45233, 45235, 45236, 45237, 45240, 45244, 45252, 45253, 45255, 45256, + 45257, 45264, 45265, 45268, 45272, 45280, 45285, 45320, 45321, 45323, + 45324, 45328, 45330, 45331, 45336, 45337, 45339, 45340, 45341, 45347, + 45348, 45349, 45352, 45356, 45364, 45365, 45367, 45368, 45369, 45376, + 45377, 45380, 45384, 45392, 45393, 45396, 45397, 45400, 45404, 45408, + 45432, 45433, 45436, 45440, 45442, 45448, 45449, 45451, 45453, 45458, + 45459, 45460, 45464, 45468, 45480, 45516, 45520, 45524, 45532, 45533, + 53294, 53295, 53296, 53297, 53298, 53299, 53302, 53303, 53305, 53306, + 53307, 53309, 53310, 53311, 53312, 53313, 53314, 53315, 53318, 53320, + 53322, 53323, 53324, 53325, 53326, 53327, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53329, 53330, 53331, 53333, 53334, 53335, 53337, 53338, + 53339, 53340, 53341, 53342, 53343, 53345, 53346, 53347, 53348, 53349, + 53350, 53351, 53352, 53353, 53354, 53355, 53358, 53359, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53361, 53362, 53363, 53365, 53366, 53367, + 53368, 53369, 53370, 53371, 53374, 53375, 53376, 53378, 53379, 53380, + 53381, 53382, 53383, 53384, 53385, 53386, 53387, 53388, 53389, 53390, + 53391, 53392, 53393, 53394, 53395, 53396, 45535, 45544, 45545, 45548, + 45552, 45561, 45563, 45565, 45572, 45573, 45576, 45579, 45580, 45588, + 45589, 45591, 45593, 45600, 45620, 45628, 45656, 45660, 45664, 45672, + 45673, 45684, 45685, 45692, 45700, 45701, 45705, 45712, 45713, 45716, + 45720, 45721, 45722, 45728, 45729, 45731, 45733, 45734, 45738, 45740, + 45744, 45748, 45768, 45769, 45772, 45776, 45778, 45784, 45785, 45787, + 45789, 45794, 45796, 45797, 45798, 45800, 45803, 45804, 45805, 45806, + 45807, 45811, 45812, 45813, 45815, 45816, 45817, 45818, 45819, 45823, + 45824, 45825, 45828, 45832, 45840, 45841, 45843, 45844, 45845, 45852, + 45908, 45909, 45910, 45912, 45915, 45916, 45918, 45919, 45924, 45925, + 53397, 53398, 53399, 53400, 53401, 53402, 53403, 53404, 53405, 53406, + 53407, 53408, 53409, 53410, 53411, 53414, 53415, 53417, 53418, 53419, + 53421, 53422, 53423, 53424, 53425, 53426, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53427, 53430, 53432, 53434, 53435, 53436, 53437, 53438, + 53439, 53442, 53443, 53445, 53446, 53447, 53450, 53451, 53452, 53453, + 53454, 53455, 53458, 53462, 53463, 53464, 53465, 53466, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53467, 53470, 53471, 53473, 53474, 53475, + 53477, 53478, 53479, 53480, 53481, 53482, 53483, 53486, 53490, 53491, + 53492, 53493, 53494, 53495, 53497, 53498, 53499, 53500, 53501, 53502, + 53503, 53504, 53505, 53506, 53507, 53508, 45927, 45929, 45931, 45934, + 45936, 45937, 45940, 45944, 45952, 45953, 45955, 45956, 45957, 45964, + 45968, 45972, 45984, 45985, 45992, 45996, 46020, 46021, 46024, 46027, + 46028, 46030, 46032, 46036, 46037, 46039, 46041, 46043, 46045, 46048, + 46052, 46056, 46076, 46096, 46104, 46108, 46112, 46120, 46121, 46123, + 46132, 46160, 46161, 46164, 46168, 46176, 46177, 46179, 46181, 46188, + 46208, 46216, 46237, 46244, 46248, 46252, 46261, 46263, 46265, 46272, + 46276, 46280, 46288, 46293, 46300, 46301, 46304, 46307, 46308, 46310, + 46316, 46317, 46319, 46321, 46328, 46356, 46357, 46360, 46363, 46364, + 46372, 46373, 46375, 46376, 46377, 46378, 46384, 46385, 46388, 46392, + 53509, 53510, 53511, 53512, 53513, 53514, 53515, 53516, 53518, 53519, + 53520, 53521, 53522, 53523, 53524, 53525, 53526, 53527, 53528, 53529, + 53530, 53531, 53532, 53533, 53534, 53535, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53536, 53537, 53538, 53539, 53540, 53541, 53542, 53543, + 53544, 53545, 53546, 53547, 53548, 53549, 53550, 53551, 53554, 53555, + 53557, 53558, 53559, 53561, 53563, 53564, 53565, 53566, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53567, 53570, 53574, 53575, 53576, 53577, + 53578, 53579, 53582, 53583, 53585, 53586, 53587, 53589, 53590, 53591, + 53592, 53593, 53594, 53595, 53598, 53600, 53602, 53603, 53604, 53605, + 53606, 53607, 53609, 53610, 53611, 53613, 46400, 46401, 46403, 46404, + 46405, 46411, 46412, 46413, 46416, 46420, 46428, 46429, 46431, 46432, + 46433, 46496, 46497, 46500, 46504, 46506, 46507, 46512, 46513, 46515, + 46516, 46517, 46523, 46524, 46525, 46528, 46532, 46540, 46541, 46543, + 46544, 46545, 46552, 46572, 46608, 46609, 46612, 46616, 46629, 46636, + 46644, 46664, 46692, 46696, 46748, 46749, 46752, 46756, 46763, 46764, + 46769, 46804, 46832, 46836, 46840, 46848, 46849, 46853, 46888, 46889, + 46892, 46895, 46896, 46904, 46905, 46907, 46916, 46920, 46924, 46932, + 46933, 46944, 46948, 46952, 46960, 46961, 46963, 46965, 46972, 46973, + 46976, 46980, 46988, 46989, 46991, 46992, 46993, 46994, 46998, 46999, + 53614, 53615, 53616, 53617, 53618, 53619, 53620, 53621, 53622, 53623, + 53624, 53625, 53626, 53627, 53629, 53630, 53631, 53632, 53633, 53634, + 53635, 53637, 53638, 53639, 53641, 53642, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53643, 53644, 53645, 53646, 53647, 53648, 53649, 53650, + 53651, 53652, 53653, 53654, 53655, 53656, 53657, 53658, 53659, 53660, + 53661, 53662, 53663, 53666, 53667, 53669, 53670, 53671, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53673, 53674, 53675, 53676, 53677, 53678, + 53679, 53682, 53684, 53686, 53687, 53688, 53689, 53691, 53693, 53694, + 53695, 53697, 53698, 53699, 53700, 53701, 53702, 53703, 53704, 53705, + 53706, 53707, 53708, 53709, 53710, 53711, 47000, 47001, 47004, 47008, + 47016, 47017, 47019, 47020, 47021, 47028, 47029, 47032, 47047, 47049, + 47084, 47085, 47088, 47092, 47100, 47101, 47103, 47104, 47105, 47111, + 47112, 47113, 47116, 47120, 47128, 47129, 47131, 47133, 47140, 47141, + 47144, 47148, 47156, 47157, 47159, 47160, 47161, 47168, 47172, 47185, + 47187, 47196, 47197, 47200, 47204, 47212, 47213, 47215, 47217, 47224, + 47228, 47245, 47272, 47280, 47284, 47288, 47296, 47297, 47299, 47301, + 47308, 47312, 47316, 47325, 47327, 47329, 47336, 47337, 47340, 47344, + 47352, 47353, 47355, 47357, 47364, 47384, 47392, 47420, 47421, 47424, + 47428, 47436, 47439, 47441, 47448, 47449, 47452, 47456, 47464, 47465, + 53712, 53713, 53714, 53715, 53716, 53717, 53718, 53719, 53721, 53722, + 53723, 53724, 53725, 53726, 53727, 53728, 53729, 53730, 53731, 53732, + 53733, 53734, 53735, 53736, 53737, 53738, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53739, 53740, 53741, 53742, 53743, 53744, 53745, 53746, + 53747, 53749, 53750, 53751, 53753, 53754, 53755, 53756, 53757, 53758, + 53759, 53760, 53761, 53762, 53763, 53764, 53765, 53766, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53768, 53770, 53771, 53772, 53773, 53774, + 53775, 53777, 53778, 53779, 53780, 53781, 53782, 53783, 53784, 53785, + 53786, 53787, 53788, 53789, 53790, 53791, 53792, 53793, 53794, 53795, + 53796, 53797, 53798, 53799, 53800, 53801, 47467, 47469, 47476, 47477, + 47480, 47484, 47492, 47493, 47495, 47497, 47498, 47501, 47502, 47532, + 47533, 47536, 47540, 47548, 47549, 47551, 47553, 47560, 47561, 47564, + 47566, 47567, 47568, 47569, 47570, 47576, 47577, 47579, 47581, 47582, + 47585, 47587, 47588, 47589, 47592, 47596, 47604, 47605, 47607, 47608, + 47609, 47610, 47616, 47617, 47624, 47637, 47672, 47673, 47676, 47680, + 47682, 47688, 47689, 47691, 47693, 47694, 47699, 47700, 47701, 47704, + 47708, 47716, 47717, 47719, 47720, 47721, 47728, 47729, 47732, 47736, + 47747, 47748, 47749, 47751, 47756, 47784, 47785, 47787, 47788, 47792, + 47794, 47800, 47801, 47803, 47805, 47812, 47816, 47832, 47833, 47868, + 53802, 53803, 53806, 53807, 53809, 53810, 53811, 53813, 53814, 53815, + 53816, 53817, 53818, 53819, 53822, 53824, 53826, 53827, 53828, 53829, + 53830, 53831, 53833, 53834, 53835, 53836, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53837, 53838, 53839, 53840, 53841, 53842, 53843, 53844, + 53845, 53846, 53847, 53848, 53849, 53850, 53851, 53853, 53854, 53855, + 53856, 53857, 53858, 53859, 53861, 53862, 53863, 53864, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53865, 53866, 53867, 53868, 53869, 53870, + 53871, 53872, 53873, 53874, 53875, 53876, 53877, 53878, 53879, 53880, + 53881, 53882, 53883, 53884, 53885, 53886, 53887, 53890, 53891, 53893, + 53894, 53895, 53897, 53898, 53899, 53900, 47872, 47876, 47885, 47887, + 47889, 47896, 47900, 47904, 47913, 47915, 47924, 47925, 47926, 47928, + 47931, 47932, 47933, 47934, 47940, 47941, 47943, 47945, 47949, 47951, + 47952, 47956, 47960, 47969, 47971, 47980, 48008, 48012, 48016, 48036, + 48040, 48044, 48052, 48055, 48064, 48068, 48072, 48080, 48083, 48120, + 48121, 48124, 48127, 48128, 48130, 48136, 48137, 48139, 48140, 48141, + 48143, 48145, 48148, 48149, 48150, 48151, 48152, 48155, 48156, 48157, + 48158, 48159, 48164, 48165, 48167, 48169, 48173, 48176, 48177, 48180, + 48184, 48192, 48193, 48195, 48196, 48197, 48201, 48204, 48205, 48208, + 48221, 48260, 48261, 48264, 48267, 48268, 48270, 48276, 48277, 48279, + 53901, 53902, 53903, 53906, 53907, 53908, 53910, 53911, 53912, 53913, + 53914, 53915, 53917, 53918, 53919, 53921, 53922, 53923, 53925, 53926, + 53927, 53928, 53929, 53930, 53931, 53933, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 53934, 53935, 53936, 53938, 53939, 53940, 53941, 53942, + 53943, 53946, 53947, 53949, 53950, 53953, 53955, 53956, 53957, 53958, + 53959, 53962, 53964, 53965, 53966, 53967, 53968, 53969, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 53970, 53971, 53973, 53974, 53975, 53977, + 53978, 53979, 53981, 53982, 53983, 53984, 53985, 53986, 53987, 53990, + 53991, 53992, 53993, 53994, 53995, 53996, 53997, 53998, 53999, 54002, + 54003, 54005, 54006, 54007, 54009, 54010, 48281, 48282, 48288, 48289, + 48292, 48295, 48296, 48304, 48305, 48307, 48308, 48309, 48316, 48317, + 48320, 48324, 48333, 48335, 48336, 48337, 48341, 48344, 48348, 48372, + 48373, 48374, 48376, 48380, 48388, 48389, 48391, 48393, 48400, 48404, + 48420, 48428, 48448, 48456, 48457, 48460, 48464, 48472, 48473, 48484, + 48488, 48512, 48513, 48516, 48519, 48520, 48521, 48522, 48528, 48529, + 48531, 48533, 48537, 48538, 48540, 48548, 48560, 48568, 48596, 48597, + 48600, 48604, 48617, 48624, 48628, 48632, 48640, 48643, 48645, 48652, + 48653, 48656, 48660, 48668, 48669, 48671, 48708, 48709, 48712, 48716, + 48718, 48724, 48725, 48727, 48729, 48730, 48731, 48736, 48737, 48740, + 54011, 54012, 54013, 54014, 54015, 54018, 54020, 54022, 54023, 54024, + 54025, 54026, 54027, 54031, 54033, 54034, 54035, 54037, 54039, 54040, + 54041, 54042, 54043, 54046, 54050, 54051, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54052, 54054, 54055, 54058, 54059, 54061, 54062, 54063, + 54065, 54066, 54067, 54068, 54069, 54070, 54071, 54074, 54078, 54079, + 54080, 54081, 54082, 54083, 54086, 54087, 54088, 54089, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54090, 54091, 54092, 54093, 54094, 54095, + 54096, 54097, 54098, 54099, 54100, 54101, 54102, 54103, 54104, 54105, + 54106, 54107, 54108, 54109, 54110, 54111, 54112, 54113, 54114, 54115, + 54116, 54117, 54118, 54119, 54120, 54121, 48744, 48746, 48752, 48753, + 48755, 48756, 48757, 48763, 48764, 48765, 48768, 48772, 48780, 48781, + 48783, 48784, 48785, 48792, 48793, 48808, 48848, 48849, 48852, 48855, + 48856, 48864, 48867, 48868, 48869, 48876, 48897, 48904, 48905, 48920, + 48921, 48923, 48924, 48925, 48960, 48961, 48964, 48968, 48976, 48977, + 48981, 49044, 49072, 49093, 49100, 49101, 49104, 49108, 49116, 49119, + 49121, 49212, 49233, 49240, 49244, 49248, 49256, 49257, 49296, 49297, + 49300, 49304, 49312, 49313, 49315, 49317, 49324, 49325, 49327, 49328, + 49331, 49332, 49333, 49334, 49340, 49341, 49343, 49344, 49345, 49349, + 49352, 49353, 49356, 49360, 49368, 49369, 49371, 49372, 49373, 49380, + 54122, 54123, 54124, 54125, 54126, 54127, 54128, 54129, 54130, 54131, + 54132, 54133, 54134, 54135, 54136, 54137, 54138, 54139, 54142, 54143, + 54145, 54146, 54147, 54149, 54150, 54151, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54152, 54153, 54154, 54155, 54158, 54162, 54163, 54164, + 54165, 54166, 54167, 54170, 54171, 54173, 54174, 54175, 54177, 54178, + 54179, 54180, 54181, 54182, 54183, 54186, 54188, 54190, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54191, 54192, 54193, 54194, 54195, 54197, + 54198, 54199, 54201, 54202, 54203, 54205, 54206, 54207, 54208, 54209, + 54210, 54211, 54214, 54215, 54218, 54219, 54220, 54221, 54222, 54223, + 54225, 54226, 54227, 54228, 54229, 54230, 49381, 49384, 49388, 49396, + 49397, 49399, 49401, 49408, 49412, 49416, 49424, 49429, 49436, 49437, + 49438, 49439, 49440, 49443, 49444, 49446, 49447, 49452, 49453, 49455, + 49456, 49457, 49462, 49464, 49465, 49468, 49472, 49480, 49481, 49483, + 49484, 49485, 49492, 49493, 49496, 49500, 49508, 49509, 49511, 49512, + 49513, 49520, 49524, 49528, 49541, 49548, 49549, 49550, 49552, 49556, + 49558, 49564, 49565, 49567, 49569, 49573, 49576, 49577, 49580, 49584, + 49597, 49604, 49608, 49612, 49620, 49623, 49624, 49632, 49636, 49640, + 49648, 49649, 49651, 49660, 49661, 49664, 49668, 49676, 49677, 49679, + 49681, 49688, 49689, 49692, 49695, 49696, 49704, 49705, 49707, 49709, + 54231, 54233, 54234, 54235, 54236, 54237, 54238, 54239, 54240, 54242, + 54244, 54245, 54246, 54247, 54248, 54249, 54250, 54251, 54254, 54255, + 54257, 54258, 54259, 54261, 54262, 54263, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54264, 54265, 54266, 54267, 54270, 54272, 54274, 54275, + 54276, 54277, 54278, 54279, 54281, 54282, 54283, 54284, 54285, 54286, + 54287, 54288, 54289, 54290, 54291, 54292, 54293, 54294, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54295, 54296, 54297, 54298, 54299, 54300, + 54302, 54303, 54304, 54305, 54306, 54307, 54308, 54309, 54310, 54311, + 54312, 54313, 54314, 54315, 54316, 54317, 54318, 54319, 54320, 54321, + 54322, 54323, 54324, 54325, 54326, 54327, 49711, 49713, 49714, 49716, + 49736, 49744, 49745, 49748, 49752, 49760, 49765, 49772, 49773, 49776, + 49780, 49788, 49789, 49791, 49793, 49800, 49801, 49808, 49816, 49819, + 49821, 49828, 49829, 49832, 49836, 49837, 49844, 49845, 49847, 49849, + 49884, 49885, 49888, 49891, 49892, 49899, 49900, 49901, 49903, 49905, + 49910, 49912, 49913, 49915, 49916, 49920, 49928, 49929, 49932, 49933, + 49939, 49940, 49941, 49944, 49948, 49956, 49957, 49960, 49961, 49989, + 50024, 50025, 50028, 50032, 50034, 50040, 50041, 50044, 50045, 50052, + 50056, 50060, 50112, 50136, 50137, 50140, 50143, 50144, 50146, 50152, + 50153, 50157, 50164, 50165, 50168, 50184, 50192, 50212, 50220, 50224, + 54328, 54329, 54330, 54331, 54332, 54333, 54334, 54335, 54337, 54338, + 54339, 54341, 54342, 54343, 54344, 54345, 54346, 54347, 54348, 54349, + 54350, 54351, 54352, 54353, 54354, 54355, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54356, 54357, 54358, 54359, 54360, 54361, 54362, 54363, + 54365, 54366, 54367, 54369, 54370, 54371, 54373, 54374, 54375, 54376, + 54377, 54378, 54379, 54380, 54382, 54384, 54385, 54386, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54387, 54388, 54389, 54390, 54391, 54394, + 54395, 54397, 54398, 54401, 54403, 54404, 54405, 54406, 54407, 54410, + 54412, 54414, 54415, 54416, 54417, 54418, 54419, 54421, 54422, 54423, + 54424, 54425, 54426, 54427, 54428, 54429, 50228, 50236, 50237, 50248, + 50276, 50277, 50280, 50284, 50292, 50293, 50297, 50304, 50324, 50332, + 50360, 50364, 50409, 50416, 50417, 50420, 50424, 50426, 50431, 50432, + 50433, 50444, 50448, 50452, 50460, 50472, 50473, 50476, 50480, 50488, + 50489, 50491, 50493, 50500, 50501, 50504, 50505, 50506, 50508, 50509, + 50510, 50515, 50516, 50517, 50519, 50520, 50521, 50525, 50526, 50528, + 50529, 50532, 50536, 50544, 50545, 50547, 50548, 50549, 50556, 50557, + 50560, 50564, 50567, 50572, 50573, 50575, 50577, 50581, 50583, 50584, + 50588, 50592, 50601, 50612, 50613, 50616, 50617, 50619, 50620, 50621, + 50622, 50628, 50629, 50630, 50631, 50632, 50633, 50634, 50636, 50638, + 54430, 54431, 54432, 54433, 54434, 54435, 54436, 54437, 54438, 54439, + 54440, 54442, 54443, 54444, 54445, 54446, 54447, 54448, 54449, 54450, + 54451, 54452, 54453, 54454, 54455, 54456, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54457, 54458, 54459, 54460, 54461, 54462, 54463, 54464, + 54465, 54466, 54467, 54468, 54469, 54470, 54471, 54472, 54473, 54474, + 54475, 54477, 54478, 54479, 54481, 54482, 54483, 54485, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54486, 54487, 54488, 54489, 54490, 54491, + 54493, 54494, 54496, 54497, 54498, 54499, 54500, 54501, 54502, 54503, + 54505, 54506, 54507, 54509, 54510, 54511, 54513, 54514, 54515, 54516, + 54517, 54518, 54519, 54521, 54522, 54524, 50640, 50641, 50644, 50648, + 50656, 50657, 50659, 50661, 50668, 50669, 50670, 50672, 50676, 50678, + 50679, 50684, 50685, 50686, 50687, 50688, 50689, 50693, 50694, 50695, + 50696, 50700, 50704, 50712, 50713, 50715, 50716, 50724, 50725, 50728, + 50732, 50733, 50734, 50736, 50739, 50740, 50741, 50743, 50745, 50747, + 50752, 50753, 50756, 50760, 50768, 50769, 50771, 50772, 50773, 50780, + 50781, 50784, 50796, 50799, 50801, 50808, 50809, 50812, 50816, 50824, + 50825, 50827, 50829, 50836, 50837, 50840, 50844, 50852, 50853, 50855, + 50857, 50864, 50865, 50868, 50872, 50873, 50874, 50880, 50881, 50883, + 50885, 50892, 50893, 50896, 50900, 50908, 50909, 50912, 50913, 50920, + 54526, 54527, 54528, 54529, 54530, 54531, 54533, 54534, 54535, 54537, + 54538, 54539, 54541, 54542, 54543, 54544, 54545, 54546, 54547, 54550, + 54552, 54553, 54554, 54555, 54556, 54557, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54558, 54559, 54560, 54561, 54562, 54563, 54564, 54565, + 54566, 54567, 54568, 54569, 54570, 54571, 54572, 54573, 54574, 54575, + 54576, 54577, 54578, 54579, 54580, 54581, 54582, 54583, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54584, 54585, 54586, 54587, 54590, 54591, + 54593, 54594, 54595, 54597, 54598, 54599, 54600, 54601, 54602, 54603, + 54606, 54608, 54610, 54611, 54612, 54613, 54614, 54615, 54618, 54619, + 54621, 54622, 54623, 54625, 54626, 54627, 50921, 50924, 50928, 50936, + 50937, 50941, 50948, 50949, 50952, 50956, 50964, 50965, 50967, 50969, + 50976, 50977, 50980, 50984, 50992, 50993, 50995, 50997, 50999, 51004, + 51005, 51008, 51012, 51018, 51020, 51021, 51023, 51025, 51026, 51027, + 51028, 51029, 51030, 51031, 51032, 51036, 51040, 51048, 51051, 51060, + 51061, 51064, 51068, 51069, 51070, 51075, 51076, 51077, 51079, 51080, + 51081, 51082, 51086, 51088, 51089, 51092, 51094, 51095, 51096, 51098, + 51104, 51105, 51107, 51108, 51109, 51110, 51116, 51117, 51120, 51124, + 51132, 51133, 51135, 51136, 51137, 51144, 51145, 51148, 51150, 51152, + 51160, 51165, 51172, 51176, 51180, 51200, 51201, 51204, 51208, 51210, + 54628, 54630, 54631, 54634, 54636, 54638, 54639, 54640, 54641, 54642, + 54643, 54646, 54647, 54649, 54650, 54651, 54653, 54654, 54655, 54656, + 54657, 54658, 54659, 54662, 54666, 54667, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54668, 54669, 54670, 54671, 54673, 54674, 54675, 54676, + 54677, 54678, 54679, 54680, 54681, 54682, 54683, 54684, 54685, 54686, + 54687, 54688, 54689, 54690, 54691, 54692, 54694, 54695, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54696, 54697, 54698, 54699, 54700, 54701, + 54702, 54703, 54704, 54705, 54706, 54707, 54708, 54709, 54710, 54711, + 54712, 54713, 54714, 54715, 54716, 54717, 54718, 54719, 54720, 54721, + 54722, 54723, 54724, 54725, 54726, 54727, 51216, 51217, 51219, 51221, + 51222, 51228, 51229, 51232, 51236, 51244, 51245, 51247, 51249, 51256, + 51260, 51264, 51272, 51273, 51276, 51277, 51284, 51312, 51313, 51316, + 51320, 51322, 51328, 51329, 51331, 51333, 51334, 51335, 51339, 51340, + 51341, 51348, 51357, 51359, 51361, 51368, 51388, 51389, 51396, 51400, + 51404, 51412, 51413, 51415, 51417, 51424, 51425, 51428, 51445, 51452, + 51453, 51456, 51460, 51461, 51462, 51468, 51469, 51471, 51473, 51480, + 51500, 51508, 51536, 51537, 51540, 51544, 51552, 51553, 51555, 51564, + 51568, 51572, 51580, 51592, 51593, 51596, 51600, 51608, 51609, 51611, + 51613, 51648, 51649, 51652, 51655, 51656, 51658, 51664, 51665, 51667, + 54730, 54731, 54733, 54734, 54735, 54737, 54739, 54740, 54741, 54742, + 54743, 54746, 54748, 54750, 54751, 54752, 54753, 54754, 54755, 54758, + 54759, 54761, 54762, 54763, 54765, 54766, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54767, 54768, 54769, 54770, 54771, 54774, 54776, 54778, + 54779, 54780, 54781, 54782, 54783, 54786, 54787, 54789, 54790, 54791, + 54793, 54794, 54795, 54796, 54797, 54798, 54799, 54802, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54806, 54807, 54808, 54809, 54810, 54811, + 54813, 54814, 54815, 54817, 54818, 54819, 54821, 54822, 54823, 54824, + 54825, 54826, 54827, 54828, 54830, 54831, 54832, 54833, 54834, 54835, + 54836, 54837, 54838, 54839, 54842, 54843, 51669, 51670, 51673, 51674, + 51676, 51677, 51680, 51682, 51684, 51687, 51692, 51693, 51695, 51696, + 51697, 51704, 51705, 51708, 51712, 51720, 51721, 51723, 51724, 51725, + 51732, 51736, 51753, 51788, 51789, 51792, 51796, 51804, 51805, 51807, + 51808, 51809, 51816, 51837, 51844, 51864, 51900, 51901, 51904, 51908, + 51916, 51917, 51919, 51921, 51923, 51928, 51929, 51936, 51948, 51956, + 51976, 51984, 51988, 51992, 52000, 52001, 52033, 52040, 52041, 52044, + 52048, 52056, 52057, 52061, 52068, 52088, 52089, 52124, 52152, 52180, + 52196, 52199, 52201, 52236, 52237, 52240, 52244, 52252, 52253, 52257, + 52258, 52263, 52264, 52265, 52268, 52270, 52272, 52280, 52281, 52283, + 54845, 54846, 54847, 54849, 54850, 54851, 54852, 54854, 54855, 54858, + 54860, 54862, 54863, 54864, 54866, 54867, 54870, 54871, 54873, 54874, + 54875, 54877, 54878, 54879, 54880, 54881, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54882, 54883, 54884, 54885, 54886, 54888, 54890, 54891, + 54892, 54893, 54894, 54895, 54898, 54899, 54901, 54902, 54903, 54904, + 54905, 54906, 54907, 54908, 54909, 54910, 54911, 54912, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 54913, 54914, 54916, 54918, 54919, 54920, + 54921, 54922, 54923, 54926, 54927, 54929, 54930, 54931, 54933, 54934, + 54935, 54936, 54937, 54938, 54939, 54940, 54942, 54944, 54946, 54947, + 54948, 54949, 54950, 54951, 54953, 54954, 52284, 52285, 52286, 52292, + 52293, 52296, 52300, 52308, 52309, 52311, 52312, 52313, 52320, 52324, + 52326, 52328, 52336, 52341, 52376, 52377, 52380, 52384, 52392, 52393, + 52395, 52396, 52397, 52404, 52405, 52408, 52412, 52420, 52421, 52423, + 52425, 52432, 52436, 52452, 52460, 52464, 52481, 52488, 52489, 52492, + 52496, 52504, 52505, 52507, 52509, 52516, 52520, 52524, 52537, 52572, + 52576, 52580, 52588, 52589, 52591, 52593, 52600, 52616, 52628, 52629, + 52632, 52636, 52644, 52645, 52647, 52649, 52656, 52676, 52684, 52688, + 52712, 52716, 52720, 52728, 52729, 52731, 52733, 52740, 52744, 52748, + 52756, 52761, 52768, 52769, 52772, 52776, 52784, 52785, 52787, 52789, + 54955, 54957, 54958, 54959, 54961, 54962, 54963, 54964, 54965, 54966, + 54967, 54968, 54970, 54972, 54973, 54974, 54975, 54976, 54977, 54978, + 54979, 54982, 54983, 54985, 54986, 54987, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 54989, 54990, 54991, 54992, 54994, 54995, 54997, 54998, + 55000, 55002, 55003, 55004, 55005, 55006, 55007, 55009, 55010, 55011, + 55013, 55014, 55015, 55017, 55018, 55019, 55020, 55021, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55022, 55023, 55025, 55026, 55027, 55028, + 55030, 55031, 55032, 55033, 55034, 55035, 55038, 55039, 55041, 55042, + 55043, 55045, 55046, 55047, 55048, 55049, 55050, 55051, 55052, 55053, + 55054, 55055, 55056, 55058, 55059, 55060, 52824, 52825, 52828, 52831, + 52832, 52833, 52840, 52841, 52843, 52845, 52852, 52853, 52856, 52860, + 52868, 52869, 52871, 52873, 52880, 52881, 52884, 52888, 52896, 52897, + 52899, 52900, 52901, 52908, 52909, 52929, 52964, 52965, 52968, 52971, + 52972, 52980, 52981, 52983, 52984, 52985, 52992, 52993, 52996, 53000, + 53008, 53009, 53011, 53013, 53020, 53024, 53028, 53036, 53037, 53039, + 53040, 53041, 53048, 53076, 53077, 53080, 53084, 53092, 53093, 53095, + 53097, 53104, 53105, 53108, 53112, 53120, 53125, 53132, 53153, 53160, + 53168, 53188, 53216, 53217, 53220, 53224, 53232, 53233, 53235, 53237, + 53244, 53248, 53252, 53265, 53272, 53293, 53300, 53301, 53304, 53308, + 55061, 55062, 55063, 55066, 55067, 55069, 55070, 55071, 55073, 55074, + 55075, 55076, 55077, 55078, 55079, 55082, 55084, 55086, 55087, 55088, + 55089, 55090, 55091, 55094, 55095, 55097, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 55098, 55099, 55101, 55102, 55103, 55104, 55105, 55106, + 55107, 55109, 55110, 55112, 55114, 55115, 55116, 55117, 55118, 55119, + 55122, 55123, 55125, 55130, 55131, 55132, 55133, 55134, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 55135, 55138, 55140, 55142, 55143, 55144, + 55146, 55147, 55149, 55150, 55151, 55153, 55154, 55155, 55157, 55158, + 55159, 55160, 55161, 55162, 55163, 55166, 55167, 55168, 55170, 55171, + 55172, 55173, 55174, 55175, 55178, 55179, 53316, 53317, 53319, 53321, + 53328, 53332, 53336, 53344, 53356, 53357, 53360, 53364, 53372, 53373, + 53377, 53412, 53413, 53416, 53420, 53428, 53429, 53431, 53433, 53440, + 53441, 53444, 53448, 53449, 53456, 53457, 53459, 53460, 53461, 53468, + 53469, 53472, 53476, 53484, 53485, 53487, 53488, 53489, 53496, 53517, + 53552, 53553, 53556, 53560, 53562, 53568, 53569, 53571, 53572, 53573, + 53580, 53581, 53584, 53588, 53596, 53597, 53599, 53601, 53608, 53612, + 53628, 53636, 53640, 53664, 53665, 53668, 53672, 53680, 53681, 53683, + 53685, 53690, 53692, 53696, 53720, 53748, 53752, 53767, 53769, 53776, + 53804, 53805, 53808, 53812, 53820, 53821, 53823, 53825, 53832, 53852, + 55181, 55182, 55183, 55185, 55186, 55187, 55188, 55189, 55190, 55191, + 55194, 55196, 55198, 55199, 55200, 55201, 55202, 55203, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 53860, 53888, 53889, 53892, + 53896, 53904, 53905, 53909, 53916, 53920, 53924, 53932, 53937, 53944, + 53945, 53948, 53951, 53952, 53954, 53960, 53961, 53963, 53972, 53976, + 53980, 53988, 53989, 54000, 54001, 54004, 54008, 54016, 54017, 54019, + 54021, 54028, 54029, 54030, 54032, 54036, 54038, 54044, 54045, 54047, + 54048, 54049, 54053, 54056, 54057, 54060, 54064, 54072, 54073, 54075, + 54076, 54077, 54084, 54085, 54140, 54141, 54144, 54148, 54156, 54157, + 54159, 54160, 54161, 54168, 54169, 54172, 54176, 54184, 54185, 54187, + 54189, 54196, 54200, 54204, 54212, 54213, 54216, 54217, 54224, 54232, + 54241, 54243, 54252, 54253, 54256, 54260, 54268, 54269, 54271, 54273, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54280, 54301, 54336, 54340, + 54364, 54368, 54372, 54381, 54383, 54392, 54393, 54396, 54399, 54400, + 54402, 54408, 54409, 54411, 54413, 54420, 54441, 54476, 54480, 54484, + 54492, 54495, 54504, 54508, 54512, 54520, 54523, 54525, 54532, 54536, + 54540, 54548, 54549, 54551, 54588, 54589, 54592, 54596, 54604, 54605, + 54607, 54609, 54616, 54617, 54620, 54624, 54629, 54632, 54633, 54635, + 54637, 54644, 54645, 54648, 54652, 54660, 54661, 54663, 54664, 54665, + 54672, 54693, 54728, 54729, 54732, 54736, 54738, 54744, 54745, 54747, + 54749, 54756, 54757, 54760, 54764, 54772, 54773, 54775, 54777, 54784, + 54785, 54788, 54792, 54800, 54801, 54803, 54804, 54805, 54812, 54816, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 54820, 54829, 54840, 54841, + 54844, 54848, 54853, 54856, 54857, 54859, 54861, 54865, 54868, 54869, + 54872, 54876, 54887, 54889, 54896, 54897, 54900, 54915, 54917, 54924, + 54925, 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, + 54971, 54980, 54981, 54984, 54988, 54993, 54996, 54999, 55001, 55008, + 55012, 55016, 55024, 55029, 55036, 55037, 55040, 55044, 55057, 55064, + 55065, 55068, 55072, 55080, 55081, 55083, 55085, 55092, 55093, 55096, + 55100, 55108, 55111, 55113, 55120, 55121, 55124, 55126, 55127, 55128, + 55129, 55136, 55137, 55139, 55141, 55145, 55148, 55152, 55156, 55164, + 55165, 55169, 55176, 55177, 55180, 55184, 55192, 55193, 55195, 55197, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20285, 20339, 20551, 20729, + 21152, 21487, 21621, 21733, 22025, 23233, 23478, 26247, 26550, 26551, + 26607, 27468, 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, + 36040, 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, + 27580, 29647, 33050, 35258, 35282, 38307, 20355, 21002, 22718, 22904, + 23014, 24178, 24185, 25031, 25536, 26438, 26604, 26751, 28567, 30286, + 30475, 30965, 31240, 31487, 31777, 32925, 33390, 33393, 35563, 38291, + 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, 34638, 38824, + 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, 26577, 27204, + 28187, 29976, 30131, 30435, 30640, 32058, 37039, 37969, 37970, 40853, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21283, 23724, 30002, 32987, + 37440, 38296, 21083, 22536, 23004, 23713, 23831, 24247, 24378, 24394, + 24951, 27743, 30074, 30086, 31968, 32115, 32177, 32652, 33108, 33313, + 34193, 35137, 35611, 37628, 38477, 40007, 20171, 20215, 20491, 20977, + 22607, 24887, 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, + 31623, 33445, 33995, 63744, 37799, 38283, 21888, 23458, 22353, 63745, + 31923, 32697, 37301, 20520, 21435, 23621, 24040, 25298, 25454, 25818, + 25831, 28192, 28844, 31067, 36317, 36382, 63746, 36989, 37445, 37624, + 20094, 20214, 20581, 24062, 24314, 24838, 26967, 33137, 34388, 36423, + 37749, 39467, 20062, 20625, 26480, 26688, 20745, 21133, 21138, 27298, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30652, 37392, 40660, 21163, + 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, + 35233, 38548, 22533, 29309, 29356, 29956, 32121, 32365, 32937, 35211, + 35700, 36963, 40273, 25225, 27770, 28500, 32080, 32570, 35363, 20860, + 24906, 31645, 35609, 37463, 37772, 20140, 20435, 20510, 20670, 20742, + 21185, 21197, 21375, 22384, 22659, 24218, 24465, 24950, 25004, 25806, + 25964, 26223, 26299, 26356, 26775, 28039, 28805, 28913, 29855, 29861, + 29898, 30169, 30828, 30956, 31455, 31478, 32069, 32147, 32789, 32831, + 33051, 33686, 35686, 36629, 36885, 37857, 38915, 38968, 39514, 39912, + 20418, 21843, 22586, 22865, 23395, 23622, 24760, 25106, 26690, 26800, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26856, 28330, 30028, 30328, + 30926, 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, + 21476, 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, + 25911, 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, + 31295, 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, + 34996, 35493, 63747, 36764, 37678, 38599, 39015, 39640, 40723, 21741, + 26011, 26354, 26767, 31296, 35895, 40288, 22256, 22372, 23825, 26118, + 26801, 26829, 28414, 29736, 34974, 39908, 27752, 63748, 39592, 20379, + 20844, 20849, 21151, 23380, 24037, 24656, 24685, 25329, 25511, 25915, + 29657, 31354, 34467, 36002, 38799, 20018, 23521, 25096, 26524, 29916, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31185, 33747, 35463, 35506, + 36328, 36942, 37707, 38982, 24275, 27112, 34303, 37101, 63749, 20896, + 23448, 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, + 33733, 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, + 20809, 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, + 33009, 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, + 24871, 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, + 21676, 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, + 30350, 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, + 39171, 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21312, 21475, 21477, 21646, + 22036, 22389, 22434, 23495, 23943, 24272, 25084, 25304, 25937, 26552, + 26601, 27083, 27472, 27590, 27628, 27714, 28317, 28792, 29399, 29590, + 29699, 30655, 30697, 31350, 32127, 32777, 33276, 33285, 33290, 33503, + 34914, 35635, 36092, 36544, 36881, 37041, 37476, 37558, 39378, 39493, + 40169, 40407, 40860, 22283, 23616, 33738, 38816, 38827, 40628, 21531, + 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, 23470, + 24339, 31353, 31406, 33422, 36524, 20518, 21048, 21240, 21367, 22280, + 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, 36470, 38357, + 26426, 27331, 28528, 35437, 36556, 39243, 63750, 26231, 27512, 36020, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 39740, 63751, 21483, 22317, + 22862, 25542, 27131, 29674, 30789, 31418, 31429, 31998, 33909, 35215, + 36211, 36917, 38312, 21243, 22343, 30023, 31584, 33740, 37406, 63752, + 27224, 20811, 21067, 21127, 25119, 26840, 26997, 38553, 20677, 21156, + 21220, 25027, 26020, 26681, 27135, 29822, 31563, 33465, 33771, 35250, + 35641, 36817, 39241, 63753, 20170, 22935, 25810, 26129, 27278, 29748, + 31105, 31165, 33449, 34942, 34943, 35167, 63754, 37670, 20235, 21450, + 24613, 25201, 27762, 32026, 32102, 20120, 20834, 30684, 32943, 20225, + 20238, 20854, 20864, 21980, 22120, 22331, 22522, 22524, 22804, 22855, + 22931, 23492, 23696, 23822, 24049, 24190, 24524, 25216, 26071, 26083, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26398, 26399, 26462, 26827, + 26820, 27231, 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, + 29826, 29859, 30072, 30079, 30849, 30959, 31041, 31047, 31048, 31098, + 31637, 32000, 32186, 32648, 32774, 32813, 32908, 35352, 35663, 35912, + 36215, 37665, 37668, 39138, 39249, 39438, 39439, 39525, 40594, 32202, + 20342, 21513, 25326, 26708, 37329, 21931, 20794, 63755, 63756, 23068, + 25062, 63757, 25295, 25343, 63758, 63759, 63760, 63761, 63762, 63763, + 37027, 63764, 63765, 63766, 63767, 63768, 35582, 63769, 63770, 63771, + 63772, 26262, 63773, 29014, 63774, 63775, 38627, 63776, 25423, 25466, + 21335, 63777, 26511, 26976, 28275, 63778, 30007, 63779, 63780, 63781, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32013, 63782, 63783, 34930, + 22218, 23064, 63784, 63785, 63786, 63787, 63788, 20035, 63789, 20839, + 22856, 26608, 32784, 63790, 22899, 24180, 25754, 31178, 24565, 24684, + 25288, 25467, 23527, 23511, 21162, 63791, 22900, 24361, 24594, 63792, + 63793, 63794, 29785, 63795, 63796, 63797, 63798, 63799, 63800, 39377, + 63801, 63802, 63803, 63804, 63805, 63806, 63807, 63808, 63809, 63810, + 63811, 28611, 63812, 63813, 33215, 36786, 24817, 63814, 63815, 33126, + 63816, 63817, 23615, 63818, 63819, 63820, 63821, 63822, 63823, 63824, + 63825, 23273, 35365, 26491, 32016, 63826, 63827, 63828, 63829, 63830, + 63831, 33021, 63832, 63833, 23612, 27877, 21311, 28346, 22810, 33590, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20025, 20150, 20294, 21934, + 22296, 22727, 24406, 26039, 26086, 27264, 27573, 28237, 30701, 31471, + 31774, 32222, 34507, 34962, 37170, 37723, 25787, 28606, 29562, 30136, + 36948, 21846, 22349, 25018, 25812, 26311, 28129, 28251, 28525, 28601, + 30192, 32835, 33213, 34113, 35203, 35527, 35674, 37663, 27795, 30035, + 31572, 36367, 36957, 21776, 22530, 22616, 24162, 25095, 25758, 26848, + 30070, 31958, 34739, 40680, 20195, 22408, 22382, 22823, 23565, 23729, + 24118, 24453, 25140, 25825, 29619, 33274, 34955, 36024, 38538, 40667, + 23429, 24503, 24755, 20498, 20992, 21040, 22294, 22581, 22615, 23566, + 23648, 23798, 23947, 24230, 24466, 24764, 25361, 25481, 25623, 26691, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26873, 27330, 28120, 28193, + 28372, 28644, 29182, 30428, 30585, 31153, 31291, 33796, 35241, 36077, + 36339, 36424, 36867, 36884, 36947, 37117, 37709, 38518, 38876, 27602, + 28678, 29272, 29346, 29544, 30563, 31167, 31716, 32411, 35712, 22697, + 24775, 25958, 26109, 26302, 27788, 28958, 29129, 35930, 38931, 20077, + 31361, 20189, 20908, 20941, 21205, 21516, 24999, 26481, 26704, 26847, + 27934, 28540, 30140, 30643, 31461, 33012, 33891, 37509, 20828, 26007, + 26460, 26515, 30168, 31431, 33651, 63834, 35910, 36887, 38957, 23663, + 33216, 33434, 36929, 36975, 37389, 24471, 23965, 27225, 29128, 30331, + 31561, 34276, 35588, 37159, 39472, 21895, 25078, 63835, 30313, 32645, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34367, 34746, 35064, 37007, + 63836, 27931, 28889, 29662, 32097, 33853, 63837, 37226, 39409, 63838, + 20098, 21365, 27396, 27410, 28734, 29211, 34349, 40478, 21068, 36771, + 23888, 25829, 25900, 27414, 28651, 31811, 32412, 34253, 35172, 35261, + 25289, 33240, 34847, 24266, 26391, 28010, 29436, 29701, 29807, 34690, + 37086, 20358, 23821, 24480, 33802, 20919, 25504, 30053, 20142, 20486, + 20841, 20937, 26753, 27153, 31918, 31921, 31975, 33391, 35538, 36635, + 37327, 20406, 20791, 21237, 21570, 24300, 24942, 25150, 26053, 27354, + 28670, 31018, 34268, 34851, 38317, 39522, 39530, 40599, 40654, 21147, + 26310, 27511, 28701, 31019, 36706, 38722, 24976, 25088, 25891, 28451, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29001, 29833, 32244, 32879, + 34030, 36646, 36899, 37706, 20925, 21015, 21155, 27916, 28872, 35010, + 24265, 25986, 27566, 28610, 31806, 29557, 20196, 20278, 22265, 63839, + 23738, 23994, 24604, 29618, 31533, 32666, 32718, 32838, 36894, 37428, + 38646, 38728, 38936, 40801, 20363, 28583, 31150, 37300, 38583, 21214, + 63840, 25736, 25796, 27347, 28510, 28696, 29200, 30439, 32769, 34310, + 34396, 36335, 36613, 38706, 39791, 40442, 40565, 30860, 31103, 32160, + 33737, 37636, 40575, 40595, 35542, 22751, 24324, 26407, 28711, 29903, + 31840, 32894, 20769, 28712, 29282, 30922, 36034, 36058, 36084, 38647, + 20102, 20698, 23534, 24278, 26009, 29134, 30274, 30637, 32842, 34044, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36988, 39719, 40845, 22744, + 23105, 23650, 27155, 28122, 28431, 30267, 32047, 32311, 34078, 35128, + 37860, 38475, 21129, 26066, 26611, 27060, 27969, 28316, 28687, 29705, + 29792, 30041, 30244, 30827, 35628, 39006, 20845, 25134, 38520, 20374, + 20523, 23833, 28138, 32184, 36650, 24459, 24900, 26647, 63841, 38534, + 21202, 32907, 20956, 20940, 26974, 31260, 32190, 33777, 38517, 20442, + 21033, 21400, 21519, 21774, 23653, 24743, 26446, 26792, 28012, 29313, + 29432, 29702, 29827, 63842, 30178, 31852, 32633, 32696, 33673, 35023, + 35041, 37324, 37328, 38626, 39881, 21533, 28542, 29136, 29848, 34298, + 36522, 38563, 40023, 40607, 26519, 28107, 29747, 33256, 38678, 30764, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31435, 31520, 31890, 25705, + 29802, 30194, 30908, 30952, 39340, 39764, 40635, 23518, 24149, 28448, + 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, 24930, 25405, + 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, 34875, 36627, + 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, 38778, 20129, + 22916, 24536, 24537, 26395, 32178, 32596, 33426, 33579, 33725, 36638, + 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, 27599, 29028, + 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, 39488, 40613, + 23391, 27667, 29467, 30450, 30431, 33804, 20906, 35219, 20813, 20885, + 21193, 26825, 27796, 30468, 30496, 32191, 32236, 38754, 40629, 28357, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 34065, 20901, 21517, 21629, + 26126, 26269, 26919, 28319, 30399, 30609, 33559, 33986, 34719, 37225, + 37528, 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, 25720, + 25721, 26286, 26576, 27169, 27597, 27611, 29279, 29281, 29761, 30520, + 30683, 32791, 33468, 33541, 35584, 35624, 35980, 26408, 27792, 29287, + 30446, 30566, 31302, 40361, 27519, 27794, 22818, 26406, 33945, 21359, + 22675, 22937, 24287, 25551, 26164, 26483, 28218, 29483, 31447, 33495, + 37672, 21209, 24043, 25006, 25035, 25098, 25287, 25771, 26080, 26969, + 27494, 27595, 28961, 29687, 30045, 32326, 33310, 33538, 34154, 35491, + 36031, 38695, 40289, 22696, 40664, 20497, 21006, 21563, 21839, 25991, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27766, 32010, 32011, 32862, + 34442, 38272, 38639, 21247, 27797, 29289, 21619, 23194, 23614, 23883, + 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, 31859, 32654, + 34183, 35598, 36855, 38753, 40692, 23735, 24758, 24845, 25003, 25935, + 26107, 26108, 27665, 27887, 29599, 29641, 32225, 38292, 23494, 34588, + 35600, 21085, 21338, 25293, 25615, 25778, 26420, 27192, 27850, 29632, + 29854, 31636, 31893, 32283, 33162, 33334, 34180, 36843, 38649, 39361, + 20276, 21322, 21453, 21467, 25292, 25644, 25856, 26001, 27075, 27886, + 28504, 29677, 30036, 30242, 30436, 30460, 30928, 30971, 31020, 32070, + 33324, 34784, 36820, 38930, 39151, 21187, 25300, 25765, 28196, 28497, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30332, 36299, 37297, 37474, + 39662, 39747, 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, + 25918, 26041, 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, + 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, + 20493, 20467, 63843, 22521, 24472, 25308, 25490, 26479, 28227, 28953, + 30403, 32972, 32986, 35060, 35061, 35097, 36064, 36649, 37197, 38506, + 20271, 20336, 24091, 26575, 26658, 30333, 30334, 39748, 24161, 27146, + 29033, 29140, 30058, 63844, 32321, 34115, 34281, 39132, 20240, 31567, + 32624, 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, + 33539, 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 30887, 34327, 38370, 38713, + 63845, 21342, 24321, 35722, 36776, 36783, 37002, 21029, 30629, 40009, + 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, 26564, 26821, + 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, 20445, 22561, + 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, 29995, 33769, + 35036, 35091, 35676, 36628, 20239, 20693, 21264, 21340, 23443, 24489, + 26381, 31119, 33145, 33583, 34068, 35079, 35206, 36665, 36667, 39333, + 39954, 26412, 20086, 20472, 22857, 23553, 23791, 23792, 25447, 26834, + 28925, 29090, 29739, 32299, 34028, 34562, 36898, 37586, 40179, 19981, + 20184, 20463, 20613, 21078, 21103, 21542, 21648, 22496, 22827, 23142, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23386, 23413, 23500, 24220, + 63846, 25206, 25975, 26023, 28014, 28325, 29238, 31526, 31807, 32566, + 33104, 33105, 33178, 33344, 33433, 33705, 35331, 36000, 36070, 36091, + 36212, 36282, 37096, 37340, 38428, 38468, 39385, 40167, 21271, 20998, + 21545, 22132, 22707, 22868, 22894, 24575, 24996, 25198, 26128, 27774, + 28954, 30406, 31881, 31966, 32027, 33452, 36033, 38640, 63847, 20315, + 24343, 24447, 25282, 23849, 26379, 26842, 30844, 32323, 40300, 19989, + 20633, 21269, 21290, 21329, 22915, 23138, 24199, 24754, 24970, 25161, + 25209, 26000, 26503, 27047, 27604, 27606, 27607, 27608, 27832, 63848, + 29749, 30202, 30738, 30865, 31189, 31192, 31875, 32203, 32737, 32933, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 33086, 33218, 33778, 34586, + 35048, 35513, 35692, 36027, 37145, 38750, 39131, 40763, 22188, 23338, + 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, + 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, + 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, + 22763, 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, 24605, + 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, 28195, + 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, 32114, + 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, 36060, + 36198, 36781, 37034, 39164, 39391, 40605, 21066, 63849, 26388, 63850, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 20632, 21034, 23665, 25955, + 27733, 29642, 29987, 30109, 31639, 33948, 37240, 38704, 20087, 25746, + 27578, 29022, 34217, 19977, 63851, 26441, 26862, 28183, 33439, 34072, + 34923, 25591, 28545, 37394, 39087, 19978, 20663, 20687, 20767, 21830, + 21930, 22039, 23360, 23577, 23776, 24120, 24202, 24224, 24258, 24819, + 26705, 27233, 28248, 29245, 29248, 29376, 30456, 31077, 31665, 32724, + 35059, 35316, 35443, 35937, 36062, 38684, 22622, 29885, 36093, 21959, + 63852, 31329, 32034, 33394, 29298, 29983, 29989, 63853, 31513, 22661, + 22779, 23996, 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, + 26329, 26360, 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32997, 33298, 34223, 35199, + 35475, 36893, 37604, 40653, 40736, 22805, 22893, 24109, 24796, 26132, + 26227, 26512, 27728, 28101, 28511, 30707, 30889, 33990, 37323, 37675, + 20185, 20682, 20808, 21892, 23307, 23459, 25159, 25982, 26059, 28210, + 29053, 29697, 29764, 29831, 29887, 30316, 31146, 32218, 32341, 32680, + 33146, 33203, 33337, 34330, 34796, 35445, 36323, 36984, 37521, 37925, + 39245, 39854, 21352, 23633, 26964, 27844, 27945, 28203, 33292, 34203, + 35131, 35373, 35498, 38634, 40807, 21089, 26297, 27570, 32406, 34814, + 36109, 38275, 38493, 25885, 28041, 29166, 63854, 22478, 22995, 23468, + 24615, 24826, 25104, 26143, 26207, 29481, 29689, 30427, 30465, 31596, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 32854, 32882, 33125, 35488, + 37266, 19990, 21218, 27506, 27927, 31237, 31545, 32048, 63855, 36016, + 21484, 22063, 22609, 23477, 23567, 23569, 24034, 25152, 25475, 25620, + 26157, 26803, 27836, 28040, 28335, 28703, 28836, 29138, 29990, 30095, + 30094, 30233, 31505, 31712, 31787, 32032, 32057, 34092, 34157, 34311, + 35380, 36877, 36961, 37045, 37559, 38902, 39479, 20439, 23660, 26463, + 28049, 31903, 32396, 35606, 36118, 36895, 23403, 24061, 25613, 33984, + 36956, 39137, 29575, 23435, 24730, 26494, 28126, 35359, 35494, 36865, + 38924, 21047, 63856, 28753, 30862, 37782, 34928, 37335, 20462, 21463, + 22013, 22234, 22402, 22781, 23234, 23432, 23723, 23744, 24101, 24833, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 25101, 25163, 25480, 25628, + 25910, 25976, 27193, 27530, 27700, 27929, 28465, 29159, 29417, 29560, + 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, 32143, 32172, + 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, 35504, 35728, + 36664, 36930, 36995, 37228, 37526, 37561, 38539, 38567, 38568, 38614, + 38656, 38920, 39318, 39635, 39706, 21460, 22654, 22809, 23408, 23487, + 28113, 28506, 29087, 29729, 29881, 32901, 33789, 24033, 24455, 24490, + 24642, 26092, 26642, 26991, 27219, 27529, 27957, 28147, 29667, 30462, + 30636, 31565, 32020, 33059, 33308, 33600, 34036, 34147, 35426, 35524, + 37255, 37662, 38918, 39348, 25100, 34899, 36848, 37477, 23815, 23847, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 23913, 29791, 33181, 34664, + 28629, 25342, 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, + 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, + 23608, 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, 26558, + 26612, 29468, 30690, 31034, 32709, 33940, 33997, 35222, 35430, 35433, + 35553, 35925, 35962, 22516, 23508, 24335, 24687, 25325, 26893, 27542, + 28252, 29060, 31698, 34645, 35672, 36606, 39135, 39166, 20280, 20353, + 20449, 21627, 23072, 23480, 24892, 26032, 26216, 29180, 30003, 31070, + 32051, 33102, 33251, 33688, 34218, 34254, 34563, 35338, 36523, 36763, + 63857, 36805, 22833, 23460, 23526, 24713, 23529, 23563, 24515, 27777, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63858, 28145, 28683, 29978, + 33455, 35574, 20160, 21313, 63859, 38617, 27663, 20126, 20420, 20818, + 21854, 23077, 23784, 25105, 29273, 33469, 33706, 34558, 34905, 35357, + 38463, 38597, 39187, 40201, 40285, 22538, 23731, 23997, 24132, 24801, + 24853, 25569, 27138, 28197, 37122, 37716, 38990, 39952, 40823, 23433, + 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, 26017, + 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, 33780, + 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, 27523, + 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, 30861, + 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, 38989, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 27387, 32588, 40367, 40474, + 20063, 20539, 20918, 22812, 24825, 25590, 26928, 29242, 32822, 63860, + 37326, 24369, 63861, 63862, 32004, 33509, 33903, 33979, 34277, 36493, + 63863, 20335, 63864, 63865, 22756, 23363, 24665, 25562, 25880, 25965, + 26264, 63866, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, + 31344, 63867, 32650, 63868, 35140, 63869, 35731, 37312, 38525, 63870, + 39178, 22276, 24481, 26044, 28417, 30208, 31142, 35486, 39341, 39770, + 40812, 20740, 25014, 25233, 27277, 33222, 20547, 22576, 24422, 28937, + 35328, 35578, 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, + 23978, 26989, 20870, 20104, 20313, 63871, 63872, 63873, 22914, 63874, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63875, 27487, 27741, 63876, + 29877, 30998, 63877, 33287, 33349, 33593, 36671, 36701, 63878, 39192, + 63879, 63880, 63881, 20134, 63882, 22495, 24441, 26131, 63883, 63884, + 30123, 32377, 35695, 63885, 36870, 39515, 22181, 22567, 23032, 23071, + 23476, 63886, 24310, 63887, 63888, 25424, 25403, 63889, 26941, 27783, + 27839, 28046, 28051, 28149, 28436, 63890, 28895, 28982, 29017, 63891, + 29123, 29141, 63892, 30799, 30831, 63893, 31605, 32227, 63894, 32303, + 63895, 34893, 36575, 63896, 63897, 63898, 37467, 63899, 40182, 63900, + 63901, 63902, 24709, 28037, 63903, 29105, 63904, 63905, 38321, 21421, + 63906, 63907, 63908, 26579, 63909, 28814, 28976, 29744, 33398, 33490, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63910, 38331, 39653, 40573, + 26308, 63911, 29121, 33865, 63912, 63913, 22603, 63914, 63915, 23992, + 24433, 63916, 26144, 26254, 27001, 27054, 27704, 27891, 28214, 28481, + 28634, 28699, 28719, 29008, 29151, 29552, 63917, 29787, 63918, 29908, + 30408, 31310, 32403, 63919, 63920, 33521, 35424, 36814, 63921, 37704, + 63922, 38681, 63923, 63924, 20034, 20522, 63925, 21000, 21473, 26355, + 27757, 28618, 29450, 30591, 31330, 33454, 34269, 34306, 63926, 35028, + 35427, 35709, 35947, 63927, 37555, 63928, 38675, 38928, 20116, 20237, + 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, 23067, + 23524, 24735, 63929, 25034, 25942, 26111, 26212, 26791, 27738, 28595, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28879, 29100, 29522, 31613, + 34568, 35492, 39986, 40711, 23627, 27779, 29508, 29577, 37434, 28331, + 29797, 30239, 31337, 32277, 34314, 20800, 22725, 25793, 29934, 29973, + 30320, 32705, 37013, 38605, 39252, 28198, 29926, 31401, 31402, 33253, + 34521, 34680, 35355, 23113, 23436, 23451, 26785, 26880, 28003, 29609, + 29715, 29740, 30871, 32233, 32747, 33048, 33109, 33694, 35916, 38446, + 38929, 26352, 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, + 30702, 22806, 23916, 24013, 29477, 30031, 63930, 63931, 20709, 20985, + 22575, 22829, 22934, 23002, 23525, 63932, 63933, 23970, 25303, 25622, + 25747, 25854, 63934, 26332, 63935, 27208, 63936, 29183, 29796, 63937, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31368, 31407, 32327, 32350, + 32768, 33136, 63938, 34799, 35201, 35616, 36953, 63939, 36992, 39250, + 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, 20887, 21191, + 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, 28342, 29076, + 29794, 29992, 29996, 32883, 33592, 33993, 36362, 37780, 37854, 63940, + 20110, 20305, 20598, 20778, 21448, 21451, 21491, 23431, 23507, 23588, + 24858, 24962, 26100, 29275, 29591, 29760, 30402, 31056, 31121, 31161, + 32006, 32701, 33419, 34261, 34398, 36802, 36935, 37109, 37354, 38533, + 38632, 38633, 21206, 24423, 26093, 26161, 26671, 29020, 31286, 37057, + 38922, 20113, 63941, 27218, 27550, 28560, 29065, 32792, 33464, 34131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36939, 38549, 38642, 38907, + 34074, 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, + 22435, 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, + 28304, 29232, 29503, 29783, 33489, 34945, 36677, 36960, 63942, 38498, + 39000, 40219, 26376, 36234, 37470, 20301, 20553, 20702, 21361, 22285, + 22996, 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, + 33806, 33894, 34111, 34655, 34907, 35096, 35586, 36949, 38859, 39759, + 20083, 20369, 20754, 20842, 63943, 21807, 21929, 23418, 23461, 24188, + 24189, 24254, 24736, 24799, 24840, 24841, 25540, 25912, 26377, 63944, + 26580, 26586, 63945, 26977, 26978, 27833, 27943, 63946, 28216, 63947, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 28641, 29494, 29495, 63948, + 29788, 30001, 63949, 30290, 63950, 63951, 32173, 33278, 33848, 35029, + 35480, 35547, 35565, 36400, 36418, 36938, 36926, 36986, 37193, 37321, + 37742, 63952, 63953, 22537, 63954, 27603, 32905, 32946, 63955, 63956, + 20801, 22891, 23609, 63957, 63958, 28516, 29607, 32996, 36103, 63959, + 37399, 38287, 63960, 63961, 63962, 63963, 32895, 25102, 28700, 32104, + 34701, 63964, 22432, 24681, 24903, 27575, 35518, 37504, 38577, 20057, + 21535, 28139, 34093, 38512, 38899, 39150, 25558, 27875, 37009, 20957, + 25033, 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, + 26885, 27589, 30097, 30691, 32681, 33380, 34191, 34811, 34915, 35516, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 35696, 37291, 20108, 20197, + 20234, 63965, 63966, 22839, 23016, 63967, 24050, 24347, 24411, 24609, + 63968, 63969, 63970, 63971, 29246, 29669, 63972, 30064, 30157, 63973, + 31227, 63974, 32780, 32819, 32900, 33505, 33617, 63975, 63976, 36029, + 36019, 36999, 63977, 63978, 39156, 39180, 63979, 63980, 28727, 30410, + 32714, 32716, 32764, 35610, 20154, 20161, 20995, 21360, 63981, 21693, + 22240, 23035, 23493, 24341, 24525, 28270, 63982, 63983, 32106, 33589, + 63984, 34451, 35469, 63985, 38765, 38775, 63986, 63987, 19968, 20314, + 20350, 22777, 26085, 28322, 36920, 37808, 39353, 20219, 22764, 22922, + 23001, 24641, 63988, 63989, 31252, 63990, 33615, 36035, 20837, 21316, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 63991, 63992, 63993, 20173, + 21097, 23381, 33471, 20180, 21050, 21672, 22985, 23039, 23376, 23383, + 23388, 24675, 24904, 28363, 28825, 29038, 29574, 29943, 30133, 30913, + 32043, 32773, 33258, 33576, 34071, 34249, 35566, 36039, 38604, 20316, + 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, 33421, 37196, + 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, 26283, 28507, + 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, 22715, 22767, + 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, 27167, 27299, + 27404, 28479, 29254, 63994, 29520, 29835, 31456, 31911, 33144, 33247, + 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, 38263, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38556, 20877, 21705, 22312, + 23472, 25165, 26448, 26685, 26771, 28221, 28371, 28797, 32289, 35009, + 36001, 36617, 40779, 40782, 29229, 31631, 35533, 37658, 20295, 20302, + 20786, 21632, 22992, 24213, 25269, 26485, 26990, 27159, 27822, 28186, + 29401, 29482, 30141, 31672, 32053, 33511, 33785, 33879, 34295, 35419, + 36015, 36487, 36889, 37048, 38606, 40799, 21219, 21514, 23265, 23490, + 25688, 25973, 28404, 29380, 63995, 30340, 31309, 31515, 31821, 32318, + 32735, 33659, 35627, 36042, 36196, 36321, 36447, 36842, 36857, 36969, + 37841, 20291, 20346, 20659, 20840, 20856, 21069, 21098, 22625, 22652, + 22880, 23560, 23637, 24283, 24731, 25136, 26643, 27583, 27656, 28593, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29006, 29728, 30000, 30008, + 30033, 30322, 31564, 31627, 31661, 31686, 32399, 35438, 36670, 36681, + 37439, 37523, 37666, 37931, 38651, 39002, 39019, 39198, 20999, 25130, + 25240, 27993, 30308, 31434, 31680, 32118, 21344, 23742, 24215, 28472, + 28857, 31896, 38673, 39822, 40670, 25509, 25722, 34678, 19969, 20117, + 20141, 20572, 20597, 21576, 22979, 23450, 24128, 24237, 24311, 24449, + 24773, 25402, 25919, 25972, 26060, 26230, 26232, 26622, 26984, 27273, + 27491, 27712, 28096, 28136, 28191, 28254, 28702, 28833, 29582, 29693, + 30010, 30555, 30855, 31118, 31243, 31357, 31934, 32142, 33351, 35330, + 35562, 35998, 37165, 37194, 37336, 37478, 37580, 37664, 38662, 38742, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38748, 38914, 40718, 21046, + 21137, 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, + 31532, 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, + 38988, 40778, 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, + 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, + 28526, 29031, 29157, 29226, 29866, 30522, 31062, 31066, 31199, 31264, + 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, 35519, + 36249, 36481, 36896, 36973, 37347, 38459, 38613, 40165, 26063, 31751, + 36275, 37827, 23384, 23562, 21330, 25305, 29469, 20519, 23447, 24478, + 24752, 24939, 26837, 28121, 29742, 31278, 32066, 32156, 32305, 33131, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36394, 36405, 37758, 37912, + 20304, 22352, 24038, 24231, 25387, 32618, 20027, 20303, 20367, 20570, + 23005, 32964, 21610, 21608, 22014, 22863, 23449, 24030, 24282, 26205, + 26417, 26609, 26666, 27880, 27954, 28234, 28557, 28855, 29664, 30087, + 31820, 32002, 32044, 32162, 33311, 34523, 35387, 35461, 36208, 36490, + 36659, 36913, 37198, 37202, 37956, 39376, 31481, 31909, 20426, 20737, + 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, + 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, + 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, + 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21675, 22320, 22336, 24535, + 25345, 25351, 25711, 25903, 26088, 26234, 26525, 26547, 27490, 27744, + 27802, 28460, 30693, 30757, 31049, 31063, 32025, 32930, 33026, 33267, + 33437, 33463, 34584, 35468, 63996, 36100, 36286, 36978, 30452, 31257, + 31287, 32340, 32887, 21767, 21972, 22645, 25391, 25634, 26185, 26187, + 26733, 27035, 27524, 27941, 28337, 29645, 29800, 29857, 30043, 30137, + 30433, 30494, 30603, 31206, 32265, 32285, 33275, 34095, 34967, 35386, + 36049, 36587, 36784, 36914, 37805, 38499, 38515, 38663, 20356, 21489, + 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, + 36074, 36300, 36845, 26015, 26389, 63997, 22519, 28503, 32221, 36655, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37878, 38598, 24501, 25074, + 28548, 19988, 20376, 20511, 21449, 21983, 23919, 24046, 27425, 27492, + 30923, 31642, 63998, 36425, 36554, 36974, 25417, 25662, 30528, 31364, + 37679, 38015, 40810, 25776, 28591, 29158, 29864, 29914, 31428, 31762, + 32386, 31922, 32408, 35738, 36106, 38013, 39184, 39244, 21049, 23519, + 25830, 26413, 32046, 20717, 21443, 22649, 24920, 24921, 25082, 26028, + 31449, 35730, 35734, 20489, 20513, 21109, 21809, 23100, 24288, 24432, + 24884, 25950, 26124, 26166, 26274, 27085, 28356, 28466, 29462, 30241, + 31379, 33081, 33369, 33750, 33980, 20661, 22512, 23488, 23528, 24425, + 25505, 30758, 32181, 33756, 34081, 37319, 37365, 20874, 26613, 31574, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36012, 20932, 22971, 24765, + 34389, 20508, 63999, 21076, 23610, 24957, 25114, 25299, 25842, 26021, + 28364, 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, + 24029, 25797, 27849, 28154, 29588, 31359, 33307, 34214, 36068, 36368, + 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, + 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, + 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, + 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, + 35531, 38737, 39894, 64000, 21059, 26367, 28053, 28399, 32224, 35558, + 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 26898, 26970, 27189, 28818, + 28966, 30813, 30977, 30990, 31186, 31245, 32918, 33400, 33493, 33609, + 34121, 35970, 36229, 37218, 37259, 37294, 20419, 22225, 29165, 30679, + 34560, 35320, 23544, 24534, 26449, 37032, 21474, 22618, 23541, 24740, + 24961, 25696, 32317, 32880, 34085, 37507, 25774, 20652, 23828, 26368, + 22684, 25277, 25512, 26894, 27000, 27166, 28267, 30394, 31179, 33467, + 33833, 35535, 36264, 36861, 37138, 37195, 37276, 37648, 37656, 37786, + 38619, 39478, 39949, 19985, 30044, 31069, 31482, 31569, 31689, 32302, + 33988, 36441, 36468, 36600, 36880, 26149, 26943, 29763, 20986, 26414, + 40668, 20805, 24544, 27798, 34802, 34909, 34935, 24756, 33205, 33795, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 36101, 21462, 21561, 22068, + 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, + 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, + 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, + 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, + 40786, 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, 23522, + 26517, 27784, 28024, 29723, 30759, 37341, 37756, 34756, 31204, 31281, + 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, 25302, 26422, + 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, 22396, 64001, + 25176, 64002, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 37944, 21585, 22022, 22374, + 24392, 24986, 27470, 28760, 28845, 32187, 35477, 22890, 33067, 25506, + 30472, 32829, 36010, 22612, 25645, 27067, 23445, 24081, 28271, 64003, + 34153, 20812, 21488, 22826, 24608, 24907, 27526, 27760, 27888, 31518, + 32974, 33492, 36294, 37040, 39089, 64004, 25799, 28580, 25745, 25860, + 20814, 21520, 22303, 35342, 24927, 26742, 64005, 30171, 31570, 32113, + 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, 22871, 22956, + 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, 24052, 25226, + 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, 32631, 33453, + 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, 36774, 37393, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 38442, 20843, 21485, 25420, + 20329, 21764, 24726, 25943, 27803, 28031, 29260, 29437, 31255, 35207, + 35997, 24429, 28558, 28921, 33192, 24846, 20415, 20559, 25153, 29255, + 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, + 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, + 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, + 24598, 25243, 25265, 25429, 64006, 27873, 28006, 30129, 30770, 32990, + 33071, 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, + 24133, 26292, 26333, 28689, 29190, 64007, 20469, 21117, 24426, 24915, + 26451, 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 21697, 31263, 26963, 35575, + 35914, 39080, 39342, 24444, 25259, 30130, 30382, 34987, 36991, 38466, + 21305, 24380, 24517, 27852, 29644, 30050, 30091, 31558, 33534, 39325, + 20047, 36924, 19979, 20309, 21414, 22799, 24264, 26160, 27827, 29781, + 33655, 34662, 36032, 36944, 38686, 39957, 22737, 23416, 34384, 35604, + 40372, 23506, 24680, 24717, 26097, 27735, 28450, 28579, 28698, 32597, + 32752, 38289, 38290, 38480, 38867, 21106, 36676, 20989, 21547, 21688, + 21859, 21898, 27323, 28085, 32216, 33382, 37532, 38519, 40569, 21512, + 21704, 30418, 34532, 38308, 38356, 38492, 20130, 20233, 23022, 23270, + 24055, 24658, 25239, 26477, 26689, 27782, 28207, 32568, 32923, 33322, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 64008, 64009, 38917, 20133, + 20565, 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, + 34809, 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, + 24184, 26447, 33607, 34892, 20139, 21521, 22190, 29670, 37141, 38911, + 39177, 39255, 39321, 22099, 22687, 34395, 35377, 25010, 27382, 29563, + 36562, 27463, 38570, 39511, 22869, 29184, 36203, 38761, 20436, 23796, + 24358, 25080, 26203, 27883, 28843, 29572, 29625, 29694, 30505, 30541, + 32067, 32098, 32291, 33335, 34898, 64010, 36066, 37449, 39023, 23377, + 31348, 34880, 38913, 23244, 20448, 21332, 22846, 23805, 25406, 28025, + 29433, 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24418, 27842, 28366, 28677, + 28752, 28847, 29074, 29673, 29801, 33610, 34722, 34913, 36872, 37026, + 37795, 39336, 20846, 24407, 24800, 24935, 26291, 34137, 36426, 37295, + 38795, 20046, 20114, 21628, 22741, 22778, 22909, 23733, 24359, 25142, + 25160, 26122, 26215, 27627, 28009, 28111, 28246, 28408, 28564, 28640, + 28649, 28765, 29392, 29733, 29786, 29920, 30355, 31068, 31946, 32286, + 32993, 33446, 33899, 33983, 34382, 34399, 34676, 35703, 35946, 37804, + 38912, 39013, 24785, 25110, 37239, 23130, 26127, 28151, 28222, 29759, + 39746, 24573, 24794, 31503, 21700, 24344, 27742, 27859, 27946, 28888, + 32005, 34425, 35340, 40251, 21270, 21644, 23301, 27194, 28779, 30069, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 31117, 31166, 33457, 33775, + 35441, 35649, 36008, 38772, 64011, 25844, 25899, 30906, 30907, 31339, + 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, + 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, 28369, 29502, + 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, 26179, + 26180, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, 31681, + 31783, 33618, 34647, 36945, 38541, 40643, 21295, 22238, 24315, 24458, + 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, 28784, 29546, + 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, 23446, 27243, + 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, 28045, 28102, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 29243, 32948, 37237, 39501, + 20399, 20505, 21402, 21518, 21564, 21897, 21957, 24127, 24460, 26429, + 29030, 29661, 36869, 21211, 21235, 22628, 22734, 28932, 29071, 29179, + 34224, 35347, 26248, 34216, 21927, 26244, 29002, 33841, 21321, 21913, + 27585, 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, + 25658, 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, + 27958, 33016, 40657, 26133, 27427, 28824, 30165, 21507, 23673, 32007, + 35350, 27424, 27453, 27462, 21560, 24688, 27965, 32725, 33288, 20694, + 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, 25137, + 26206, 26342, 29081, 29113, 29114, 29351, 31143, 31232, 32690, 35440, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myencoding_map_gb18030[] = { + 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, + 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, + 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, + 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, + 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, + 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, + 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, + 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, + 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, + 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, + 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, + 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, + 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, + 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, + 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, + 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, + 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, + 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, + 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, + 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, + 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, + 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, + 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, + 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, + 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, + 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, + 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, + 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, + 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, + 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, + 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, + 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, + 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, + 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, + 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, + 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, + 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, + 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, + 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, + 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, + 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, + 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, + 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, + 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, + 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, + 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, + 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, + 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, + 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, + 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, + 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, + 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, + 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, + 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, + 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, + 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, + 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, + 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, + 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, + 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, + 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, + 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, + 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, + 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, + 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, + 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, + 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, + 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, + 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, + 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, + 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, + 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, + 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, + 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, + 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, + 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, + 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, + 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, + 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, + 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, + 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, + 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, + 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, + 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, + 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, + 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, + 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, + 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, + 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, + 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, + 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, + 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, + 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, + 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, + 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, + 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, + 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, + 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, + 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, + 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, + 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, + 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, + 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, + 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, + 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, + 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, + 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, + 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, + 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, + 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, + 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, + 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, + 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, + 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, + 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, + 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, + 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, + 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, + 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, + 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, + 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, + 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, + 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, + 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, + 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, + 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, + 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, + 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, + 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, + 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, + 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, + 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, + 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, + 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, + 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, + 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, + 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, + 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, + 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, + 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, + 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, + 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, + 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, + 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, + 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, + 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, + 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, + 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, + 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, + 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, + 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, + 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, + 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, + 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, + 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, + 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, + 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, + 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, + 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, + 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, + 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, + 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, + 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, + 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, + 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, + 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, + 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, + 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, + 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, + 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, + 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, + 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, + 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, + 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, + 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, + 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, + 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, + 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, + 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, + 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, + 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, + 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, + 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, + 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, + 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, + 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, + 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, + 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, + 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, + 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, + 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, + 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, + 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, + 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, + 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, + 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, + 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, + 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, + 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, + 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, + 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, + 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, + 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, + 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, + 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, + 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, + 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, + 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, + 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, + 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, + 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, + 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, + 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, + 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, + 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, + 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, + 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, + 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, + 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, + 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, + 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, + 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, + 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, + 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, + 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, + 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, + 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, + 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, + 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, + 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, + 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, + 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, + 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, + 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, + 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, + 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, + 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, + 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, + 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, + 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, + 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, + 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, + 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, + 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, + 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, + 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, + 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, + 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, + 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, + 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, + 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, + 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, + 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, + 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, + 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, + 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, + 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, + 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, + 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, + 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, + 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, + 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, + 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, + 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, + 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, + 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, + 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, + 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, + 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, + 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, + 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, + 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, + 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, + 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, + 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, + 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, + 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, + 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, + 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, + 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, + 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, + 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, + 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, + 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, + 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, + 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, + 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, + 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, + 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, + 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, + 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, + 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, + 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, + 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, + 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, + 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, + 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, + 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, + 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, + 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, + 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, + 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, + 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, + 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, + 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, + 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, + 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, + 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, + 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, + 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, + 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, + 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, + 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, + 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, + 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, + 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, + 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, + 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, + 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, + 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, + 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, + 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, + 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, + 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, + 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, + 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, + 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, + 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, + 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, + 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, + 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, + 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, + 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, + 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, + 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, + 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, + 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, + 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, + 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, + 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, + 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, + 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, + 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, + 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, + 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, + 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, + 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, + 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, + 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, + 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, + 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, + 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, + 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, + 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, + 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, + 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, + 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, + 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, + 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, + 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, + 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, + 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, + 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, + 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, + 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, + 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, + 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, + 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, + 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, + 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, + 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, + 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, + 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, + 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, + 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, + 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, + 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, + 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, + 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, + 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, + 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, + 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, + 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, + 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, + 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, + 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, + 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, + 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, + 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, + 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, + 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, + 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, + 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, + 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, + 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, + 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, + 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, + 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, + 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, + 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, + 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, + 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, + 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, + 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, + 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, + 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, + 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, + 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, + 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, + 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, + 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, + 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, + 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, + 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, + 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, + 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, + 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, + 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, + 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, + 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, + 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, + 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, + 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, + 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, + 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, + 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, + 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, + 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, + 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, + 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, + 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, + 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, + 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, + 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, + 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, + 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, + 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, + 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, + 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, + 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, + 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, + 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, + 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, + 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, + 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, + 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, + 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, + 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, + 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, + 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, + 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, + 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, + 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, + 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, + 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, + 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, + 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, + 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, + 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, + 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, + 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, + 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, + 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, + 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, + 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, + 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, + 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, + 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, + 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, + 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, + 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, + 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, + 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, + 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, + 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, + 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, + 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, + 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, + 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, + 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, + 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, + 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, + 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, + 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, + 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, + 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, + 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, + 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, + 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, + 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, + 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, + 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, + 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, + 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, + 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, + 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, + 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, + 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, + 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, + 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, + 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, + 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, + 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, + 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, + 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, + 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, + 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, + 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, + 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, + 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, + 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, + 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, + 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, + 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, + 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, + 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, + 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, + 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, + 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, + 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, + 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, + 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, + 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, + 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, + 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, + 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, + 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, + 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, + 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, + 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, + 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, + 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, + 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, + 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, + 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, + 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, + 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, + 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, + 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, + 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, + 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, + 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, + 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, + 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, + 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, + 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, + 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, + 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, + 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, + 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, + 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, + 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, + 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, + 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, + 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, + 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, + 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, + 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, + 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, + 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, + 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, + 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, + 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, + 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, + 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, + 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, + 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, + 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, + 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, + 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, + 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, + 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, + 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, + 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, + 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, + 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, + 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, + 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, + 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, + 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, + 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, + 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, + 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, + 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, + 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, + 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, + 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, + 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, + 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, + 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, + 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, + 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, + 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, + 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, + 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, + 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, + 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, + 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, + 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, + 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, + 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, + 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, + 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, + 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, + 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, + 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, + 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, + 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, + 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, + 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, + 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, + 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, + 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, + 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, + 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58633, 58634, 58635, + 58636, 58637, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, + 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, + 58656, 58657, 58658, 58659, 58660, 58661, 12288, 12289, 12290, 183, + 713, 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, + 8217, 8220, 8221, 12308, 12309, 12296, 12297, 12298, 12299, 12300, + 12301, 12302, 12303, 12310, 12311, 12304, 12305, 177, 215, 247, + 8758, 8743, 8744, 8721, 8719, 8746, 8745, 8712, 8759, 8730, + 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, 8780, 8776, + 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, 8756, + 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, + 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, + 9633, 9632, 9651, 9650, 8251, 8594, 8592, 8593, 8595, 12307, + 58662, 58663, 58664, 58665, 58666, 58667, 58668, 58669, 58670, 58671, + 58672, 58673, 58674, 58675, 58676, 58677, 58678, 58679, 58680, 58681, + 58682, 58683, 58684, 58685, 58686, 58687, 58688, 58689, 58690, 58691, + 58692, 58693, 58694, 58695, 58696, 58697, 58698, 58699, 58700, 58701, + 58702, 58703, 58704, 58705, 58706, 58707, 58708, 58709, 58710, 58711, + 58712, 58713, 58714, 58715, 58716, 58717, 58718, 58719, 58720, 58721, + 58722, 58723, 58724, 58725, 58726, 58727, 58728, 58729, 58730, 58731, + 58732, 58733, 58734, 58735, 58736, 58737, 58738, 58739, 58740, 58741, + 58742, 58743, 58744, 58745, 58746, 58747, 58748, 58749, 58750, 58751, + 58752, 58753, 58754, 58755, 58756, 58757, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 59238, 59239, 59240, 59241, + 59242, 59243, 9352, 9353, 9354, 9355, 9356, 9357, 9358, 9359, + 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, 9369, + 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, + 9340, 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, + 9350, 9351, 9312, 9313, 9314, 9315, 9316, 9317, 9318, 9319, + 9320, 9321, 8364, 59245, 12832, 12833, 12834, 12835, 12836, 12837, + 12838, 12839, 12840, 12841, 59246, 59247, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 8554, 8555, 59248, 59249, + 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, 58766, 58767, + 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, 58776, 58777, + 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, 58786, 58787, + 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, 58796, 58797, + 58798, 58799, 58800, 58801, 58802, 58803, 58804, 58805, 58806, 58807, + 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, 58816, 58817, + 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, 58826, 58827, + 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, 58836, 58837, + 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, 58846, 58847, + 58848, 58849, 58850, 58851, 58852, 12288, 65281, 65282, 65283, 65509, + 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, 65293, 65294, + 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, 65303, 65304, + 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, 65313, 65314, + 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, 65323, 65324, + 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, 65333, 65334, + 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, 65343, 65344, + 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, 65353, 65354, + 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, 65363, 65364, + 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, 65373, 65507, + 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, 58862, 58863, + 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58871, 58872, 58873, + 58874, 58875, 58876, 58877, 58878, 58879, 58880, 58881, 58882, 58883, + 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, 58892, 58893, + 58894, 58895, 58896, 58897, 58898, 58899, 58900, 58901, 58902, 58903, + 58904, 58905, 58906, 58907, 58908, 58909, 58910, 58911, 58912, 58913, + 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, 58922, 58923, + 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, 58932, 58933, + 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, 58942, 58943, + 58944, 58945, 58946, 58947, 58948, 58949, 12353, 12354, 12355, 12356, + 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 12366, + 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, 12375, 12376, + 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, 12385, 12386, + 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, 12395, 12396, + 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, 12405, 12406, + 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, 12415, 12416, + 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, 12425, 12426, + 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, 12435, 59250, + 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, 59259, 59260, + 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, 58958, 58959, + 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, 58968, 58969, + 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, 58978, 58979, + 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, 58988, 58989, + 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, 58998, 58999, + 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, 59008, 59009, + 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, 59018, 59019, + 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, 59028, 59029, + 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, 59038, 59039, + 59040, 59041, 59042, 59043, 59044, 59045, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 59261, 59262, 59263, 59264, 59265, 59266, 59267, 59268, + 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, 59054, 59055, + 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, 59064, 59065, + 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, 59074, 59075, + 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, 59084, 59085, + 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, 59094, 59095, + 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, 59104, 59105, + 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, 59114, 59115, + 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, 59124, 59125, + 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, 59134, 59135, + 59136, 59137, 59138, 59139, 59140, 59141, 913, 914, 915, 916, + 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 931, 932, 933, 934, 935, 936, 937, + 59269, 59270, 59271, 59272, 59273, 59274, 59275, 59276, 945, 946, + 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, + 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, + 968, 969, 59277, 59278, 59279, 59280, 59281, 59282, 59283, 65077, + 65078, 65081, 65082, 65087, 65088, 65085, 65086, 65089, 65090, 65091, + 65092, 59284, 59285, 65083, 65084, 65079, 65080, 65073, 59286, 65075, + 65076, 59287, 59288, 59289, 59290, 59291, 59292, 59293, 59294, 59295, + 59142, 59143, 59144, 59145, 59146, 59147, 59148, 59149, 59150, 59151, + 59152, 59153, 59154, 59155, 59156, 59157, 59158, 59159, 59160, 59161, + 59162, 59163, 59164, 59165, 59166, 59167, 59168, 59169, 59170, 59171, + 59172, 59173, 59174, 59175, 59176, 59177, 59178, 59179, 59180, 59181, + 59182, 59183, 59184, 59185, 59186, 59187, 59188, 59189, 59190, 59191, + 59192, 59193, 59194, 59195, 59196, 59197, 59198, 59199, 59200, 59201, + 59202, 59203, 59204, 59205, 59206, 59207, 59208, 59209, 59210, 59211, + 59212, 59213, 59214, 59215, 59216, 59217, 59218, 59219, 59220, 59221, + 59222, 59223, 59224, 59225, 59226, 59227, 59228, 59229, 59230, 59231, + 59232, 59233, 59234, 59235, 59236, 59237, 1040, 1041, 1042, 1043, + 1044, 1045, 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 59296, + 59297, 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, + 59307, 59308, 59309, 59310, 1072, 1073, 1074, 1075, 1076, 1077, + 1105, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, + 1097, 1098, 1099, 1100, 1101, 1102, 1103, 59311, 59312, 59313, + 59314, 59315, 59316, 59317, 59318, 59319, 59320, 59321, 59322, 59323, + 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, 8598, + 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, + 9552, 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, + 9562, 9563, 9564, 9565, 9566, 9567, 9568, 9569, 9570, 9571, + 9572, 9573, 9574, 9575, 9576, 9577, 9578, 9579, 9580, 9581, + 9582, 9583, 9584, 9585, 9586, 9587, 9601, 9602, 9603, 9604, + 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, 9614, + 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, + 9737, 8853, 12306, 12317, 12318, 59324, 59325, 59326, 59327, 59328, + 59329, 59330, 59331, 59332, 59333, 59334, 257, 225, 462, 224, + 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, + 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, + 252, 234, 593, 7743, 324, 328, 505, 609, 59337, 59338, + 59339, 59340, 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, + 12557, 12558, 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, + 12567, 12568, 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, + 12577, 12578, 12579, 12580, 12581, 12582, 12583, 12584, 12585, 59341, + 59342, 59343, 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, + 59352, 59353, 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, + 12321, 12322, 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, + 13198, 13199, 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, + 13269, 65072, 65506, 65508, 59362, 8481, 12849, 59363, 8208, 59364, + 59365, 59366, 12540, 12443, 12444, 12541, 12542, 12294, 12445, 12446, + 65097, 65098, 65099, 65100, 65101, 65102, 65103, 65104, 65105, 65106, + 65108, 65109, 65110, 65111, 65113, 65114, 65115, 65116, 65117, 65118, + 65119, 65120, 65121, 65122, 65123, 65124, 65125, 65126, 65128, 65129, + 65130, 65131, 12350, 12272, 12273, 12274, 12275, 12276, 12277, 12278, + 12279, 12280, 12281, 12282, 12283, 12295, 59380, 59381, 59382, 59383, + 59384, 59385, 59386, 59387, 59388, 59389, 59390, 59391, 59392, 9472, + 9473, 9474, 9475, 9476, 9477, 9478, 9479, 9480, 9481, 9482, + 9483, 9484, 9485, 9486, 9487, 9488, 9489, 9490, 9491, 9492, + 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, 9501, 9502, + 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, + 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, + 9523, 9524, 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, + 9533, 9534, 9535, 9536, 9537, 9538, 9539, 9540, 9541, 9542, + 9543, 9544, 9545, 9546, 9547, 59393, 59394, 59395, 59396, 59397, + 59398, 59399, 59400, 59401, 59402, 59403, 59404, 59405, 59406, 59407, + 29404, 29405, 29407, 29410, 29411, 29412, 29413, 29414, 29415, 29418, + 29419, 29429, 29430, 29433, 29437, 29438, 29439, 29440, 29442, 29444, + 29445, 29446, 29447, 29448, 29449, 29451, 29452, 29453, 29455, 29456, + 29457, 29458, 29460, 29464, 29465, 29466, 29471, 29472, 29475, 29476, + 29478, 29479, 29480, 29485, 29487, 29488, 29490, 29491, 29493, 29494, + 29498, 29499, 29500, 29501, 29504, 29505, 29506, 29507, 29508, 29509, + 29510, 29511, 29512, 29513, 29514, 29515, 29516, 29518, 29519, 29521, + 29523, 29524, 29525, 29526, 29528, 29529, 29530, 29531, 29532, 29533, + 29534, 29535, 29537, 29538, 29539, 29540, 29541, 29542, 29543, 29544, + 29545, 29546, 29547, 29550, 29552, 29553, 57344, 57345, 57346, 57347, + 57348, 57349, 57350, 57351, 57352, 57353, 57354, 57355, 57356, 57357, + 57358, 57359, 57360, 57361, 57362, 57363, 57364, 57365, 57366, 57367, + 57368, 57369, 57370, 57371, 57372, 57373, 57374, 57375, 57376, 57377, + 57378, 57379, 57380, 57381, 57382, 57383, 57384, 57385, 57386, 57387, + 57388, 57389, 57390, 57391, 57392, 57393, 57394, 57395, 57396, 57397, + 57398, 57399, 57400, 57401, 57402, 57403, 57404, 57405, 57406, 57407, + 57408, 57409, 57410, 57411, 57412, 57413, 57414, 57415, 57416, 57417, + 57418, 57419, 57420, 57421, 57422, 57423, 57424, 57425, 57426, 57427, + 57428, 57429, 57430, 57431, 57432, 57433, 57434, 57435, 57436, 57437, + 29554, 29555, 29556, 29557, 29558, 29559, 29560, 29561, 29562, 29563, + 29564, 29565, 29567, 29568, 29569, 29570, 29571, 29573, 29574, 29576, + 29578, 29580, 29581, 29583, 29584, 29586, 29587, 29588, 29589, 29591, + 29592, 29593, 29594, 29596, 29597, 29598, 29600, 29601, 29603, 29604, + 29605, 29606, 29607, 29608, 29610, 29612, 29613, 29617, 29620, 29621, + 29622, 29624, 29625, 29628, 29629, 29630, 29631, 29633, 29635, 29636, + 29637, 29638, 29639, 29643, 29644, 29646, 29650, 29651, 29652, 29653, + 29654, 29655, 29656, 29658, 29659, 29660, 29661, 29663, 29665, 29666, + 29667, 29668, 29670, 29672, 29674, 29675, 29676, 29678, 29679, 29680, + 29681, 29683, 29684, 29685, 29686, 29687, 57438, 57439, 57440, 57441, + 57442, 57443, 57444, 57445, 57446, 57447, 57448, 57449, 57450, 57451, + 57452, 57453, 57454, 57455, 57456, 57457, 57458, 57459, 57460, 57461, + 57462, 57463, 57464, 57465, 57466, 57467, 57468, 57469, 57470, 57471, + 57472, 57473, 57474, 57475, 57476, 57477, 57478, 57479, 57480, 57481, + 57482, 57483, 57484, 57485, 57486, 57487, 57488, 57489, 57490, 57491, + 57492, 57493, 57494, 57495, 57496, 57497, 57498, 57499, 57500, 57501, + 57502, 57503, 57504, 57505, 57506, 57507, 57508, 57509, 57510, 57511, + 57512, 57513, 57514, 57515, 57516, 57517, 57518, 57519, 57520, 57521, + 57522, 57523, 57524, 57525, 57526, 57527, 57528, 57529, 57530, 57531, + 29688, 29689, 29690, 29691, 29692, 29693, 29694, 29695, 29696, 29697, + 29698, 29700, 29703, 29704, 29707, 29708, 29709, 29710, 29713, 29714, + 29715, 29716, 29717, 29718, 29719, 29720, 29721, 29724, 29725, 29726, + 29727, 29728, 29729, 29731, 29732, 29735, 29737, 29739, 29741, 29743, + 29745, 29746, 29751, 29752, 29753, 29754, 29755, 29757, 29758, 29759, + 29760, 29762, 29763, 29764, 29765, 29766, 29767, 29768, 29769, 29770, + 29771, 29772, 29773, 29774, 29775, 29776, 29777, 29778, 29779, 29780, + 29782, 29784, 29789, 29792, 29793, 29794, 29795, 29796, 29797, 29798, + 29799, 29800, 29801, 29802, 29803, 29804, 29806, 29807, 29809, 29810, + 29811, 29812, 29813, 29816, 29817, 29818, 57532, 57533, 57534, 57535, + 57536, 57537, 57538, 57539, 57540, 57541, 57542, 57543, 57544, 57545, + 57546, 57547, 57548, 57549, 57550, 57551, 57552, 57553, 57554, 57555, + 57556, 57557, 57558, 57559, 57560, 57561, 57562, 57563, 57564, 57565, + 57566, 57567, 57568, 57569, 57570, 57571, 57572, 57573, 57574, 57575, + 57576, 57577, 57578, 57579, 57580, 57581, 57582, 57583, 57584, 57585, + 57586, 57587, 57588, 57589, 57590, 57591, 57592, 57593, 57594, 57595, + 57596, 57597, 57598, 57599, 57600, 57601, 57602, 57603, 57604, 57605, + 57606, 57607, 57608, 57609, 57610, 57611, 57612, 57613, 57614, 57615, + 57616, 57617, 57618, 57619, 57620, 57621, 57622, 57623, 57624, 57625, + 29819, 29820, 29821, 29823, 29826, 29828, 29829, 29830, 29832, 29833, + 29834, 29836, 29837, 29839, 29841, 29842, 29843, 29844, 29845, 29846, + 29847, 29848, 29849, 29850, 29851, 29853, 29855, 29856, 29857, 29858, + 29859, 29860, 29861, 29862, 29866, 29867, 29868, 29869, 29870, 29871, + 29872, 29873, 29874, 29875, 29876, 29877, 29878, 29879, 29880, 29881, + 29883, 29884, 29885, 29886, 29887, 29888, 29889, 29890, 29891, 29892, + 29893, 29894, 29895, 29896, 29897, 29898, 29899, 29900, 29901, 29902, + 29903, 29904, 29905, 29907, 29908, 29909, 29910, 29911, 29912, 29913, + 29914, 29915, 29917, 29919, 29921, 29925, 29927, 29928, 29929, 29930, + 29931, 29932, 29933, 29936, 29937, 29938, 57626, 57627, 57628, 57629, + 57630, 57631, 57632, 57633, 57634, 57635, 57636, 57637, 57638, 57639, + 57640, 57641, 57642, 57643, 57644, 57645, 57646, 57647, 57648, 57649, + 57650, 57651, 57652, 57653, 57654, 57655, 57656, 57657, 57658, 57659, + 57660, 57661, 57662, 57663, 57664, 57665, 57666, 57667, 57668, 57669, + 57670, 57671, 57672, 57673, 57674, 57675, 57676, 57677, 57678, 57679, + 57680, 57681, 57682, 57683, 57684, 57685, 57686, 57687, 57688, 57689, + 57690, 57691, 57692, 57693, 57694, 57695, 57696, 57697, 57698, 57699, + 57700, 57701, 57702, 57703, 57704, 57705, 57706, 57707, 57708, 57709, + 57710, 57711, 57712, 57713, 57714, 57715, 57716, 57717, 57718, 57719, + 29939, 29941, 29944, 29945, 29946, 29947, 29948, 29949, 29950, 29952, + 29953, 29954, 29955, 29957, 29958, 29959, 29960, 29961, 29962, 29963, + 29964, 29966, 29968, 29970, 29972, 29973, 29974, 29975, 29979, 29981, + 29982, 29984, 29985, 29986, 29987, 29988, 29990, 29991, 29994, 29998, + 30004, 30006, 30009, 30012, 30013, 30015, 30017, 30018, 30019, 30020, + 30022, 30023, 30025, 30026, 30029, 30032, 30033, 30034, 30035, 30037, + 30038, 30039, 30040, 30045, 30046, 30047, 30048, 30049, 30050, 30051, + 30052, 30055, 30056, 30057, 30059, 30060, 30061, 30062, 30063, 30064, + 30065, 30067, 30069, 30070, 30071, 30074, 30075, 30076, 30077, 30078, + 30080, 30081, 30082, 30084, 30085, 30087, 57720, 57721, 57722, 57723, + 57724, 57725, 57726, 57727, 57728, 57729, 57730, 57731, 57732, 57733, + 57734, 57735, 57736, 57737, 57738, 57739, 57740, 57741, 57742, 57743, + 57744, 57745, 57746, 57747, 57748, 57749, 57750, 57751, 57752, 57753, + 57754, 57755, 57756, 57757, 57758, 57759, 57760, 57761, 57762, 57763, + 57764, 57765, 57766, 57767, 57768, 57769, 57770, 57771, 57772, 57773, + 57774, 57775, 57776, 57777, 57778, 57779, 57780, 57781, 57782, 57783, + 57784, 57785, 57786, 57787, 57788, 57789, 57790, 57791, 57792, 57793, + 57794, 57795, 57796, 57797, 57798, 57799, 57800, 57801, 57802, 57803, + 57804, 57805, 57806, 57807, 57808, 57809, 57810, 57811, 57812, 57813, + 30088, 30089, 30090, 30092, 30093, 30094, 30096, 30099, 30101, 30104, + 30107, 30108, 30110, 30114, 30118, 30119, 30120, 30121, 30122, 30125, + 30134, 30135, 30138, 30139, 30143, 30144, 30145, 30150, 30155, 30156, + 30158, 30159, 30160, 30161, 30163, 30167, 30169, 30170, 30172, 30173, + 30175, 30176, 30177, 30181, 30185, 30188, 30189, 30190, 30191, 30194, + 30195, 30197, 30198, 30199, 30200, 30202, 30203, 30205, 30206, 30210, + 30212, 30214, 30215, 30216, 30217, 30219, 30221, 30222, 30223, 30225, + 30226, 30227, 30228, 30230, 30234, 30236, 30237, 30238, 30241, 30243, + 30247, 30248, 30252, 30254, 30255, 30257, 30258, 30262, 30263, 30265, + 30266, 30267, 30269, 30273, 30274, 30276, 57814, 57815, 57816, 57817, + 57818, 57819, 57820, 57821, 57822, 57823, 57824, 57825, 57826, 57827, + 57828, 57829, 57830, 57831, 57832, 57833, 57834, 57835, 57836, 57837, + 57838, 57839, 57840, 57841, 57842, 57843, 57844, 57845, 57846, 57847, + 57848, 57849, 57850, 57851, 57852, 57853, 57854, 57855, 57856, 57857, + 57858, 57859, 57860, 57861, 57862, 57863, 57864, 57865, 57866, 57867, + 57868, 57869, 57870, 57871, 57872, 57873, 57874, 57875, 57876, 57877, + 57878, 57879, 57880, 57881, 57882, 57883, 57884, 57885, 57886, 57887, + 57888, 57889, 57890, 57891, 57892, 57893, 57894, 57895, 57896, 57897, + 57898, 57899, 57900, 57901, 57902, 57903, 57904, 57905, 57906, 57907, + 30277, 30278, 30279, 30280, 30281, 30282, 30283, 30286, 30287, 30288, + 30289, 30290, 30291, 30293, 30295, 30296, 30297, 30298, 30299, 30301, + 30303, 30304, 30305, 30306, 30308, 30309, 30310, 30311, 30312, 30313, + 30314, 30316, 30317, 30318, 30320, 30321, 30322, 30323, 30324, 30325, + 30326, 30327, 30329, 30330, 30332, 30335, 30336, 30337, 30339, 30341, + 30345, 30346, 30348, 30349, 30351, 30352, 30354, 30356, 30357, 30359, + 30360, 30362, 30363, 30364, 30365, 30366, 30367, 30368, 30369, 30370, + 30371, 30373, 30374, 30375, 30376, 30377, 30378, 30379, 30380, 30381, + 30383, 30384, 30387, 30389, 30390, 30391, 30392, 30393, 30394, 30395, + 30396, 30397, 30398, 30400, 30401, 30403, 21834, 38463, 22467, 25384, + 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, 29233, + 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, 26696, + 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, 22885, + 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, 20843, 30116, + 24052, 25300, 36299, 38774, 25226, 32793, 22365, 38712, 32610, 29240, + 30333, 26575, 30334, 25670, 20336, 36133, 25308, 31255, 26001, 29677, + 25644, 25203, 33324, 39041, 26495, 29256, 25198, 25292, 20276, 29923, + 21322, 21150, 32458, 37030, 24110, 26758, 27036, 33152, 32465, 26834, + 30917, 34444, 38225, 20621, 35876, 33502, 32990, 21253, 35090, 21093, + 30404, 30407, 30409, 30411, 30412, 30419, 30421, 30425, 30426, 30428, + 30429, 30430, 30432, 30433, 30434, 30435, 30436, 30438, 30439, 30440, + 30441, 30442, 30443, 30444, 30445, 30448, 30451, 30453, 30454, 30455, + 30458, 30459, 30461, 30463, 30464, 30466, 30467, 30469, 30470, 30474, + 30476, 30478, 30479, 30480, 30481, 30482, 30483, 30484, 30485, 30486, + 30487, 30488, 30491, 30492, 30493, 30494, 30497, 30499, 30500, 30501, + 30503, 30506, 30507, 30508, 30510, 30512, 30513, 30514, 30515, 30516, + 30521, 30523, 30525, 30526, 30527, 30530, 30532, 30533, 30534, 30536, + 30537, 30538, 30539, 30540, 30541, 30542, 30543, 30546, 30547, 30548, + 30549, 30550, 30551, 30552, 30553, 30556, 34180, 38649, 20445, 22561, + 39281, 23453, 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, + 24754, 21329, 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, + 24811, 28953, 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, + 27893, 36454, 36856, 36924, 40763, 27604, 37145, 31508, 24444, 30887, + 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, + 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, + 36140, 25153, 20415, 21464, 21342, 36776, 36777, 36779, 36941, 26631, + 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, + 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, + 30557, 30558, 30559, 30560, 30564, 30567, 30569, 30570, 30573, 30574, + 30575, 30576, 30577, 30578, 30579, 30580, 30581, 30582, 30583, 30584, + 30586, 30587, 30588, 30593, 30594, 30595, 30598, 30599, 30600, 30601, + 30602, 30603, 30607, 30608, 30611, 30612, 30613, 30614, 30615, 30616, + 30617, 30618, 30619, 30620, 30621, 30622, 30625, 30627, 30628, 30630, + 30632, 30635, 30637, 30638, 30639, 30641, 30642, 30644, 30646, 30647, + 30648, 30649, 30650, 30652, 30654, 30656, 30657, 30658, 30659, 30660, + 30661, 30662, 30663, 30664, 30665, 30666, 30667, 30668, 30670, 30671, + 30672, 30673, 30674, 30675, 30676, 30677, 30678, 30680, 30681, 30682, + 30685, 30686, 30687, 30688, 30689, 30692, 30149, 24182, 29627, 33760, + 25773, 25320, 38069, 27874, 21338, 21187, 25615, 38082, 31636, 20271, + 24091, 33334, 33046, 33162, 28196, 27850, 39539, 25429, 21340, 21754, + 34917, 22496, 19981, 24067, 27493, 31807, 37096, 24598, 25830, 29468, + 35009, 26448, 25165, 36130, 30572, 36393, 37319, 24425, 33756, 34081, + 39184, 21442, 34453, 27531, 24813, 24808, 28799, 33485, 33329, 20179, + 27815, 34255, 25805, 31961, 27133, 26361, 33609, 21397, 31574, 20391, + 20876, 27979, 23618, 36461, 25554, 21449, 33580, 33590, 26597, 30900, + 25661, 23519, 23700, 24046, 35815, 25286, 26612, 35962, 25600, 25530, + 34633, 39307, 35863, 32544, 38130, 20135, 38416, 39076, 26124, 29462, + 30694, 30696, 30698, 30703, 30704, 30705, 30706, 30708, 30709, 30711, + 30713, 30714, 30715, 30716, 30723, 30724, 30725, 30726, 30727, 30728, + 30730, 30731, 30734, 30735, 30736, 30739, 30741, 30745, 30747, 30750, + 30752, 30753, 30754, 30756, 30760, 30762, 30763, 30766, 30767, 30769, + 30770, 30771, 30773, 30774, 30781, 30783, 30785, 30786, 30787, 30788, + 30790, 30792, 30793, 30794, 30795, 30797, 30799, 30801, 30803, 30804, + 30808, 30809, 30810, 30811, 30812, 30814, 30815, 30816, 30817, 30818, + 30819, 30820, 30821, 30822, 30823, 30824, 30825, 30831, 30832, 30833, + 30834, 30835, 30836, 30837, 30838, 30840, 30841, 30842, 30843, 30845, + 30846, 30847, 30848, 30849, 30850, 30851, 22330, 23581, 24120, 38271, + 20607, 32928, 21378, 25950, 30021, 21809, 20513, 36229, 25220, 38046, + 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, + 24443, 28552, 37108, 33251, 36784, 23576, 26216, 24561, 27785, 38472, + 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, 20056, 31243, + 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, 30196, 25345, + 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, 23610, 36196, + 32709, 26021, 28861, 20805, 20914, 34411, 23815, 23456, 25277, 37228, + 30068, 36364, 31264, 24833, 31609, 20167, 32504, 30597, 19985, 33261, + 21021, 20986, 27249, 21416, 36487, 38148, 38607, 28353, 38500, 26970, + 30852, 30853, 30854, 30856, 30858, 30859, 30863, 30864, 30866, 30868, + 30869, 30870, 30873, 30877, 30878, 30880, 30882, 30884, 30886, 30888, + 30889, 30890, 30891, 30892, 30893, 30894, 30895, 30901, 30902, 30903, + 30904, 30906, 30907, 30908, 30909, 30911, 30912, 30914, 30915, 30916, + 30918, 30919, 30920, 30924, 30925, 30926, 30927, 30929, 30930, 30931, + 30934, 30935, 30936, 30938, 30939, 30940, 30941, 30942, 30943, 30944, + 30945, 30946, 30947, 30948, 30949, 30950, 30951, 30953, 30954, 30955, + 30957, 30958, 30959, 30960, 30961, 30963, 30965, 30966, 30968, 30969, + 30971, 30972, 30973, 30974, 30975, 30976, 30978, 30979, 30980, 30982, + 30983, 30984, 30985, 30986, 30987, 30988, 30784, 20648, 30679, 25616, + 35302, 22788, 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, + 30126, 31383, 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, + 22402, 26149, 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, + 30133, 33576, 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, + 36176, 27425, 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, + 37259, 31751, 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, + 30209, 31929, 28140, 32736, 26449, 23384, 23544, 30923, 25774, 25619, + 25514, 25387, 38169, 25645, 36798, 31572, 30249, 25171, 22823, 21574, + 27513, 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, 36910, + 30989, 30990, 30991, 30992, 30993, 30994, 30996, 30997, 30998, 30999, + 31000, 31001, 31002, 31003, 31004, 31005, 31007, 31008, 31009, 31010, + 31011, 31013, 31014, 31015, 31016, 31017, 31018, 31019, 31020, 31021, + 31022, 31023, 31024, 31025, 31026, 31027, 31029, 31030, 31031, 31032, + 31033, 31037, 31039, 31042, 31043, 31044, 31045, 31047, 31050, 31051, + 31052, 31053, 31054, 31055, 31056, 31057, 31058, 31060, 31061, 31064, + 31065, 31073, 31075, 31076, 31078, 31081, 31082, 31083, 31084, 31086, + 31088, 31089, 31090, 31091, 31092, 31093, 31094, 31097, 31099, 31100, + 31101, 31102, 31103, 31106, 31107, 31110, 31111, 31112, 31113, 31115, + 31116, 31117, 31118, 31120, 31121, 31122, 24608, 32829, 25285, 20025, + 21333, 37112, 25528, 32966, 26086, 27694, 20294, 24814, 28129, 35806, + 24377, 34507, 24403, 25377, 20826, 33633, 26723, 20992, 25443, 36424, + 20498, 23707, 31095, 23548, 21040, 31291, 24764, 36947, 30423, 24503, + 24471, 30340, 36460, 28783, 30331, 31561, 30634, 20979, 37011, 22564, + 20302, 28404, 36842, 25932, 31515, 29380, 28068, 32735, 23265, 25269, + 24213, 22320, 33922, 31532, 24093, 24351, 36882, 32532, 39072, 25474, + 28359, 30872, 28857, 20856, 38747, 22443, 30005, 20291, 30008, 24215, + 24806, 22880, 28096, 27583, 30857, 21500, 38613, 20939, 20993, 25481, + 21514, 38035, 35843, 36300, 29241, 30879, 34678, 36845, 35853, 21472, + 31123, 31124, 31125, 31126, 31127, 31128, 31129, 31131, 31132, 31133, + 31134, 31135, 31136, 31137, 31138, 31139, 31140, 31141, 31142, 31144, + 31145, 31146, 31147, 31148, 31149, 31150, 31151, 31152, 31153, 31154, + 31156, 31157, 31158, 31159, 31160, 31164, 31167, 31170, 31172, 31173, + 31175, 31176, 31178, 31180, 31182, 31183, 31184, 31187, 31188, 31190, + 31191, 31193, 31194, 31195, 31196, 31197, 31198, 31200, 31201, 31202, + 31205, 31208, 31210, 31212, 31214, 31217, 31218, 31219, 31220, 31221, + 31222, 31223, 31225, 31226, 31228, 31230, 31231, 31233, 31236, 31237, + 31239, 31240, 31241, 31242, 31244, 31247, 31248, 31249, 31250, 31251, + 31253, 31254, 31256, 31257, 31259, 31260, 19969, 30447, 21486, 38025, + 39030, 40718, 38189, 23450, 35746, 20002, 19996, 20908, 33891, 25026, + 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, 26007, 38497, + 35910, 36887, 30168, 37117, 30563, 27602, 29322, 29420, 35835, 22581, + 30585, 36172, 26460, 38208, 32922, 24230, 28193, 22930, 31471, 30701, + 38203, 27573, 26029, 32526, 22534, 20817, 38431, 23545, 22697, 21544, + 36466, 25958, 39039, 22244, 38045, 30462, 36929, 25479, 21702, 22810, + 22842, 22427, 36530, 26421, 36346, 33333, 21057, 24816, 22549, 34558, + 23784, 40517, 20420, 39069, 35769, 23077, 24694, 21380, 25212, 36943, + 37122, 39295, 24681, 32780, 20799, 32819, 23572, 39285, 27953, 20108, + 31261, 31263, 31265, 31266, 31268, 31269, 31270, 31271, 31272, 31273, + 31274, 31275, 31276, 31277, 31278, 31279, 31280, 31281, 31282, 31284, + 31285, 31286, 31288, 31290, 31294, 31296, 31297, 31298, 31299, 31300, + 31301, 31303, 31304, 31305, 31306, 31307, 31308, 31309, 31310, 31311, + 31312, 31314, 31315, 31316, 31317, 31318, 31320, 31321, 31322, 31323, + 31324, 31325, 31326, 31327, 31328, 31329, 31330, 31331, 31332, 31333, + 31334, 31335, 31336, 31337, 31338, 31339, 31340, 31341, 31342, 31343, + 31345, 31346, 31347, 31349, 31355, 31356, 31357, 31358, 31362, 31365, + 31367, 31369, 31370, 31371, 31372, 31374, 31375, 31376, 31379, 31380, + 31385, 31386, 31387, 31390, 31393, 31394, 36144, 21457, 32602, 31567, + 20240, 20047, 38400, 27861, 29648, 34281, 24070, 30058, 32763, 27146, + 30718, 38034, 32321, 20961, 28902, 21453, 36820, 33539, 36137, 29359, + 39277, 27867, 22346, 33459, 26041, 32938, 25151, 38450, 22952, 20223, + 35775, 32442, 25918, 33778, 38750, 21857, 39134, 32933, 21290, 35837, + 21536, 32954, 24223, 27832, 36153, 33452, 37210, 21545, 27675, 20998, + 32439, 22367, 28954, 27774, 31881, 22859, 20221, 24575, 24868, 31914, + 20016, 23553, 26539, 34562, 23792, 38155, 39118, 30127, 28925, 36898, + 20911, 32541, 35773, 22857, 20964, 20315, 21542, 22827, 25975, 32932, + 23413, 25206, 25282, 36752, 24133, 27679, 31526, 20239, 20440, 26381, + 31395, 31396, 31399, 31401, 31402, 31403, 31406, 31407, 31408, 31409, + 31410, 31412, 31413, 31414, 31415, 31416, 31417, 31418, 31419, 31420, + 31421, 31422, 31424, 31425, 31426, 31427, 31428, 31429, 31430, 31431, + 31432, 31433, 31434, 31436, 31437, 31438, 31439, 31440, 31441, 31442, + 31443, 31444, 31445, 31447, 31448, 31450, 31451, 31452, 31453, 31457, + 31458, 31460, 31463, 31464, 31465, 31466, 31467, 31468, 31470, 31472, + 31473, 31474, 31475, 31476, 31477, 31478, 31479, 31480, 31483, 31484, + 31486, 31488, 31489, 31490, 31493, 31495, 31497, 31500, 31501, 31502, + 31504, 31506, 31507, 31510, 31511, 31512, 31514, 31516, 31517, 31519, + 31521, 31522, 31523, 31527, 31529, 31533, 28014, 28074, 31119, 34993, + 24343, 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, + 33104, 36212, 21103, 35206, 36171, 22797, 20613, 20184, 38428, 29238, + 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, 22134, 22030, + 35813, 25913, 27010, 38041, 30422, 28297, 24178, 29976, 26438, 26577, + 31487, 32925, 36214, 24863, 31174, 25954, 36195, 20872, 21018, 38050, + 32568, 32923, 32434, 23703, 28207, 26464, 31705, 30347, 39640, 33167, + 32660, 31957, 25630, 38224, 31295, 21578, 21733, 27468, 25601, 25096, + 40509, 33011, 30105, 21106, 38761, 33883, 26684, 34532, 38401, 38548, + 38124, 20010, 21508, 32473, 26681, 36319, 32789, 26356, 24218, 32697, + 31535, 31536, 31538, 31540, 31541, 31542, 31543, 31545, 31547, 31549, + 31551, 31552, 31553, 31554, 31555, 31556, 31558, 31560, 31562, 31565, + 31566, 31571, 31573, 31575, 31577, 31580, 31582, 31583, 31585, 31587, + 31588, 31589, 31590, 31591, 31592, 31593, 31594, 31595, 31596, 31597, + 31599, 31600, 31603, 31604, 31606, 31608, 31610, 31612, 31613, 31615, + 31617, 31618, 31619, 31620, 31622, 31623, 31624, 31625, 31626, 31627, + 31628, 31630, 31631, 31633, 31634, 31635, 31638, 31640, 31641, 31642, + 31643, 31646, 31647, 31648, 31651, 31652, 31653, 31662, 31663, 31664, + 31666, 31667, 31669, 31670, 31671, 31673, 31674, 31675, 31676, 31677, + 31678, 31679, 31680, 31682, 31683, 31684, 22466, 32831, 26775, 24037, + 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, 24339, 24041, + 27742, 25329, 36129, 20849, 38057, 21246, 27807, 33503, 29399, 22434, + 26500, 36141, 22815, 36764, 33735, 21653, 31629, 20272, 27837, 23396, + 22993, 40723, 21476, 34506, 39592, 35895, 32929, 25925, 39038, 22266, + 38599, 21038, 29916, 21072, 23521, 25346, 35074, 20054, 25296, 24618, + 26874, 20851, 23448, 20896, 35266, 31649, 39302, 32592, 24815, 28748, + 36143, 20809, 24191, 36891, 29808, 35268, 22317, 30789, 24402, 40863, + 38394, 36712, 39740, 35809, 30328, 26690, 26588, 36330, 36149, 21053, + 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, + 31685, 31688, 31689, 31690, 31691, 31693, 31694, 31695, 31696, 31698, + 31700, 31701, 31702, 31703, 31704, 31707, 31708, 31710, 31711, 31712, + 31714, 31715, 31716, 31719, 31720, 31721, 31723, 31724, 31725, 31727, + 31728, 31730, 31731, 31732, 31733, 31734, 31736, 31737, 31738, 31739, + 31741, 31743, 31744, 31745, 31746, 31747, 31748, 31749, 31750, 31752, + 31753, 31754, 31757, 31758, 31760, 31761, 31762, 31763, 31764, 31765, + 31767, 31768, 31769, 31770, 31771, 31772, 31773, 31774, 31776, 31777, + 31778, 31779, 31780, 31781, 31784, 31785, 31787, 31788, 31789, 31790, + 31791, 31792, 31793, 31794, 31795, 31796, 31797, 31798, 31799, 31801, + 31802, 31803, 31804, 31805, 31806, 31810, 39608, 23401, 28023, 27686, + 20133, 23475, 39559, 37219, 25000, 37039, 38889, 21547, 28085, 23506, + 20989, 21898, 32597, 32752, 25788, 25421, 26097, 25022, 24717, 28938, + 27735, 27721, 22831, 26477, 33322, 22741, 22158, 35946, 27627, 37085, + 22909, 32791, 21495, 28009, 21621, 21917, 33655, 33743, 26680, 31166, + 21644, 20309, 21512, 30418, 35977, 38402, 27827, 28088, 36203, 35088, + 40548, 36154, 22079, 40657, 30165, 24456, 29408, 24680, 21756, 20136, + 27178, 34913, 24658, 36720, 21700, 28888, 34425, 40511, 27946, 23439, + 24344, 32418, 21897, 20399, 29492, 21564, 21402, 20505, 21518, 21628, + 20046, 24573, 29786, 22774, 33899, 32993, 34676, 29392, 31946, 28246, + 31811, 31812, 31813, 31814, 31815, 31816, 31817, 31818, 31819, 31820, + 31822, 31823, 31824, 31825, 31826, 31827, 31828, 31829, 31830, 31831, + 31832, 31833, 31834, 31835, 31836, 31837, 31838, 31839, 31840, 31841, + 31842, 31843, 31844, 31845, 31846, 31847, 31848, 31849, 31850, 31851, + 31852, 31853, 31854, 31855, 31856, 31857, 31858, 31861, 31862, 31863, + 31864, 31865, 31866, 31870, 31871, 31872, 31873, 31874, 31875, 31876, + 31877, 31878, 31879, 31880, 31882, 31883, 31884, 31885, 31886, 31887, + 31888, 31891, 31892, 31894, 31897, 31898, 31899, 31904, 31905, 31907, + 31910, 31911, 31912, 31913, 31915, 31916, 31917, 31919, 31920, 31924, + 31925, 31926, 31927, 31928, 31930, 31931, 24359, 34382, 21804, 25252, + 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, + 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, + 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, + 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, + 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, + 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, + 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, + 27985, 28151, 35905, 27963, 20249, 28779, 33719, 25110, 24785, 38669, + 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, 31637, + 31935, 31936, 31938, 31939, 31940, 31942, 31945, 31947, 31950, 31951, + 31952, 31953, 31954, 31955, 31956, 31960, 31962, 31963, 31965, 31966, + 31969, 31970, 31971, 31972, 31973, 31974, 31975, 31977, 31978, 31979, + 31980, 31981, 31982, 31984, 31985, 31986, 31987, 31988, 31989, 31990, + 31991, 31993, 31994, 31996, 31997, 31998, 31999, 32000, 32001, 32002, + 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32011, 32012, 32013, + 32014, 32015, 32016, 32017, 32018, 32019, 32020, 32021, 32022, 32023, + 32024, 32025, 32026, 32027, 32028, 32029, 32030, 32031, 32033, 32035, + 32036, 32037, 32038, 32040, 32041, 32042, 32044, 32045, 32046, 32048, + 32049, 32050, 32051, 32052, 32053, 32054, 32908, 39269, 36857, 28608, + 35749, 40481, 23020, 32489, 32521, 21513, 26497, 26840, 36753, 31821, + 38598, 21450, 24613, 30142, 27762, 21363, 23241, 32423, 25380, 20960, + 33034, 24049, 34015, 25216, 20864, 23395, 20238, 31085, 21058, 24760, + 27982, 23492, 23490, 35745, 35760, 26082, 24524, 38469, 22931, 32487, + 32426, 22025, 26551, 22841, 20339, 23478, 21152, 33626, 39050, 36158, + 30002, 38078, 20551, 31292, 20215, 26550, 39550, 23233, 27516, 30417, + 22362, 23574, 31546, 38388, 29006, 20860, 32937, 33392, 22904, 32516, + 33575, 26816, 26604, 30897, 30839, 25315, 25441, 31616, 20461, 21098, + 20943, 33616, 27099, 37492, 36341, 36145, 35265, 38190, 31661, 20214, + 32055, 32056, 32057, 32058, 32059, 32060, 32061, 32062, 32063, 32064, + 32065, 32066, 32067, 32068, 32069, 32070, 32071, 32072, 32073, 32074, + 32075, 32076, 32077, 32078, 32079, 32080, 32081, 32082, 32083, 32084, + 32085, 32086, 32087, 32088, 32089, 32090, 32091, 32092, 32093, 32094, + 32095, 32096, 32097, 32098, 32099, 32100, 32101, 32102, 32103, 32104, + 32105, 32106, 32107, 32108, 32109, 32111, 32112, 32113, 32114, 32115, + 32116, 32117, 32118, 32120, 32121, 32122, 32123, 32124, 32125, 32126, + 32127, 32128, 32129, 32130, 32131, 32132, 32133, 32134, 32135, 32136, + 32137, 32138, 32139, 32140, 32141, 32142, 32143, 32144, 32145, 32146, + 32147, 32148, 32149, 32150, 32151, 32152, 20581, 33328, 21073, 39279, + 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, 30086, + 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, 30977, + 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, 38128, + 30699, 20389, 33050, 29409, 35282, 39290, 32564, 32478, 21119, 25945, + 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, 31224, 34903, + 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, 31469, 27905, + 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, 20171, 30117, + 35819, 23626, 24062, 31563, 26020, 37329, 20170, 27941, 35167, 32039, + 38182, 20165, 35880, 36827, 38771, 26187, 31105, 36817, 28908, 28024, + 32153, 32154, 32155, 32156, 32157, 32158, 32159, 32160, 32161, 32162, + 32163, 32164, 32165, 32167, 32168, 32169, 32170, 32171, 32172, 32173, + 32175, 32176, 32177, 32178, 32179, 32180, 32181, 32182, 32183, 32184, + 32185, 32186, 32187, 32188, 32189, 32190, 32191, 32192, 32193, 32194, + 32195, 32196, 32197, 32198, 32199, 32200, 32201, 32202, 32203, 32204, + 32205, 32206, 32207, 32208, 32209, 32210, 32211, 32212, 32213, 32214, + 32215, 32216, 32217, 32218, 32219, 32220, 32221, 32222, 32223, 32224, + 32225, 32226, 32227, 32228, 32229, 32230, 32231, 32232, 32233, 32234, + 32235, 32236, 32237, 32238, 32239, 32240, 32241, 32242, 32243, 32244, + 32245, 32246, 32247, 32248, 32249, 32250, 23613, 21170, 33606, 20834, + 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, + 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, + 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, 38893, + 20037, 28792, 20061, 37202, 21417, 25937, 26087, 33276, 33285, 21646, + 23601, 30106, 38816, 25304, 29401, 30141, 23621, 39545, 33738, 23616, + 21632, 30697, 20030, 27822, 32858, 25298, 25454, 24040, 20855, 36317, + 36382, 38191, 20465, 21477, 24807, 28844, 21095, 25424, 40515, 23071, + 20518, 30519, 21367, 32482, 25733, 25899, 25225, 25496, 20500, 29237, + 35273, 20915, 35776, 32477, 22343, 33740, 38055, 20891, 21531, 23803, + 32251, 32252, 32253, 32254, 32255, 32256, 32257, 32258, 32259, 32260, + 32261, 32262, 32263, 32264, 32265, 32266, 32267, 32268, 32269, 32270, + 32271, 32272, 32273, 32274, 32275, 32276, 32277, 32278, 32279, 32280, + 32281, 32282, 32283, 32284, 32285, 32286, 32287, 32288, 32289, 32290, + 32291, 32292, 32293, 32294, 32295, 32296, 32297, 32298, 32299, 32300, + 32301, 32302, 32303, 32304, 32305, 32306, 32307, 32308, 32309, 32310, + 32311, 32312, 32313, 32314, 32316, 32317, 32318, 32319, 32320, 32322, + 32323, 32324, 32325, 32326, 32328, 32329, 32330, 32331, 32332, 32333, + 32334, 32335, 32336, 32337, 32338, 32339, 32340, 32341, 32342, 32343, + 32344, 32345, 32346, 32347, 32348, 32349, 20426, 31459, 27994, 37089, + 39567, 21888, 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, + 21002, 22570, 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, + 25239, 20130, 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, + 26869, 30933, 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, + 23458, 35838, 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, + 23380, 25511, 25248, 21475, 25187, 23495, 26543, 21741, 31391, 33510, + 37239, 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, + 20393, 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, + 26103, 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, + 32350, 32351, 32352, 32353, 32354, 32355, 32356, 32357, 32358, 32359, + 32360, 32361, 32362, 32363, 32364, 32365, 32366, 32367, 32368, 32369, + 32370, 32371, 32372, 32373, 32374, 32375, 32376, 32377, 32378, 32379, + 32380, 32381, 32382, 32383, 32384, 32385, 32387, 32388, 32389, 32390, + 32391, 32392, 32393, 32394, 32395, 32396, 32397, 32398, 32399, 32400, + 32401, 32402, 32403, 32404, 32405, 32406, 32407, 32408, 32409, 32410, + 32412, 32413, 32414, 32430, 32436, 32443, 32444, 32470, 32484, 32492, + 32505, 32522, 32528, 32542, 32567, 32569, 32571, 32572, 32573, 32574, + 32575, 32576, 32577, 32579, 32582, 32583, 32584, 32585, 32586, 32587, + 32588, 32589, 32590, 32591, 32594, 32595, 39304, 24871, 28291, 22372, + 26118, 25414, 22256, 25324, 25193, 24275, 38420, 22403, 25289, 21895, + 34593, 33098, 36771, 21862, 33713, 26469, 36182, 34013, 23146, 26639, + 25318, 31726, 38417, 20848, 28572, 35888, 25597, 35272, 25042, 32518, + 28866, 28389, 29701, 27028, 29436, 24266, 37070, 26391, 28010, 25438, + 21171, 29282, 32769, 20332, 23013, 37226, 28889, 28061, 21202, 20048, + 38647, 38253, 34174, 30922, 32047, 20769, 22418, 25794, 32907, 31867, + 27882, 26865, 26974, 20919, 21400, 26792, 29313, 40654, 31729, 29432, + 31163, 28435, 29702, 26446, 37324, 40100, 31036, 33673, 33620, 21519, + 26647, 20029, 21385, 21169, 30782, 21382, 21033, 20616, 20363, 20432, + 32598, 32601, 32603, 32604, 32605, 32606, 32608, 32611, 32612, 32613, + 32614, 32615, 32619, 32620, 32621, 32623, 32624, 32627, 32629, 32630, + 32631, 32632, 32634, 32635, 32636, 32637, 32639, 32640, 32642, 32643, + 32644, 32645, 32646, 32647, 32648, 32649, 32651, 32653, 32655, 32656, + 32657, 32658, 32659, 32661, 32662, 32663, 32664, 32665, 32667, 32668, + 32672, 32674, 32675, 32677, 32678, 32680, 32681, 32682, 32683, 32684, + 32685, 32686, 32689, 32691, 32692, 32693, 32694, 32695, 32698, 32699, + 32702, 32704, 32706, 32707, 32708, 32710, 32711, 32712, 32713, 32715, + 32717, 32719, 32720, 32721, 32722, 32723, 32726, 32727, 32729, 32730, + 32731, 32732, 32733, 32734, 32738, 32739, 30178, 31435, 31890, 27813, + 38582, 21147, 29827, 21737, 20457, 32852, 33714, 36830, 38256, 24265, + 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, 32451, 31918, + 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, 20142, 35845, + 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, 20102, 25730, + 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, 29747, 26519, + 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, 21533, 25294, + 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, 28789, 38517, + 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, 39311, 30041, + 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, 31548, 31423, + 32740, 32743, 32744, 32746, 32747, 32748, 32749, 32751, 32754, 32756, + 32757, 32758, 32759, 32760, 32761, 32762, 32765, 32766, 32767, 32770, + 32775, 32776, 32777, 32778, 32782, 32783, 32785, 32787, 32794, 32795, + 32797, 32798, 32799, 32801, 32803, 32804, 32811, 32812, 32813, 32814, + 32815, 32816, 32818, 32820, 32825, 32826, 32828, 32830, 32832, 32833, + 32836, 32837, 32839, 32840, 32841, 32846, 32847, 32848, 32849, 32851, + 32853, 32854, 32855, 32857, 32859, 32860, 32861, 32862, 32863, 32864, + 32865, 32866, 32867, 32868, 32869, 32870, 32871, 32872, 32875, 32876, + 32877, 32878, 32879, 32880, 32882, 32883, 32884, 32885, 32886, 32887, + 32888, 32889, 32890, 32891, 32892, 32893, 38534, 22404, 25314, 38471, + 27004, 23044, 25602, 31699, 28431, 38475, 33446, 21346, 39045, 24208, + 28809, 25523, 21348, 34383, 40065, 40595, 30860, 38706, 36335, 36162, + 40575, 28510, 31108, 24405, 38470, 25134, 39540, 21525, 38109, 20387, + 26053, 23653, 23649, 32533, 34385, 27695, 24459, 29575, 28388, 32511, + 23782, 25371, 23402, 28390, 21365, 20081, 25504, 30053, 25249, 36718, + 20262, 20177, 27814, 32438, 35770, 33821, 34746, 32599, 36923, 38179, + 31657, 39585, 35064, 33853, 27931, 39558, 32476, 22920, 40635, 29595, + 30721, 34434, 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, + 36808, 33033, 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, + 32894, 32897, 32898, 32901, 32904, 32906, 32909, 32910, 32911, 32912, + 32913, 32914, 32916, 32917, 32919, 32921, 32926, 32931, 32934, 32935, + 32936, 32940, 32944, 32947, 32949, 32950, 32952, 32953, 32955, 32965, + 32967, 32968, 32969, 32970, 32971, 32975, 32976, 32977, 32978, 32979, + 32980, 32981, 32984, 32991, 32992, 32994, 32995, 32998, 33006, 33013, + 33015, 33017, 33019, 33022, 33023, 33024, 33025, 33027, 33028, 33029, + 33031, 33032, 33035, 33036, 33045, 33047, 33049, 33051, 33052, 33053, + 33055, 33056, 33057, 33058, 33059, 33060, 33061, 33062, 33063, 33064, + 33065, 33066, 33067, 33069, 33070, 33072, 33075, 33076, 33077, 33079, + 33081, 33082, 33083, 33084, 33085, 33087, 35881, 33426, 33579, 30450, + 27667, 24537, 33725, 29483, 33541, 38170, 27611, 30683, 38086, 21359, + 33538, 20882, 24125, 35980, 36152, 20040, 29611, 26522, 26757, 37238, + 38665, 29028, 27809, 30473, 23186, 38209, 27599, 32654, 26151, 23504, + 22969, 23194, 38376, 38391, 20204, 33804, 33945, 27308, 30431, 38192, + 29467, 26790, 23391, 30511, 37274, 38753, 31964, 36855, 35868, 24357, + 31859, 31192, 35269, 27852, 34588, 23494, 24130, 26825, 30496, 32501, + 20885, 20813, 21193, 23081, 32517, 38754, 33495, 25551, 30596, 34256, + 31186, 28218, 24217, 22937, 34065, 28781, 27665, 25279, 30399, 25935, + 24751, 38397, 26126, 34719, 40483, 38125, 21517, 21629, 35884, 25720, + 33088, 33089, 33090, 33091, 33092, 33093, 33095, 33097, 33101, 33102, + 33103, 33106, 33110, 33111, 33112, 33115, 33116, 33117, 33118, 33119, + 33121, 33122, 33123, 33124, 33126, 33128, 33130, 33131, 33132, 33135, + 33138, 33139, 33141, 33142, 33143, 33144, 33153, 33155, 33156, 33157, + 33158, 33159, 33161, 33163, 33164, 33165, 33166, 33168, 33170, 33171, + 33172, 33173, 33174, 33175, 33177, 33178, 33182, 33183, 33184, 33185, + 33186, 33188, 33189, 33191, 33193, 33195, 33196, 33197, 33198, 33199, + 33200, 33201, 33202, 33204, 33205, 33206, 33207, 33208, 33209, 33212, + 33213, 33214, 33215, 33220, 33221, 33223, 33224, 33225, 33227, 33229, + 33230, 33231, 33232, 33233, 33234, 33235, 25721, 34321, 27169, 33180, + 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, 28448, + 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, 27597, + 22675, 26286, 24149, 21215, 24917, 26408, 30446, 30566, 29287, 31302, + 25343, 21738, 21584, 38048, 37027, 23068, 32435, 27670, 20035, 22902, + 32784, 22856, 21335, 30007, 38590, 22218, 25376, 33041, 24700, 38393, + 28118, 21602, 39297, 20869, 23273, 33021, 22958, 38675, 20522, 27877, + 23612, 25311, 20320, 21311, 33147, 36870, 28346, 34091, 25288, 24180, + 30910, 25781, 25467, 24565, 23064, 37247, 40479, 23615, 25423, 32834, + 23421, 21870, 38218, 38221, 28037, 24744, 26592, 29406, 20957, 23425, + 33236, 33237, 33238, 33239, 33240, 33241, 33242, 33243, 33244, 33245, + 33246, 33247, 33248, 33249, 33250, 33252, 33253, 33254, 33256, 33257, + 33259, 33262, 33263, 33264, 33265, 33266, 33269, 33270, 33271, 33272, + 33273, 33274, 33277, 33279, 33283, 33287, 33288, 33289, 33290, 33291, + 33294, 33295, 33297, 33299, 33301, 33302, 33303, 33304, 33305, 33306, + 33309, 33312, 33316, 33317, 33318, 33319, 33321, 33326, 33330, 33338, + 33340, 33341, 33343, 33344, 33345, 33346, 33347, 33349, 33350, 33352, + 33354, 33356, 33357, 33358, 33360, 33361, 33362, 33363, 33364, 33365, + 33366, 33367, 33369, 33371, 33372, 33373, 33374, 33376, 33377, 33378, + 33379, 33380, 33381, 33382, 33383, 33385, 25319, 27870, 29275, 25197, + 38062, 32445, 33043, 27987, 20892, 24324, 22900, 21162, 24594, 22899, + 26262, 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, + 27572, 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, + 29750, 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, + 30928, 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, + 25243, 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, + 35060, 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, + 28921, 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, + 25447, 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, + 33386, 33387, 33388, 33389, 33393, 33397, 33398, 33399, 33400, 33403, + 33404, 33408, 33409, 33411, 33413, 33414, 33415, 33417, 33420, 33424, + 33427, 33428, 33429, 33430, 33434, 33435, 33438, 33440, 33442, 33443, + 33447, 33458, 33461, 33462, 33466, 33467, 33468, 33471, 33472, 33474, + 33475, 33477, 33478, 33481, 33488, 33494, 33497, 33498, 33501, 33506, + 33511, 33512, 33513, 33514, 33516, 33517, 33518, 33520, 33522, 33523, + 33525, 33526, 33528, 33530, 33532, 33533, 33534, 33535, 33536, 33546, + 33547, 33549, 33552, 33554, 33555, 33558, 33560, 33561, 33565, 33566, + 33567, 33568, 33569, 33570, 33571, 33572, 33573, 33574, 33577, 33578, + 33582, 33584, 33586, 33591, 33595, 33597, 21860, 33086, 30130, 30382, + 21305, 30174, 20731, 23617, 35692, 31687, 20559, 29255, 39575, 39128, + 28418, 29922, 31080, 25735, 30629, 25340, 39057, 36139, 21697, 32856, + 20050, 22378, 33529, 33805, 24179, 20973, 29942, 35780, 23631, 22369, + 27900, 39047, 23110, 30772, 39748, 36843, 31893, 21078, 25169, 38138, + 20166, 33670, 33889, 33769, 33970, 22484, 26420, 22275, 26222, 28006, + 35889, 26333, 28689, 26399, 27450, 26646, 25114, 22971, 19971, 20932, + 28422, 26578, 27791, 20854, 26827, 22855, 27495, 30054, 23822, 33040, + 40784, 26071, 31048, 31041, 39569, 36215, 23682, 20062, 20225, 21551, + 22865, 30732, 22120, 27668, 36804, 24323, 27773, 27875, 35755, 25488, + 33598, 33599, 33601, 33602, 33604, 33605, 33608, 33610, 33611, 33612, + 33613, 33614, 33619, 33621, 33622, 33623, 33624, 33625, 33629, 33634, + 33648, 33649, 33650, 33651, 33652, 33653, 33654, 33657, 33658, 33662, + 33663, 33664, 33665, 33666, 33667, 33668, 33671, 33672, 33674, 33675, + 33676, 33677, 33679, 33680, 33681, 33684, 33685, 33686, 33687, 33689, + 33690, 33693, 33695, 33697, 33698, 33699, 33700, 33701, 33702, 33703, + 33708, 33709, 33710, 33711, 33717, 33723, 33726, 33727, 33730, 33731, + 33732, 33734, 33736, 33737, 33739, 33741, 33742, 33744, 33745, 33746, + 33747, 33749, 33751, 33753, 33754, 33755, 33758, 33762, 33763, 33764, + 33766, 33767, 33768, 33771, 33772, 33773, 24688, 27965, 29301, 25190, + 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, + 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, 27424, 27465, + 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, 38201, + 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, 32728, + 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, 20405, + 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, 38738, + 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, 39031, + 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, 22234, + 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, 28192, + 33774, 33775, 33779, 33780, 33781, 33782, 33783, 33786, 33787, 33788, + 33790, 33791, 33792, 33794, 33797, 33799, 33800, 33801, 33802, 33808, + 33810, 33811, 33812, 33813, 33814, 33815, 33817, 33818, 33819, 33822, + 33823, 33824, 33825, 33826, 33827, 33833, 33834, 33835, 33836, 33837, + 33838, 33839, 33840, 33842, 33843, 33844, 33845, 33846, 33847, 33849, + 33850, 33851, 33854, 33855, 33856, 33857, 33858, 33859, 33860, 33861, + 33863, 33864, 33865, 33866, 33867, 33868, 33869, 33870, 33871, 33872, + 33874, 33875, 33876, 33877, 33878, 33880, 33885, 33886, 33887, 33888, + 33890, 33892, 33893, 33894, 33895, 33896, 33898, 33902, 33903, 33904, + 33906, 33908, 33911, 33913, 33915, 33916, 21462, 23094, 40843, 36259, + 21435, 22280, 39079, 26435, 37275, 27849, 20840, 30154, 25331, 29356, + 21048, 21149, 32570, 28820, 30264, 21364, 40522, 27063, 30830, 38592, + 35033, 32676, 28982, 29123, 20873, 26579, 29924, 22756, 25880, 22199, + 35753, 39286, 25200, 32469, 24825, 28909, 22764, 20161, 20154, 24525, + 38887, 20219, 35748, 20995, 22922, 32427, 25172, 20173, 26085, 25102, + 33592, 33993, 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, + 26580, 32905, 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, + 20837, 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, 33509, + 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, 21441, + 33917, 33918, 33919, 33920, 33921, 33923, 33924, 33925, 33926, 33930, + 33933, 33935, 33936, 33937, 33938, 33939, 33940, 33941, 33942, 33944, + 33946, 33947, 33949, 33950, 33951, 33952, 33954, 33955, 33956, 33957, + 33958, 33959, 33960, 33961, 33962, 33963, 33964, 33965, 33966, 33968, + 33969, 33971, 33973, 33974, 33975, 33979, 33980, 33982, 33984, 33986, + 33987, 33989, 33990, 33991, 33992, 33995, 33996, 33998, 33999, 34002, + 34004, 34005, 34007, 34008, 34009, 34010, 34011, 34012, 34014, 34017, + 34018, 34020, 34023, 34024, 34025, 34026, 34027, 34029, 34030, 34031, + 34033, 34034, 34035, 34036, 34037, 34038, 34039, 34040, 34041, 34042, + 34043, 34045, 34046, 34048, 34049, 34050, 20254, 25955, 26705, 21971, + 20007, 25620, 39578, 25195, 23234, 29791, 33394, 28073, 26862, 20711, + 33678, 30722, 26432, 21049, 27801, 32433, 20667, 21861, 29022, 31579, + 26194, 29642, 33515, 26441, 23665, 21024, 29053, 34923, 38378, 38485, + 25797, 36193, 33203, 21892, 27733, 25159, 32558, 22674, 20260, 21830, + 36175, 26188, 19978, 23578, 35059, 26786, 25422, 31245, 28903, 33421, + 21242, 38902, 23569, 21736, 37045, 32461, 22882, 36170, 34503, 33292, + 33293, 36198, 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, + 21627, 20280, 36523, 28145, 23072, 32453, 31070, 27784, 23457, 23158, + 29978, 32958, 24910, 28183, 22768, 29983, 29989, 29298, 21319, 32499, + 34051, 34052, 34053, 34054, 34055, 34056, 34057, 34058, 34059, 34061, + 34062, 34063, 34064, 34066, 34068, 34069, 34070, 34072, 34073, 34075, + 34076, 34077, 34078, 34080, 34082, 34083, 34084, 34085, 34086, 34087, + 34088, 34089, 34090, 34093, 34094, 34095, 34096, 34097, 34098, 34099, + 34100, 34101, 34102, 34110, 34111, 34112, 34113, 34114, 34116, 34117, + 34118, 34119, 34123, 34124, 34125, 34126, 34127, 34128, 34129, 34130, + 34131, 34132, 34133, 34135, 34136, 34138, 34139, 34140, 34141, 34143, + 34144, 34145, 34146, 34147, 34149, 34150, 34151, 34153, 34154, 34155, + 34156, 34157, 34158, 34159, 34160, 34161, 34163, 34165, 34166, 34167, + 34168, 34172, 34173, 34175, 34176, 34177, 30465, 30427, 21097, 32988, + 22307, 24072, 22833, 29422, 26045, 28287, 35799, 23608, 34417, 21313, + 30707, 25342, 26102, 20160, 39135, 34432, 23454, 35782, 21490, 30690, + 20351, 23630, 39542, 22987, 24335, 31034, 22763, 19990, 26623, 20107, + 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, 20365, + 37322, 39280, 27663, 24066, 24643, 23460, 35270, 35797, 25910, 25163, + 39318, 23432, 23551, 25480, 21806, 21463, 30246, 20861, 34092, 26530, + 26803, 27530, 25234, 36755, 21460, 33298, 28113, 30095, 20070, 36174, + 23408, 29087, 34223, 26257, 26329, 32626, 34560, 40653, 40736, 23646, + 26415, 36848, 26641, 26463, 25101, 31446, 22661, 24246, 25968, 28465, + 34178, 34179, 34182, 34184, 34185, 34186, 34187, 34188, 34189, 34190, + 34192, 34193, 34194, 34195, 34196, 34197, 34198, 34199, 34200, 34201, + 34202, 34205, 34206, 34207, 34208, 34209, 34210, 34211, 34213, 34214, + 34215, 34217, 34219, 34220, 34221, 34225, 34226, 34227, 34228, 34229, + 34230, 34232, 34234, 34235, 34236, 34237, 34238, 34239, 34240, 34242, + 34243, 34244, 34245, 34246, 34247, 34248, 34250, 34251, 34252, 34253, + 34254, 34257, 34258, 34260, 34262, 34263, 34264, 34265, 34266, 34267, + 34269, 34270, 34271, 34272, 34273, 34274, 34275, 34277, 34278, 34279, + 34280, 34282, 34283, 34284, 34285, 34286, 34287, 34288, 34289, 34290, + 34291, 34292, 34293, 34294, 34295, 34296, 24661, 21047, 32781, 25684, + 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, 27700, + 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, 26388, 28865, + 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, 32902, 23546, + 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, 24578, 39042, + 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, 33487, 37221, + 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, 35785, 32899, + 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, 30862, 23681, + 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, 26797, 21766, + 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, 22905, 22612, + 34297, 34298, 34300, 34301, 34302, 34304, 34305, 34306, 34307, 34308, + 34310, 34311, 34312, 34313, 34314, 34315, 34316, 34317, 34318, 34319, + 34320, 34322, 34323, 34324, 34325, 34327, 34328, 34329, 34330, 34331, + 34332, 34333, 34334, 34335, 34336, 34337, 34338, 34339, 34340, 34341, + 34342, 34344, 34346, 34347, 34348, 34349, 34350, 34351, 34352, 34353, + 34354, 34355, 34356, 34357, 34358, 34359, 34361, 34362, 34363, 34365, + 34366, 34367, 34368, 34369, 34370, 34371, 34372, 34373, 34374, 34375, + 34376, 34377, 34378, 34379, 34380, 34386, 34387, 34389, 34390, 34391, + 34392, 34393, 34395, 34396, 34397, 34399, 34400, 34401, 34403, 34404, + 34405, 34406, 34407, 34408, 34409, 34410, 29549, 25374, 36427, 36367, + 32974, 33492, 25260, 21488, 27888, 37214, 22826, 24577, 27760, 22349, + 25674, 36138, 30251, 28393, 22363, 27264, 30192, 28525, 35885, 35848, + 22374, 27631, 34962, 30899, 25506, 21497, 28845, 27748, 22616, 25642, + 22530, 26848, 33179, 21776, 31958, 20504, 36538, 28108, 36255, 28907, + 25487, 28059, 28372, 32486, 33796, 26691, 36867, 28120, 38518, 35752, + 22871, 29305, 34276, 33150, 30140, 35466, 26799, 21076, 36386, 38161, + 25552, 39064, 36420, 21884, 20307, 26367, 22159, 24789, 28053, 21059, + 23625, 22825, 28155, 22635, 30000, 29980, 24684, 33300, 33094, 25361, + 26465, 36834, 30522, 36339, 36148, 38081, 24086, 21381, 21548, 28867, + 34413, 34415, 34416, 34418, 34419, 34420, 34421, 34422, 34423, 34424, + 34435, 34436, 34437, 34438, 34439, 34440, 34441, 34446, 34447, 34448, + 34449, 34450, 34452, 34454, 34455, 34456, 34457, 34458, 34459, 34462, + 34463, 34464, 34465, 34466, 34469, 34470, 34475, 34477, 34478, 34482, + 34483, 34487, 34488, 34489, 34491, 34492, 34493, 34494, 34495, 34497, + 34498, 34499, 34501, 34504, 34508, 34509, 34514, 34515, 34517, 34518, + 34519, 34522, 34524, 34525, 34528, 34529, 34530, 34531, 34533, 34534, + 34535, 34536, 34538, 34539, 34540, 34543, 34549, 34550, 34551, 34554, + 34555, 34556, 34557, 34559, 34561, 34564, 34565, 34566, 34571, 34572, + 34574, 34575, 34576, 34577, 34580, 34582, 27712, 24311, 20572, 20141, + 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, 24420, + 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, 36879, + 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, 22303, 21520, + 20820, 28237, 22242, 25512, 39059, 33151, 34581, 35114, 36864, 21534, + 23663, 33216, 25302, 25176, 33073, 40501, 38464, 39534, 39548, 26925, + 22949, 25299, 21822, 25366, 21703, 34521, 27964, 23043, 29926, 34972, + 27498, 22806, 35916, 24367, 28286, 29609, 39037, 20024, 28919, 23436, + 30871, 25405, 26202, 30358, 24779, 23451, 23113, 19975, 33109, 27754, + 29579, 20129, 26505, 32593, 24448, 26106, 26395, 24536, 22916, 23041, + 34585, 34587, 34589, 34591, 34592, 34596, 34598, 34599, 34600, 34602, + 34603, 34604, 34605, 34607, 34608, 34610, 34611, 34613, 34614, 34616, + 34617, 34618, 34620, 34621, 34624, 34625, 34626, 34627, 34628, 34629, + 34630, 34634, 34635, 34637, 34639, 34640, 34641, 34642, 34644, 34645, + 34646, 34648, 34650, 34651, 34652, 34653, 34654, 34655, 34657, 34658, + 34662, 34663, 34664, 34665, 34666, 34667, 34668, 34669, 34671, 34673, + 34674, 34675, 34677, 34679, 34680, 34681, 34682, 34687, 34688, 34689, + 34692, 34694, 34695, 34697, 34698, 34700, 34702, 34703, 34704, 34705, + 34706, 34708, 34709, 34710, 34712, 34713, 34714, 34715, 34716, 34717, + 34718, 34720, 34721, 34722, 34723, 34724, 24013, 24494, 21361, 38886, + 36829, 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, + 22996, 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, + 21890, 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, + 34442, 25991, 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, + 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, + 24043, 21596, 38056, 20044, 27745, 35820, 23627, 26080, 33436, 26791, + 21566, 21556, 27595, 27494, 20116, 25410, 21320, 33310, 20237, 20398, + 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, 35823, 26132, + 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, 38177, 29306, + 34725, 34726, 34727, 34729, 34730, 34734, 34736, 34737, 34738, 34740, + 34742, 34743, 34744, 34745, 34747, 34748, 34750, 34751, 34753, 34754, + 34755, 34756, 34757, 34759, 34760, 34761, 34764, 34765, 34766, 34767, + 34768, 34772, 34773, 34774, 34775, 34776, 34777, 34778, 34780, 34781, + 34782, 34783, 34785, 34786, 34787, 34788, 34790, 34791, 34792, 34793, + 34795, 34796, 34797, 34799, 34800, 34801, 34802, 34803, 34804, 34805, + 34806, 34807, 34808, 34810, 34811, 34812, 34813, 34815, 34816, 34817, + 34818, 34820, 34821, 34822, 34823, 34824, 34825, 34827, 34828, 34829, + 34830, 34831, 34832, 34833, 34834, 34836, 34839, 34840, 34841, 34842, + 34844, 34845, 34846, 34847, 34848, 34851, 31232, 24687, 24076, 24713, + 33181, 22805, 24796, 29060, 28911, 28330, 27728, 29312, 27268, 34989, + 24109, 20064, 23219, 21916, 38115, 27927, 31995, 38553, 25103, 32454, + 30606, 34430, 21283, 38686, 36758, 26247, 23777, 20384, 29421, 19979, + 21414, 22799, 21523, 25472, 38184, 20808, 20185, 40092, 32420, 21688, + 36132, 34900, 33335, 38386, 28046, 24358, 23244, 26174, 38505, 29616, + 29486, 21439, 33146, 39301, 32673, 23466, 38519, 38480, 32447, 30456, + 21410, 38262, 39321, 31665, 35140, 28248, 20065, 32724, 31077, 35814, + 24819, 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, + 30813, 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, + 34852, 34853, 34854, 34855, 34856, 34857, 34858, 34859, 34860, 34861, + 34862, 34863, 34864, 34865, 34867, 34868, 34869, 34870, 34871, 34872, + 34874, 34875, 34877, 34878, 34879, 34881, 34882, 34883, 34886, 34887, + 34888, 34889, 34890, 34891, 34894, 34895, 34896, 34897, 34898, 34899, + 34901, 34902, 34904, 34906, 34907, 34908, 34909, 34910, 34911, 34912, + 34918, 34919, 34922, 34925, 34927, 34929, 34931, 34932, 34933, 34934, + 34936, 34937, 34938, 34939, 34940, 34944, 34947, 34950, 34951, 34953, + 34954, 34956, 34958, 34959, 34960, 34961, 34963, 34964, 34965, 34967, + 34968, 34969, 34970, 34971, 34973, 34974, 34975, 34976, 34977, 34979, + 34981, 34982, 34983, 34984, 34985, 34986, 23567, 23389, 26657, 32918, + 21880, 31505, 25928, 26964, 20123, 27463, 34638, 38795, 21327, 25375, + 25658, 37034, 26012, 32961, 35856, 20889, 26800, 21368, 34809, 25032, + 27844, 27899, 35874, 23633, 34218, 33455, 38156, 27427, 36763, 26032, + 24571, 24515, 20449, 34885, 26143, 33125, 29481, 24826, 20852, 21009, + 22411, 24418, 37026, 34892, 37266, 24184, 26447, 24615, 22995, 20804, + 20982, 33016, 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, + 21957, 38152, 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, + 39035, 24464, 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, + 32110, 23167, 32490, 32493, 36713, 21927, 23459, 24748, 26059, 29572, + 34988, 34990, 34991, 34992, 34994, 34995, 34996, 34997, 34998, 35000, + 35001, 35002, 35003, 35005, 35006, 35007, 35008, 35011, 35012, 35015, + 35016, 35018, 35019, 35020, 35021, 35023, 35024, 35025, 35027, 35030, + 35031, 35034, 35035, 35036, 35037, 35038, 35040, 35041, 35046, 35047, + 35049, 35050, 35051, 35052, 35053, 35054, 35055, 35058, 35061, 35062, + 35063, 35066, 35067, 35069, 35071, 35072, 35073, 35075, 35076, 35077, + 35078, 35079, 35080, 35081, 35083, 35084, 35085, 35086, 35087, 35089, + 35092, 35093, 35094, 35095, 35096, 35100, 35101, 35102, 35103, 35104, + 35106, 35107, 35108, 35110, 35111, 35112, 35113, 35116, 35117, 35118, + 35119, 35121, 35122, 35123, 35125, 35127, 36873, 30307, 30505, 32474, + 38772, 34203, 23398, 31348, 38634, 34880, 21195, 29071, 24490, 26092, + 35810, 23547, 39535, 24033, 27529, 27739, 35757, 35759, 36874, 36805, + 21387, 25276, 40486, 40493, 21568, 20011, 33469, 29273, 34460, 23830, + 34905, 28079, 38597, 21713, 20122, 35766, 28937, 21693, 38409, 28895, + 28153, 30416, 20005, 30740, 34578, 23721, 24310, 35328, 39068, 38414, + 28814, 27839, 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, + 21388, 30746, 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, + 22830, 40495, 31207, 26472, 25196, 20335, 30113, 32650, 27915, 38451, + 27687, 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, + 35128, 35129, 35130, 35131, 35132, 35133, 35134, 35135, 35136, 35138, + 35139, 35141, 35142, 35143, 35144, 35145, 35146, 35147, 35148, 35149, + 35150, 35151, 35152, 35153, 35154, 35155, 35156, 35157, 35158, 35159, + 35160, 35161, 35162, 35163, 35164, 35165, 35168, 35169, 35170, 35171, + 35172, 35173, 35175, 35176, 35177, 35178, 35179, 35180, 35181, 35182, + 35183, 35184, 35185, 35186, 35187, 35188, 35189, 35190, 35191, 35192, + 35193, 35194, 35196, 35197, 35198, 35200, 35202, 35204, 35205, 35207, + 35208, 35209, 35210, 35211, 35212, 35213, 35214, 35215, 35216, 35217, + 35218, 35219, 35220, 35221, 35222, 35223, 35224, 35225, 35226, 35227, + 35228, 35229, 35230, 35231, 35232, 35233, 25671, 23591, 36965, 31377, + 35875, 23002, 21676, 33280, 33647, 35201, 32768, 26928, 22094, 32822, + 29239, 37326, 20918, 20063, 39029, 25494, 19994, 21494, 26355, 33099, + 22812, 28082, 19968, 22777, 21307, 25558, 38129, 20381, 20234, 34915, + 39056, 22839, 36951, 31227, 20202, 33008, 30097, 27778, 23452, 23016, + 24413, 26885, 34433, 20506, 24050, 20057, 30691, 20197, 33402, 25233, + 26131, 37009, 23673, 20159, 24441, 33222, 36920, 32900, 30123, 20134, + 35028, 24847, 27589, 24518, 20041, 30410, 28322, 35811, 35758, 35850, + 35793, 24322, 32764, 32716, 32462, 33589, 33643, 22240, 27575, 38899, + 38452, 23035, 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, + 35234, 35235, 35236, 35237, 35238, 35239, 35240, 35241, 35242, 35243, + 35244, 35245, 35246, 35247, 35248, 35249, 35250, 35251, 35252, 35253, + 35254, 35255, 35256, 35257, 35258, 35259, 35260, 35261, 35262, 35263, + 35264, 35267, 35277, 35283, 35284, 35285, 35287, 35288, 35289, 35291, + 35293, 35295, 35296, 35297, 35298, 35300, 35303, 35304, 35305, 35306, + 35308, 35309, 35310, 35312, 35313, 35314, 35316, 35317, 35318, 35319, + 35320, 35321, 35322, 35323, 35324, 35325, 35326, 35327, 35329, 35330, + 35331, 35332, 35333, 35334, 35336, 35337, 35338, 35339, 35340, 35341, + 35342, 35343, 35344, 35345, 35346, 35347, 35348, 35349, 35350, 35351, + 35352, 35353, 35354, 35355, 35356, 35357, 21360, 33521, 27185, 23156, + 40560, 24212, 32552, 33721, 33828, 33829, 33639, 34631, 36814, 36194, + 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, 33219, 30152, + 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, 24703, 21191, + 29992, 24189, 20248, 24736, 24551, 23588, 30001, 37038, 38080, 29369, + 27833, 28216, 37193, 26377, 21451, 21491, 20305, 37321, 35825, 21448, + 24188, 36802, 28132, 20110, 30402, 27014, 34398, 24858, 33286, 20313, + 20446, 36926, 40060, 24841, 28189, 28180, 38533, 20104, 23089, 38632, + 19982, 23679, 31161, 23431, 35821, 32701, 29577, 22495, 33419, 37057, + 21505, 36935, 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, + 35358, 35359, 35360, 35361, 35362, 35363, 35364, 35365, 35366, 35367, + 35368, 35369, 35370, 35371, 35372, 35373, 35374, 35375, 35376, 35377, + 35378, 35379, 35380, 35381, 35382, 35383, 35384, 35385, 35386, 35387, + 35388, 35389, 35391, 35392, 35393, 35394, 35395, 35396, 35397, 35398, + 35399, 35401, 35402, 35403, 35404, 35405, 35406, 35407, 35408, 35409, + 35410, 35411, 35412, 35413, 35414, 35415, 35416, 35417, 35418, 35419, + 35420, 35421, 35422, 35423, 35424, 35425, 35426, 35427, 35428, 35429, + 35430, 35431, 35432, 35433, 35434, 35435, 35436, 35437, 35438, 35439, + 35440, 35441, 35442, 35443, 35444, 35445, 35446, 35447, 35448, 35450, + 35451, 35452, 35453, 35454, 35455, 35456, 28020, 23507, 35029, 39044, + 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, 21407, 25588, + 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, 33489, 24895, + 24616, 38498, 26352, 32422, 36234, 36291, 38053, 23731, 31908, 26376, + 24742, 38405, 32792, 20113, 37095, 21248, 38504, 20801, 36816, 34164, + 37213, 26197, 38901, 23381, 21277, 30776, 26434, 26685, 21705, 28798, + 23472, 36733, 20877, 22312, 21681, 25874, 26242, 36190, 36163, 33039, + 33900, 36973, 31967, 20991, 34299, 26531, 26089, 28577, 34468, 36481, + 22122, 36896, 30338, 28790, 29157, 36131, 25321, 21017, 27901, 36156, + 24590, 22686, 24974, 26366, 36192, 25166, 21939, 28195, 26413, 36711, + 35457, 35458, 35459, 35460, 35461, 35462, 35463, 35464, 35467, 35468, + 35469, 35470, 35471, 35472, 35473, 35474, 35476, 35477, 35478, 35479, + 35480, 35481, 35482, 35483, 35484, 35485, 35486, 35487, 35488, 35489, + 35490, 35491, 35492, 35493, 35494, 35495, 35496, 35497, 35498, 35499, + 35500, 35501, 35502, 35503, 35504, 35505, 35506, 35507, 35508, 35509, + 35510, 35511, 35512, 35513, 35514, 35515, 35516, 35517, 35518, 35519, + 35520, 35521, 35522, 35523, 35524, 35525, 35526, 35527, 35528, 35529, + 35530, 35531, 35532, 35533, 35534, 35535, 35536, 35537, 35538, 35539, + 35540, 35541, 35542, 35543, 35544, 35545, 35546, 35547, 35548, 35549, + 35550, 35551, 35552, 35553, 35554, 35555, 38113, 38392, 30504, 26629, + 27048, 21643, 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, + 23528, 30651, 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, + 23637, 34360, 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, + 24432, 28467, 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, + 32960, 30260, 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, + 20806, 32903, 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, + 34071, 36825, 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, + 38024, 20390, 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, + 25379, 30529, 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, + 35556, 35557, 35558, 35559, 35560, 35561, 35562, 35563, 35564, 35565, + 35566, 35567, 35568, 35569, 35570, 35571, 35572, 35573, 35574, 35575, + 35576, 35577, 35578, 35579, 35580, 35581, 35582, 35583, 35584, 35585, + 35586, 35587, 35588, 35589, 35590, 35592, 35593, 35594, 35595, 35596, + 35597, 35598, 35599, 35600, 35601, 35602, 35603, 35604, 35605, 35606, + 35607, 35608, 35609, 35610, 35611, 35612, 35613, 35614, 35615, 35616, + 35617, 35618, 35619, 35620, 35621, 35623, 35624, 35625, 35626, 35627, + 35628, 35629, 35630, 35631, 35632, 35633, 35634, 35635, 35636, 35637, + 35638, 35639, 35640, 35641, 35642, 35643, 35644, 35645, 35646, 35647, + 35648, 35649, 35650, 35651, 35652, 35653, 24103, 30151, 37073, 35777, + 33437, 26525, 25903, 21553, 34584, 30693, 32930, 33026, 27713, 20043, + 32455, 32844, 30452, 26893, 27542, 25191, 20540, 20356, 22336, 25351, + 27490, 36286, 21482, 26088, 32440, 24535, 25370, 25527, 33267, 33268, + 32622, 24092, 23769, 21046, 26234, 31209, 31258, 36136, 28825, 30164, + 28382, 27835, 31378, 20013, 30405, 24544, 38047, 34935, 32456, 31181, + 32959, 37325, 20210, 20247, 33311, 21608, 24030, 27954, 35788, 31909, + 36724, 32920, 24090, 21650, 30385, 23449, 26172, 39588, 29664, 26666, + 34523, 26417, 29482, 35832, 35803, 36880, 31481, 28891, 29038, 25284, + 30633, 22065, 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, + 35654, 35655, 35656, 35657, 35658, 35659, 35660, 35661, 35662, 35663, + 35664, 35665, 35666, 35667, 35668, 35669, 35670, 35671, 35672, 35673, + 35674, 35675, 35676, 35677, 35678, 35679, 35680, 35681, 35682, 35683, + 35684, 35685, 35687, 35688, 35689, 35690, 35691, 35693, 35694, 35695, + 35696, 35697, 35698, 35699, 35700, 35701, 35702, 35703, 35704, 35705, + 35706, 35707, 35708, 35709, 35710, 35711, 35712, 35713, 35714, 35715, + 35716, 35717, 35718, 35719, 35720, 35721, 35722, 35723, 35724, 35725, + 35726, 35727, 35728, 35729, 35730, 35731, 35732, 35733, 35734, 35735, + 35736, 35737, 35738, 35739, 35740, 35741, 35742, 35743, 35756, 35761, + 35771, 35783, 35792, 35818, 35849, 35870, 20303, 27880, 31069, 39547, + 25235, 29226, 25341, 19987, 30742, 36716, 25776, 36186, 31686, 26729, + 24196, 35013, 22918, 25758, 22766, 29366, 26894, 38181, 36861, 36184, + 22368, 32512, 35846, 20934, 25417, 25305, 21331, 26700, 29730, 33537, + 37196, 21828, 30528, 28796, 27978, 20857, 21672, 36164, 23039, 28363, + 28100, 23388, 32043, 20180, 31869, 28371, 23376, 33258, 28173, 23383, + 39683, 26837, 36394, 23447, 32508, 24635, 32437, 37049, 36208, 22863, + 25549, 31199, 36275, 21330, 26063, 31062, 35781, 38459, 32452, 38075, + 32386, 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, + 26590, 20570, 20316, 22352, 24231, 59408, 59409, 59410, 59411, 59412, + 35896, 35897, 35898, 35899, 35900, 35901, 35902, 35903, 35904, 35906, + 35907, 35908, 35909, 35912, 35914, 35915, 35917, 35918, 35919, 35920, + 35921, 35922, 35923, 35924, 35926, 35927, 35928, 35929, 35931, 35932, + 35933, 35934, 35935, 35936, 35939, 35940, 35941, 35942, 35943, 35944, + 35945, 35948, 35949, 35950, 35951, 35952, 35953, 35954, 35956, 35957, + 35958, 35959, 35963, 35964, 35965, 35966, 35967, 35968, 35969, 35971, + 35972, 35974, 35975, 35976, 35979, 35981, 35982, 35983, 35984, 35985, + 35986, 35987, 35989, 35990, 35991, 35993, 35994, 35995, 35996, 35997, + 35998, 35999, 36000, 36001, 36002, 36003, 36004, 36005, 36006, 36007, + 36008, 36009, 36010, 36011, 36012, 36013, 20109, 19980, 20800, 19984, + 24319, 21317, 19989, 20120, 19998, 39730, 23404, 22121, 20008, 31162, + 20031, 21269, 20039, 22829, 29243, 21358, 27664, 22239, 32996, 39319, + 27603, 30590, 40727, 20022, 20127, 40720, 20060, 20073, 20115, 33416, + 23387, 21868, 22031, 20164, 21389, 21405, 21411, 21413, 21422, 38757, + 36189, 21274, 21493, 21286, 21294, 21310, 36188, 21350, 21347, 20994, + 21000, 21006, 21037, 21043, 21055, 21056, 21068, 21086, 21089, 21084, + 33967, 21117, 21122, 21121, 21136, 21139, 20866, 32596, 20155, 20163, + 20169, 20162, 20200, 20193, 20203, 20190, 20251, 20211, 20258, 20324, + 20213, 20261, 20263, 20233, 20267, 20318, 20327, 25912, 20314, 20317, + 36014, 36015, 36016, 36017, 36018, 36019, 36020, 36021, 36022, 36023, + 36024, 36025, 36026, 36027, 36028, 36029, 36030, 36031, 36032, 36033, + 36034, 36035, 36036, 36037, 36038, 36039, 36040, 36041, 36042, 36043, + 36044, 36045, 36046, 36047, 36048, 36049, 36050, 36051, 36052, 36053, + 36054, 36055, 36056, 36057, 36058, 36059, 36060, 36061, 36062, 36063, + 36064, 36065, 36066, 36067, 36068, 36069, 36070, 36071, 36072, 36073, + 36074, 36075, 36076, 36077, 36078, 36079, 36080, 36081, 36082, 36083, + 36084, 36085, 36086, 36087, 36088, 36089, 36090, 36091, 36092, 36093, + 36094, 36095, 36096, 36097, 36098, 36099, 36100, 36101, 36102, 36103, + 36104, 36105, 36106, 36107, 36108, 36109, 20319, 20311, 20274, 20285, + 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, 20348, + 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, 20433, + 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, 20478, + 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, 20588, + 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, 20710, + 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, 40864, 27718, + 31860, 20846, 24061, 40649, 39320, 20865, 22804, 21241, 21261, 35335, + 21264, 20971, 22809, 20821, 20128, 20822, 20147, 34926, 34980, 20149, + 33044, 35026, 31104, 23348, 34819, 32696, 20907, 20913, 20925, 20924, + 36110, 36111, 36112, 36113, 36114, 36115, 36116, 36117, 36118, 36119, + 36120, 36121, 36122, 36123, 36124, 36128, 36177, 36178, 36183, 36191, + 36197, 36200, 36201, 36202, 36204, 36206, 36207, 36209, 36210, 36216, + 36217, 36218, 36219, 36220, 36221, 36222, 36223, 36224, 36226, 36227, + 36230, 36231, 36232, 36233, 36236, 36237, 36238, 36239, 36240, 36242, + 36243, 36245, 36246, 36247, 36248, 36249, 36250, 36251, 36252, 36253, + 36254, 36256, 36257, 36258, 36260, 36261, 36262, 36263, 36264, 36265, + 36266, 36267, 36268, 36269, 36270, 36271, 36272, 36274, 36278, 36279, + 36281, 36283, 36285, 36288, 36289, 36290, 36293, 36295, 36296, 36297, + 36298, 36301, 36304, 36306, 36307, 36308, 20935, 20886, 20898, 20901, + 35744, 35750, 35751, 35754, 35764, 35765, 35767, 35778, 35779, 35787, + 35791, 35790, 35794, 35795, 35796, 35798, 35800, 35801, 35804, 35807, + 35808, 35812, 35816, 35817, 35822, 35824, 35827, 35830, 35833, 35836, + 35839, 35840, 35842, 35844, 35847, 35852, 35855, 35857, 35858, 35860, + 35861, 35862, 35865, 35867, 35864, 35869, 35871, 35872, 35873, 35877, + 35879, 35882, 35883, 35886, 35887, 35890, 35891, 35893, 35894, 21353, + 21370, 38429, 38434, 38433, 38449, 38442, 38461, 38460, 38466, 38473, + 38484, 38495, 38503, 38508, 38514, 38516, 38536, 38541, 38551, 38576, + 37015, 37019, 37021, 37017, 37036, 37025, 37044, 37043, 37046, 37050, + 36309, 36312, 36313, 36316, 36320, 36321, 36322, 36325, 36326, 36327, + 36329, 36333, 36334, 36336, 36337, 36338, 36340, 36342, 36348, 36350, + 36351, 36352, 36353, 36354, 36355, 36356, 36358, 36359, 36360, 36363, + 36365, 36366, 36368, 36369, 36370, 36371, 36373, 36374, 36375, 36376, + 36377, 36378, 36379, 36380, 36384, 36385, 36388, 36389, 36390, 36391, + 36392, 36395, 36397, 36400, 36402, 36403, 36404, 36406, 36407, 36408, + 36411, 36412, 36414, 36415, 36419, 36421, 36422, 36428, 36429, 36430, + 36431, 36432, 36435, 36436, 36437, 36438, 36439, 36440, 36442, 36443, + 36444, 36445, 36446, 36447, 36448, 36449, 36450, 36451, 36452, 36453, + 36455, 36456, 36458, 36459, 36462, 36465, 37048, 37040, 37071, 37061, + 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, 37083, + 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, 37177, + 37187, 37190, 21005, 22850, 21154, 21164, 21165, 21182, 21759, 21200, + 21206, 21232, 21471, 29166, 30669, 24308, 20981, 20988, 39727, 21430, + 24321, 30042, 24047, 22348, 22441, 22433, 22654, 22716, 22725, 22737, + 22313, 22316, 22314, 22323, 22329, 22318, 22319, 22364, 22331, 22338, + 22377, 22405, 22379, 22406, 22396, 22395, 22376, 22381, 22390, 22387, + 22445, 22436, 22412, 22450, 22479, 22439, 22452, 22419, 22432, 22485, + 22488, 22490, 22489, 22482, 22456, 22516, 22511, 22520, 22500, 22493, + 36467, 36469, 36471, 36472, 36473, 36474, 36475, 36477, 36478, 36480, + 36482, 36483, 36484, 36486, 36488, 36489, 36490, 36491, 36492, 36493, + 36494, 36497, 36498, 36499, 36501, 36502, 36503, 36504, 36505, 36506, + 36507, 36509, 36511, 36512, 36513, 36514, 36515, 36516, 36517, 36518, + 36519, 36520, 36521, 36522, 36525, 36526, 36528, 36529, 36531, 36532, + 36533, 36534, 36535, 36536, 36537, 36539, 36540, 36541, 36542, 36543, + 36544, 36545, 36546, 36547, 36548, 36549, 36550, 36551, 36552, 36553, + 36554, 36555, 36556, 36557, 36559, 36560, 36561, 36562, 36563, 36564, + 36565, 36566, 36567, 36568, 36569, 36570, 36571, 36572, 36573, 36574, + 36575, 36576, 36577, 36578, 36579, 36580, 22539, 22541, 22525, 22509, + 22528, 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, + 22656, 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, + 33412, 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, + 33482, 33507, 33432, 33463, 33454, 33483, 33484, 33473, 33449, 33460, + 33441, 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, + 33551, 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, + 33562, 33542, 33556, 33557, 33504, 33493, 33564, 33617, 33627, 33628, + 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, + 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, + 36581, 36582, 36583, 36584, 36585, 36586, 36587, 36588, 36589, 36590, + 36591, 36592, 36593, 36594, 36595, 36596, 36597, 36598, 36599, 36600, + 36601, 36602, 36603, 36604, 36605, 36606, 36607, 36608, 36609, 36610, + 36611, 36612, 36613, 36614, 36615, 36616, 36617, 36618, 36619, 36620, + 36621, 36622, 36623, 36624, 36625, 36626, 36627, 36628, 36629, 36630, + 36631, 36632, 36633, 36634, 36635, 36636, 36637, 36638, 36639, 36640, + 36641, 36642, 36643, 36644, 36645, 36646, 36647, 36648, 36649, 36650, + 36651, 36652, 36653, 36654, 36655, 36656, 36657, 36658, 36659, 36660, + 36661, 36662, 36663, 36664, 36665, 36666, 36667, 36668, 36669, 36670, + 36671, 36672, 36673, 36674, 36675, 36676, 33640, 33563, 33641, 33644, + 33642, 33645, 33646, 33712, 33656, 33715, 33716, 33696, 33706, 33683, + 33692, 33669, 33660, 33718, 33705, 33661, 33720, 33659, 33688, 33694, + 33704, 33722, 33724, 33729, 33793, 33765, 33752, 22535, 33816, 33803, + 33757, 33789, 33750, 33820, 33848, 33809, 33798, 33748, 33759, 33807, + 33795, 33784, 33785, 33770, 33733, 33728, 33830, 33776, 33761, 33884, + 33873, 33882, 33881, 33907, 33927, 33928, 33914, 33929, 33912, 33852, + 33862, 33897, 33910, 33932, 33934, 33841, 33901, 33985, 33997, 34000, + 34022, 33981, 34003, 33994, 33983, 33978, 34016, 33953, 33977, 33972, + 33943, 34021, 34019, 34060, 29965, 34104, 34032, 34105, 34079, 34106, + 36677, 36678, 36679, 36680, 36681, 36682, 36683, 36684, 36685, 36686, + 36687, 36688, 36689, 36690, 36691, 36692, 36693, 36694, 36695, 36696, + 36697, 36698, 36699, 36700, 36701, 36702, 36703, 36704, 36705, 36706, + 36707, 36708, 36709, 36714, 36736, 36748, 36754, 36765, 36768, 36769, + 36770, 36772, 36773, 36774, 36775, 36778, 36780, 36781, 36782, 36783, + 36786, 36787, 36788, 36789, 36791, 36792, 36794, 36795, 36796, 36799, + 36800, 36803, 36806, 36809, 36810, 36811, 36812, 36813, 36815, 36818, + 36822, 36823, 36826, 36832, 36833, 36835, 36839, 36844, 36847, 36849, + 36850, 36852, 36853, 36854, 36858, 36859, 36860, 36862, 36863, 36871, + 36872, 36876, 36878, 36883, 36885, 36888, 34134, 34107, 34047, 34044, + 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, + 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, + 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, + 24318, 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, 23586, + 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, 25306, 25303, + 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, 25457, 25466, + 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, 25586, 25592, + 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, 25669, 25665, + 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, 25709, 25750, + 36889, 36892, 36899, 36900, 36901, 36903, 36904, 36905, 36906, 36907, + 36908, 36912, 36913, 36914, 36915, 36916, 36919, 36921, 36922, 36925, + 36927, 36928, 36931, 36933, 36934, 36936, 36937, 36938, 36939, 36940, + 36942, 36948, 36949, 36950, 36953, 36954, 36956, 36957, 36958, 36959, + 36960, 36961, 36964, 36966, 36967, 36969, 36970, 36971, 36972, 36975, + 36976, 36977, 36978, 36979, 36982, 36983, 36984, 36985, 36986, 36987, + 36988, 36990, 36993, 36996, 36997, 36998, 36999, 37001, 37002, 37004, + 37005, 37006, 37007, 37008, 37010, 37012, 37014, 37016, 37018, 37020, + 37022, 37023, 37024, 37028, 37029, 37031, 37032, 37033, 37035, 37037, + 37042, 37047, 37052, 37053, 37055, 37056, 25722, 25783, 25784, 25753, + 25786, 25792, 25808, 25815, 25828, 25826, 25865, 25893, 25902, 24331, + 24530, 29977, 24337, 21343, 21489, 21501, 21481, 21480, 21499, 21522, + 21526, 21510, 21579, 21586, 21587, 21588, 21590, 21571, 21537, 21591, + 21593, 21539, 21554, 21634, 21652, 21623, 21617, 21604, 21658, 21659, + 21636, 21622, 21606, 21661, 21712, 21677, 21698, 21684, 21714, 21671, + 21670, 21715, 21716, 21618, 21667, 21717, 21691, 21695, 21708, 21721, + 21722, 21724, 21673, 21674, 21668, 21725, 21711, 21726, 21787, 21735, + 21792, 21757, 21780, 21747, 21794, 21795, 21775, 21777, 21799, 21802, + 21863, 21903, 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, + 37058, 37059, 37062, 37064, 37065, 37067, 37068, 37069, 37074, 37076, + 37077, 37078, 37080, 37081, 37082, 37086, 37087, 37088, 37091, 37092, + 37093, 37097, 37098, 37100, 37102, 37104, 37105, 37106, 37107, 37109, + 37110, 37111, 37113, 37114, 37115, 37116, 37119, 37120, 37121, 37123, + 37125, 37126, 37127, 37128, 37129, 37130, 37131, 37132, 37133, 37134, + 37135, 37136, 37137, 37138, 37139, 37140, 37141, 37142, 37143, 37144, + 37146, 37147, 37148, 37149, 37151, 37152, 37153, 37156, 37157, 37158, + 37159, 37160, 37161, 37162, 37163, 37164, 37165, 37166, 37168, 37170, + 37171, 37172, 37173, 37174, 37175, 37176, 37178, 37179, 37180, 37181, + 37182, 37183, 37184, 37185, 37186, 37188, 21815, 21846, 21877, 21878, + 21879, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, 21896, + 21889, 21919, 21886, 21974, 21905, 21883, 21983, 21949, 21950, 21908, + 21913, 21994, 22007, 21961, 22047, 21969, 21995, 21996, 21972, 21990, + 21981, 21956, 21999, 21989, 22002, 22003, 21964, 21965, 21992, 22005, + 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, 22014, 22016, + 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, 22105, 22108, + 22092, 22100, 22150, 22116, 22129, 22123, 22139, 22140, 22149, 22163, + 22191, 22228, 22231, 22237, 22241, 22261, 22251, 22265, 22271, 22276, + 22282, 22281, 22300, 24079, 24089, 24084, 24081, 24113, 24123, 24124, + 37189, 37191, 37192, 37201, 37203, 37204, 37205, 37206, 37208, 37209, + 37211, 37212, 37215, 37216, 37222, 37223, 37224, 37227, 37229, 37235, + 37242, 37243, 37244, 37248, 37249, 37250, 37251, 37252, 37254, 37256, + 37258, 37262, 37263, 37267, 37268, 37269, 37270, 37271, 37272, 37273, + 37276, 37277, 37278, 37279, 37280, 37281, 37284, 37285, 37286, 37287, + 37288, 37289, 37291, 37292, 37296, 37297, 37298, 37299, 37302, 37303, + 37304, 37305, 37307, 37308, 37309, 37310, 37311, 37312, 37313, 37314, + 37315, 37316, 37317, 37318, 37320, 37323, 37328, 37330, 37331, 37332, + 37333, 37334, 37335, 37336, 37337, 37338, 37339, 37341, 37342, 37343, + 37344, 37345, 37346, 37347, 37348, 37349, 24119, 24132, 24148, 24155, + 24158, 24161, 23692, 23674, 23693, 23696, 23702, 23688, 23704, 23705, + 23697, 23706, 23708, 23733, 23714, 23741, 23724, 23723, 23729, 23715, + 23745, 23735, 23748, 23762, 23780, 23755, 23781, 23810, 23811, 23847, + 23846, 23854, 23844, 23838, 23814, 23835, 23896, 23870, 23860, 23869, + 23916, 23899, 23919, 23901, 23915, 23883, 23882, 23913, 23924, 23938, + 23961, 23965, 35955, 23991, 24005, 24435, 24439, 24450, 24455, 24457, + 24460, 24469, 24473, 24476, 24488, 24493, 24501, 24508, 34914, 24417, + 29357, 29360, 29364, 29367, 29368, 29379, 29377, 29390, 29389, 29394, + 29416, 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, 29434, + 37350, 37351, 37352, 37353, 37354, 37355, 37356, 37357, 37358, 37359, + 37360, 37361, 37362, 37363, 37364, 37365, 37366, 37367, 37368, 37369, + 37370, 37371, 37372, 37373, 37374, 37375, 37376, 37377, 37378, 37379, + 37380, 37381, 37382, 37383, 37384, 37385, 37386, 37387, 37388, 37389, + 37390, 37391, 37392, 37393, 37394, 37395, 37396, 37397, 37398, 37399, + 37400, 37401, 37402, 37403, 37404, 37405, 37406, 37407, 37408, 37409, + 37410, 37411, 37412, 37413, 37414, 37415, 37416, 37417, 37418, 37419, + 37420, 37421, 37422, 37423, 37424, 37425, 37426, 37427, 37428, 37429, + 37430, 37431, 37432, 37433, 37434, 37435, 37436, 37437, 37438, 37439, + 37440, 37441, 37442, 37443, 37444, 37445, 29435, 29463, 29459, 29473, + 29450, 29470, 29469, 29461, 29474, 29497, 29477, 29484, 29496, 29489, + 29520, 29517, 29527, 29536, 29548, 29551, 29566, 33307, 22821, 39143, + 22820, 22786, 39267, 39271, 39272, 39273, 39274, 39275, 39276, 39284, + 39287, 39293, 39296, 39300, 39303, 39306, 39309, 39312, 39313, 39315, + 39316, 39317, 24192, 24209, 24203, 24214, 24229, 24224, 24249, 24245, + 24254, 24243, 36179, 24274, 24273, 24283, 24296, 24298, 33210, 24516, + 24521, 24534, 24527, 24579, 24558, 24580, 24545, 24548, 24574, 24581, + 24582, 24554, 24557, 24568, 24601, 24629, 24614, 24603, 24591, 24589, + 24617, 24619, 24586, 24639, 24609, 24696, 24697, 24699, 24698, 24642, + 37446, 37447, 37448, 37449, 37450, 37451, 37452, 37453, 37454, 37455, + 37456, 37457, 37458, 37459, 37460, 37461, 37462, 37463, 37464, 37465, + 37466, 37467, 37468, 37469, 37470, 37471, 37472, 37473, 37474, 37475, + 37476, 37477, 37478, 37479, 37480, 37481, 37482, 37483, 37484, 37485, + 37486, 37487, 37488, 37489, 37490, 37491, 37493, 37494, 37495, 37496, + 37497, 37498, 37499, 37500, 37501, 37502, 37503, 37504, 37505, 37506, + 37507, 37508, 37509, 37510, 37511, 37512, 37513, 37514, 37515, 37516, + 37517, 37519, 37520, 37521, 37522, 37523, 37524, 37525, 37526, 37527, + 37528, 37529, 37530, 37531, 37532, 37533, 37534, 37535, 37536, 37537, + 37538, 37539, 37540, 37541, 37542, 37543, 24682, 24701, 24726, 24730, + 24749, 24733, 24707, 24722, 24716, 24731, 24812, 24763, 24753, 24797, + 24792, 24774, 24794, 24756, 24864, 24870, 24853, 24867, 24820, 24832, + 24846, 24875, 24906, 24949, 25004, 24980, 24999, 25015, 25044, 25077, + 24541, 38579, 38377, 38379, 38385, 38387, 38389, 38390, 38396, 38398, + 38403, 38404, 38406, 38408, 38410, 38411, 38412, 38413, 38415, 38418, + 38421, 38422, 38423, 38425, 38426, 20012, 29247, 25109, 27701, 27732, + 27740, 27722, 27811, 27781, 27792, 27796, 27788, 27752, 27753, 27764, + 27766, 27782, 27817, 27856, 27860, 27821, 27895, 27896, 27889, 27863, + 27826, 27872, 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, + 37544, 37545, 37546, 37547, 37548, 37549, 37551, 37552, 37553, 37554, + 37555, 37556, 37557, 37558, 37559, 37560, 37561, 37562, 37563, 37564, + 37565, 37566, 37567, 37568, 37569, 37570, 37571, 37572, 37573, 37574, + 37575, 37577, 37578, 37579, 37580, 37581, 37582, 37583, 37584, 37585, + 37586, 37587, 37588, 37589, 37590, 37591, 37592, 37593, 37594, 37595, + 37596, 37597, 37598, 37599, 37600, 37601, 37602, 37603, 37604, 37605, + 37606, 37607, 37608, 37609, 37610, 37611, 37612, 37613, 37614, 37615, + 37616, 37617, 37618, 37619, 37620, 37621, 37622, 37623, 37624, 37625, + 37626, 37627, 37628, 37629, 37630, 37631, 37632, 37633, 37634, 37635, + 37636, 37637, 37638, 37639, 37640, 37641, 27961, 27943, 27916, 27971, + 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, 27957, 27930, + 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, 27998, 28051, + 28052, 27996, 28000, 28028, 28003, 28186, 28103, 28101, 28126, 28174, + 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, 28172, 28078, + 28203, 28270, 28238, 28267, 28338, 28255, 28294, 28243, 28244, 28210, + 28197, 28228, 28383, 28337, 28312, 28384, 28461, 28386, 28325, 28327, + 28349, 28347, 28343, 28375, 28340, 28367, 28303, 28354, 28319, 28514, + 28486, 28487, 28452, 28437, 28409, 28463, 28470, 28491, 28532, 28458, + 28425, 28457, 28553, 28557, 28556, 28536, 28530, 28540, 28538, 28625, + 37642, 37643, 37644, 37645, 37646, 37647, 37648, 37649, 37650, 37651, + 37652, 37653, 37654, 37655, 37656, 37657, 37658, 37659, 37660, 37661, + 37662, 37663, 37664, 37665, 37666, 37667, 37668, 37669, 37670, 37671, + 37672, 37673, 37674, 37675, 37676, 37677, 37678, 37679, 37680, 37681, + 37682, 37683, 37684, 37685, 37686, 37687, 37688, 37689, 37690, 37691, + 37692, 37693, 37695, 37696, 37697, 37698, 37699, 37700, 37701, 37702, + 37703, 37704, 37705, 37706, 37707, 37708, 37709, 37710, 37711, 37712, + 37713, 37714, 37715, 37716, 37717, 37718, 37719, 37720, 37721, 37722, + 37723, 37724, 37725, 37726, 37727, 37728, 37729, 37730, 37731, 37732, + 37733, 37734, 37735, 37736, 37737, 37739, 28617, 28583, 28601, 28598, + 28610, 28641, 28654, 28638, 28640, 28655, 28698, 28707, 28699, 28729, + 28725, 28751, 28766, 23424, 23428, 23445, 23443, 23461, 23480, 29999, + 39582, 25652, 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, + 36821, 36837, 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, + 36875, 36902, 36881, 36877, 36886, 36897, 36917, 36918, 36909, 36911, + 36932, 36945, 36946, 36944, 36968, 36952, 36962, 36955, 26297, 36980, + 36989, 36994, 37000, 36995, 37003, 24400, 24407, 24406, 24408, 23611, + 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, + 33396, 24380, 39739, 23662, 22913, 22915, 22925, 22953, 22954, 22947, + 37740, 37741, 37742, 37743, 37744, 37745, 37746, 37747, 37748, 37749, + 37750, 37751, 37752, 37753, 37754, 37755, 37756, 37757, 37758, 37759, + 37760, 37761, 37762, 37763, 37764, 37765, 37766, 37767, 37768, 37769, + 37770, 37771, 37772, 37773, 37774, 37776, 37777, 37778, 37779, 37780, + 37781, 37782, 37783, 37784, 37785, 37786, 37787, 37788, 37789, 37790, + 37791, 37792, 37793, 37794, 37795, 37796, 37797, 37798, 37799, 37800, + 37801, 37802, 37803, 37804, 37805, 37806, 37807, 37808, 37809, 37810, + 37811, 37812, 37813, 37814, 37815, 37816, 37817, 37818, 37819, 37820, + 37821, 37822, 37823, 37824, 37825, 37826, 37827, 37828, 37829, 37830, + 37831, 37832, 37833, 37835, 37836, 37837, 22935, 22986, 22955, 22942, + 22948, 22994, 22962, 22959, 22999, 22974, 23045, 23046, 23005, 23048, + 23011, 23000, 23033, 23052, 23049, 23090, 23092, 23057, 23075, 23059, + 23104, 23143, 23114, 23125, 23100, 23138, 23157, 33004, 23210, 23195, + 23159, 23162, 23230, 23275, 23218, 23250, 23252, 23224, 23264, 23267, + 23281, 23254, 23270, 23256, 23260, 23305, 23319, 23318, 23346, 23351, + 23360, 23573, 23580, 23386, 23397, 23411, 23377, 23379, 23394, 39541, + 39543, 39544, 39546, 39551, 39549, 39552, 39553, 39557, 39560, 39562, + 39568, 39570, 39571, 39574, 39576, 39579, 39580, 39581, 39583, 39584, + 39586, 39587, 39589, 39591, 32415, 32417, 32419, 32421, 32424, 32425, + 37838, 37839, 37840, 37841, 37842, 37843, 37844, 37845, 37847, 37848, + 37849, 37850, 37851, 37852, 37853, 37854, 37855, 37856, 37857, 37858, + 37859, 37860, 37861, 37862, 37863, 37864, 37865, 37866, 37867, 37868, + 37869, 37870, 37871, 37872, 37873, 37874, 37875, 37876, 37877, 37878, + 37879, 37880, 37881, 37882, 37883, 37884, 37885, 37886, 37887, 37888, + 37889, 37890, 37891, 37892, 37893, 37894, 37895, 37896, 37897, 37898, + 37899, 37900, 37901, 37902, 37903, 37904, 37905, 37906, 37907, 37908, + 37909, 37910, 37911, 37912, 37913, 37914, 37915, 37916, 37917, 37918, + 37919, 37920, 37921, 37922, 37923, 37924, 37925, 37926, 37927, 37928, + 37929, 37930, 37931, 37932, 37933, 37934, 32429, 32432, 32446, 32448, + 32449, 32450, 32457, 32459, 32460, 32464, 32468, 32471, 32475, 32480, + 32481, 32488, 32491, 32494, 32495, 32497, 32498, 32525, 32502, 32506, + 32507, 32510, 32513, 32514, 32515, 32519, 32520, 32523, 32524, 32527, + 32529, 32530, 32535, 32537, 32540, 32539, 32543, 32545, 32546, 32547, + 32548, 32549, 32550, 32551, 32554, 32555, 32556, 32557, 32559, 32560, + 32561, 32562, 32563, 32565, 24186, 30079, 24027, 30014, 37013, 29582, + 29585, 29614, 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, + 29641, 29640, 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, + 29682, 29711, 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, + 37935, 37936, 37937, 37938, 37939, 37940, 37941, 37942, 37943, 37944, + 37945, 37946, 37947, 37948, 37949, 37951, 37952, 37953, 37954, 37955, + 37956, 37957, 37958, 37959, 37960, 37961, 37962, 37963, 37964, 37965, + 37966, 37967, 37968, 37969, 37970, 37971, 37972, 37973, 37974, 37975, + 37976, 37977, 37978, 37979, 37980, 37981, 37982, 37983, 37984, 37985, + 37986, 37987, 37988, 37989, 37990, 37991, 37992, 37993, 37994, 37996, + 37997, 37998, 37999, 38000, 38001, 38002, 38003, 38004, 38005, 38006, + 38007, 38008, 38009, 38010, 38011, 38012, 38013, 38014, 38015, 38016, + 38017, 38018, 38019, 38020, 38033, 38038, 38040, 38087, 38095, 38099, + 38100, 38106, 38118, 38139, 38172, 38176, 29723, 29722, 29761, 29788, + 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, 29824, 29825, + 29831, 29835, 29854, 29864, 29865, 29840, 29863, 29906, 29882, 38890, + 38891, 38892, 26444, 26451, 26462, 26440, 26473, 26533, 26503, 26474, + 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, 26487, 26492, + 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, 26549, 26586, + 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, 26621, 26674, + 26675, 26720, 26721, 26702, 26722, 26692, 26724, 26755, 26653, 26709, + 26726, 26689, 26727, 26688, 26686, 26698, 26697, 26665, 26805, 26767, + 26740, 26743, 26771, 26731, 26818, 26990, 26876, 26911, 26912, 26873, + 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, + 38260, 38261, 38263, 38264, 38265, 38266, 38267, 38268, 38269, 38270, + 38272, 38273, 38274, 38275, 38276, 38277, 38278, 38279, 38280, 38281, + 38282, 38283, 38284, 38285, 38286, 38287, 38288, 38289, 38290, 38291, + 38292, 38293, 38294, 38295, 38296, 38297, 38298, 38299, 38300, 38301, + 38302, 38303, 38304, 38305, 38306, 38307, 38308, 38309, 38310, 38311, + 38312, 38313, 38314, 38315, 38316, 38317, 38318, 38319, 38320, 38321, + 38322, 38323, 38324, 38325, 38326, 38327, 38328, 38329, 38330, 38331, + 38332, 38333, 38334, 38335, 38336, 38337, 38338, 38339, 38340, 38341, + 38342, 38343, 38344, 38345, 38346, 38347, 26916, 26864, 26891, 26881, + 26967, 26851, 26896, 26993, 26937, 26976, 26946, 26973, 27012, 26987, + 27008, 27032, 27000, 26932, 27084, 27015, 27016, 27086, 27017, 26982, + 26979, 27001, 27035, 27047, 27067, 27051, 27053, 27092, 27057, 27073, + 27082, 27103, 27029, 27104, 27021, 27135, 27183, 27117, 27159, 27160, + 27237, 27122, 27204, 27198, 27296, 27216, 27227, 27189, 27278, 27257, + 27197, 27176, 27224, 27260, 27281, 27280, 27305, 27287, 27307, 29495, + 29522, 27521, 27522, 27527, 27524, 27538, 27539, 27533, 27546, 27547, + 27553, 27562, 36715, 36717, 36721, 36722, 36723, 36725, 36726, 36728, + 36727, 36729, 36730, 36732, 36734, 36737, 36738, 36740, 36743, 36747, + 38348, 38349, 38350, 38351, 38352, 38353, 38354, 38355, 38356, 38357, + 38358, 38359, 38360, 38361, 38362, 38363, 38364, 38365, 38366, 38367, + 38368, 38369, 38370, 38371, 38372, 38373, 38374, 38375, 38380, 38399, + 38407, 38419, 38424, 38427, 38430, 38432, 38435, 38436, 38437, 38438, + 38439, 38440, 38441, 38443, 38444, 38445, 38447, 38448, 38455, 38456, + 38457, 38458, 38462, 38465, 38467, 38474, 38478, 38479, 38481, 38482, + 38483, 38486, 38487, 38488, 38489, 38490, 38492, 38493, 38494, 38496, + 38499, 38501, 38502, 38507, 38509, 38510, 38511, 38512, 38513, 38515, + 38520, 38521, 38522, 38523, 38524, 38525, 38526, 38527, 38528, 38529, + 38530, 38531, 38532, 38535, 38537, 38538, 36749, 36750, 36751, 36760, + 36762, 36558, 25099, 25111, 25115, 25119, 25122, 25121, 25125, 25124, + 25132, 33255, 29935, 29940, 29951, 29967, 29969, 29971, 25908, 26094, + 26095, 26096, 26122, 26137, 26482, 26115, 26133, 26112, 28805, 26359, + 26141, 26164, 26161, 26166, 26165, 32774, 26207, 26196, 26177, 26191, + 26198, 26209, 26199, 26231, 26244, 26252, 26279, 26269, 26302, 26331, + 26332, 26342, 26345, 36146, 36147, 36150, 36155, 36157, 36160, 36165, + 36166, 36168, 36169, 36167, 36173, 36181, 36185, 35271, 35274, 35275, + 35276, 35278, 35279, 35280, 35281, 29294, 29343, 29277, 29286, 29295, + 29310, 29311, 29316, 29323, 29325, 29327, 29330, 25352, 25394, 25520, + 38540, 38542, 38545, 38546, 38547, 38549, 38550, 38554, 38555, 38557, + 38558, 38559, 38560, 38561, 38562, 38563, 38564, 38565, 38566, 38568, + 38569, 38570, 38571, 38572, 38573, 38574, 38575, 38577, 38578, 38580, + 38581, 38583, 38584, 38586, 38587, 38591, 38594, 38595, 38600, 38602, + 38603, 38608, 38609, 38611, 38612, 38614, 38615, 38616, 38617, 38618, + 38619, 38620, 38621, 38622, 38623, 38625, 38626, 38627, 38628, 38629, + 38630, 38631, 38635, 38636, 38637, 38638, 38640, 38641, 38642, 38644, + 38645, 38648, 38650, 38651, 38652, 38653, 38655, 38658, 38659, 38661, + 38666, 38667, 38668, 38672, 38673, 38674, 38676, 38677, 38679, 38680, + 38681, 38682, 38683, 38685, 38687, 38688, 25663, 25816, 32772, 27626, + 27635, 27645, 27637, 27641, 27653, 27655, 27654, 27661, 27669, 27672, + 27673, 27674, 27681, 27689, 27684, 27690, 27698, 25909, 25941, 25963, + 29261, 29266, 29270, 29232, 34402, 21014, 32927, 32924, 32915, 32956, + 26378, 32957, 32945, 32939, 32941, 32948, 32951, 32999, 33000, 33001, + 33002, 32987, 32962, 32964, 32985, 32973, 32983, 26384, 32989, 33003, + 33009, 33012, 33005, 33037, 33038, 33010, 33020, 26389, 33042, 35930, + 33078, 33054, 33068, 33048, 33074, 33096, 33100, 33107, 33140, 33113, + 33114, 33137, 33120, 33129, 33148, 33149, 33133, 33127, 22605, 23221, + 33160, 33154, 33169, 28373, 33187, 33194, 33228, 26406, 33226, 33211, + 38689, 38690, 38691, 38692, 38693, 38694, 38695, 38696, 38697, 38699, + 38700, 38702, 38703, 38705, 38707, 38708, 38709, 38710, 38711, 38714, + 38715, 38716, 38717, 38719, 38720, 38721, 38722, 38723, 38724, 38725, + 38726, 38727, 38728, 38729, 38730, 38731, 38732, 38733, 38734, 38735, + 38736, 38737, 38740, 38741, 38743, 38744, 38746, 38748, 38749, 38751, + 38755, 38756, 38758, 38759, 38760, 38762, 38763, 38764, 38765, 38766, + 38767, 38768, 38769, 38770, 38773, 38775, 38776, 38777, 38778, 38779, + 38781, 38782, 38783, 38784, 38785, 38786, 38787, 38788, 38790, 38791, + 38792, 38793, 38794, 38796, 38798, 38799, 38800, 38803, 38805, 38806, + 38807, 38809, 38810, 38811, 38812, 38813, 33217, 33190, 27428, 27447, + 27449, 27459, 27462, 27481, 39121, 39122, 39123, 39125, 39129, 39130, + 27571, 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, 26052, + 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, 28859, + 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, 28975, + 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, 29080, + 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, 29224, + 28780, 28952, 29030, 29113, 25150, 25149, 25155, 25160, 25161, 31035, + 31040, 31046, 31049, 31067, 31068, 31059, 31066, 31074, 31063, 31072, + 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, 24528, + 38814, 38815, 38817, 38818, 38820, 38821, 38822, 38823, 38824, 38825, + 38826, 38828, 38830, 38832, 38833, 38835, 38837, 38838, 38839, 38840, + 38841, 38842, 38843, 38844, 38845, 38846, 38847, 38848, 38849, 38850, + 38851, 38852, 38853, 38854, 38855, 38856, 38857, 38858, 38859, 38860, + 38861, 38862, 38863, 38864, 38865, 38866, 38867, 38868, 38869, 38870, + 38871, 38872, 38873, 38874, 38875, 38876, 38877, 38878, 38879, 38880, + 38881, 38882, 38883, 38884, 38885, 38888, 38894, 38895, 38896, 38897, + 38898, 38900, 38903, 38904, 38905, 38906, 38907, 38908, 38909, 38910, + 38911, 38912, 38913, 38914, 38915, 38916, 38917, 38918, 38919, 38920, + 38921, 38922, 38923, 38924, 38925, 38926, 24636, 24669, 24666, 24679, + 24641, 24665, 24675, 24747, 24838, 24845, 24925, 25001, 24989, 25035, + 25041, 25094, 32896, 32895, 27795, 27894, 28156, 30710, 30712, 30720, + 30729, 30743, 30744, 30737, 26027, 30765, 30748, 30749, 30777, 30778, + 30779, 30751, 30780, 30757, 30764, 30755, 30761, 30798, 30829, 30806, + 30807, 30758, 30800, 30791, 30796, 30826, 30875, 30867, 30874, 30855, + 30876, 30881, 30883, 30898, 30905, 30885, 30932, 30937, 30921, 30956, + 30962, 30981, 30964, 30995, 31012, 31006, 31028, 40859, 40697, 40699, + 40700, 30449, 30468, 30477, 30457, 30471, 30472, 30490, 30498, 30489, + 30509, 30502, 30517, 30520, 30544, 30545, 30535, 30531, 30554, 30568, + 38927, 38928, 38929, 38930, 38931, 38932, 38933, 38934, 38935, 38936, + 38937, 38938, 38939, 38940, 38941, 38942, 38943, 38944, 38945, 38946, + 38947, 38948, 38949, 38950, 38951, 38952, 38953, 38954, 38955, 38956, + 38957, 38958, 38959, 38960, 38961, 38962, 38963, 38964, 38965, 38966, + 38967, 38968, 38969, 38970, 38971, 38972, 38973, 38974, 38975, 38976, + 38977, 38978, 38979, 38980, 38981, 38982, 38983, 38984, 38985, 38986, + 38987, 38988, 38989, 38990, 38991, 38992, 38993, 38994, 38995, 38996, + 38997, 38998, 38999, 39000, 39001, 39002, 39003, 39004, 39005, 39006, + 39007, 39008, 39009, 39010, 39011, 39012, 39013, 39014, 39015, 39016, + 39017, 39018, 39019, 39020, 39021, 39022, 30562, 30565, 30591, 30605, + 30589, 30592, 30604, 30609, 30623, 30624, 30640, 30645, 30653, 30010, + 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, 32609, + 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, 30437, + 34866, 38021, 38022, 38023, 38027, 38026, 38028, 38029, 38031, 38032, + 38036, 38039, 38037, 38042, 38043, 38044, 38051, 38052, 38059, 38058, + 38061, 38060, 38063, 38064, 38066, 38068, 38070, 38071, 38072, 38073, + 38074, 38076, 38077, 38079, 38084, 38088, 38089, 38090, 38091, 38092, + 38093, 38094, 38096, 38097, 38098, 38101, 38102, 38103, 38105, 38104, + 38107, 38110, 38111, 38112, 38114, 38116, 38117, 38119, 38120, 38122, + 39023, 39024, 39025, 39026, 39027, 39028, 39051, 39054, 39058, 39061, + 39065, 39075, 39080, 39081, 39082, 39083, 39084, 39085, 39086, 39087, + 39088, 39089, 39090, 39091, 39092, 39093, 39094, 39095, 39096, 39097, + 39098, 39099, 39100, 39101, 39102, 39103, 39104, 39105, 39106, 39107, + 39108, 39109, 39110, 39111, 39112, 39113, 39114, 39115, 39116, 39117, + 39119, 39120, 39124, 39126, 39127, 39131, 39132, 39133, 39136, 39137, + 39138, 39139, 39140, 39141, 39142, 39145, 39146, 39147, 39148, 39149, + 39150, 39151, 39152, 39153, 39154, 39155, 39156, 39157, 39158, 39159, + 39160, 39161, 39162, 39163, 39164, 39165, 39166, 39167, 39168, 39169, + 39170, 39171, 39172, 39173, 39174, 39175, 38121, 38123, 38126, 38127, + 38131, 38132, 38133, 38135, 38137, 38140, 38141, 38143, 38147, 38146, + 38150, 38151, 38153, 38154, 38157, 38158, 38159, 38162, 38163, 38164, + 38165, 38166, 38168, 38171, 38173, 38174, 38175, 38178, 38186, 38187, + 38185, 38188, 38193, 38194, 38196, 38198, 38199, 38200, 38204, 38206, + 38207, 38210, 38197, 38212, 38213, 38214, 38217, 38220, 38222, 38223, + 38226, 38227, 38228, 38230, 38231, 38232, 38233, 38235, 38238, 38239, + 38237, 38241, 38242, 38244, 38245, 38246, 38247, 38248, 38249, 38250, + 38251, 38252, 38255, 38257, 38258, 38259, 38202, 30695, 30700, 38601, + 31189, 31213, 31203, 31211, 31238, 23879, 31235, 31234, 31262, 31252, + 39176, 39177, 39178, 39179, 39180, 39182, 39183, 39185, 39186, 39187, + 39188, 39189, 39190, 39191, 39192, 39193, 39194, 39195, 39196, 39197, + 39198, 39199, 39200, 39201, 39202, 39203, 39204, 39205, 39206, 39207, + 39208, 39209, 39210, 39211, 39212, 39213, 39215, 39216, 39217, 39218, + 39219, 39220, 39221, 39222, 39223, 39224, 39225, 39226, 39227, 39228, + 39229, 39230, 39231, 39232, 39233, 39234, 39235, 39236, 39237, 39238, + 39239, 39240, 39241, 39242, 39243, 39244, 39245, 39246, 39247, 39248, + 39249, 39250, 39251, 39254, 39255, 39256, 39257, 39258, 39259, 39260, + 39261, 39262, 39263, 39264, 39265, 39266, 39268, 39270, 39283, 39288, + 39289, 39291, 39294, 39298, 39299, 39305, 31289, 31287, 31313, 40655, + 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, + 40480, 40482, 40488, 40489, 40490, 40491, 40492, 40498, 40497, 40502, + 40504, 40503, 40505, 40506, 40510, 40513, 40514, 40516, 40518, 40519, + 40520, 40521, 40523, 40524, 40526, 40529, 40533, 40535, 40538, 40539, + 40540, 40542, 40547, 40550, 40551, 40552, 40553, 40554, 40555, 40556, + 40561, 40557, 40563, 30098, 30100, 30102, 30112, 30109, 30124, 30115, + 30131, 30132, 30136, 30148, 30129, 30128, 30147, 30146, 30166, 30157, + 30179, 30184, 30182, 30180, 30187, 30183, 30211, 30193, 30204, 30207, + 30224, 30208, 30213, 30220, 30231, 30218, 30245, 30232, 30229, 30233, + 39308, 39310, 39322, 39323, 39324, 39325, 39326, 39327, 39328, 39329, + 39330, 39331, 39332, 39334, 39335, 39337, 39338, 39339, 39340, 39341, + 39342, 39343, 39344, 39345, 39346, 39347, 39348, 39349, 39350, 39351, + 39352, 39353, 39354, 39355, 39356, 39357, 39358, 39359, 39360, 39361, + 39362, 39363, 39364, 39365, 39366, 39367, 39368, 39369, 39370, 39371, + 39372, 39373, 39374, 39375, 39376, 39377, 39378, 39379, 39380, 39381, + 39382, 39383, 39384, 39385, 39386, 39387, 39388, 39389, 39390, 39391, + 39392, 39393, 39394, 39395, 39396, 39397, 39398, 39399, 39400, 39401, + 39402, 39403, 39404, 39405, 39406, 39407, 39408, 39409, 39410, 39411, + 39412, 39413, 39414, 39415, 39416, 39417, 30235, 30268, 30242, 30240, + 30272, 30253, 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, + 30292, 30300, 30294, 30315, 30319, 32714, 31462, 31352, 31353, 31360, + 31366, 31368, 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, + 34921, 34930, 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, + 35042, 35022, 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, + 35105, 35097, 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, + 35195, 30091, 32997, 30386, 30388, 30684, 32786, 32788, 32790, 32796, + 32800, 32802, 32805, 32806, 32807, 32809, 32808, 32817, 32779, 32821, + 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, + 39418, 39419, 39420, 39421, 39422, 39423, 39424, 39425, 39426, 39427, + 39428, 39429, 39430, 39431, 39432, 39433, 39434, 39435, 39436, 39437, + 39438, 39439, 39440, 39441, 39442, 39443, 39444, 39445, 39446, 39447, + 39448, 39449, 39450, 39451, 39452, 39453, 39454, 39455, 39456, 39457, + 39458, 39459, 39460, 39461, 39462, 39463, 39464, 39465, 39466, 39467, + 39468, 39469, 39470, 39471, 39472, 39473, 39474, 39475, 39476, 39477, + 39478, 39479, 39480, 39481, 39482, 39483, 39484, 39485, 39486, 39487, + 39488, 39489, 39490, 39491, 39492, 39493, 39494, 39495, 39496, 39497, + 39498, 39499, 39500, 39501, 39502, 39503, 39504, 39505, 39506, 39507, + 39508, 39509, 39510, 39511, 39512, 39513, 39049, 39052, 39053, 39055, + 39060, 39066, 39067, 39070, 39071, 39073, 39074, 39077, 39078, 34381, + 34388, 34412, 34414, 34431, 34426, 34428, 34427, 34472, 34445, 34443, + 34476, 34461, 34471, 34467, 34474, 34451, 34473, 34486, 34500, 34485, + 34510, 34480, 34490, 34481, 34479, 34505, 34511, 34484, 34537, 34545, + 34546, 34541, 34547, 34512, 34579, 34526, 34548, 34527, 34520, 34513, + 34563, 34567, 34552, 34568, 34570, 34573, 34569, 34595, 34619, 34590, + 34597, 34606, 34586, 34622, 34632, 34612, 34609, 34601, 34615, 34623, + 34690, 34594, 34685, 34686, 34683, 34656, 34672, 34636, 34670, 34699, + 34643, 34659, 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, + 39514, 39515, 39516, 39517, 39518, 39519, 39520, 39521, 39522, 39523, + 39524, 39525, 39526, 39527, 39528, 39529, 39530, 39531, 39538, 39555, + 39561, 39565, 39566, 39572, 39573, 39577, 39590, 39593, 39594, 39595, + 39596, 39597, 39598, 39599, 39602, 39603, 39604, 39605, 39609, 39611, + 39613, 39614, 39615, 39619, 39620, 39622, 39623, 39624, 39625, 39626, + 39629, 39630, 39631, 39632, 39634, 39636, 39637, 39638, 39639, 39641, + 39642, 39643, 39644, 39645, 39646, 39648, 39650, 39651, 39652, 39653, + 39655, 39656, 39657, 39658, 39660, 39662, 39664, 39665, 39666, 39667, + 39668, 39669, 39670, 39671, 39672, 39674, 39676, 39677, 39678, 39679, + 39680, 39681, 39682, 39684, 39685, 39686, 34758, 34696, 34693, 34733, + 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, 34771, 34749, + 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, 34835, 34814, + 34826, 34843, 34849, 34873, 34876, 32566, 32578, 32580, 32581, 33296, + 31482, 31485, 31496, 31491, 31492, 31509, 31498, 31531, 31503, 31559, + 31544, 31530, 31513, 31534, 31537, 31520, 31525, 31524, 31539, 31550, + 31518, 31576, 31578, 31557, 31605, 31564, 31581, 31584, 31598, 31611, + 31586, 31602, 31601, 31632, 31654, 31655, 31672, 31660, 31645, 31656, + 31621, 31658, 31644, 31650, 31659, 31668, 31697, 31681, 31692, 31709, + 31706, 31717, 31718, 31722, 31756, 31742, 31740, 31759, 31766, 31755, + 39687, 39689, 39690, 39691, 39692, 39693, 39694, 39696, 39697, 39698, + 39700, 39701, 39702, 39703, 39704, 39705, 39706, 39707, 39708, 39709, + 39710, 39712, 39713, 39714, 39716, 39717, 39718, 39719, 39720, 39721, + 39722, 39723, 39724, 39725, 39726, 39728, 39729, 39731, 39732, 39733, + 39734, 39735, 39736, 39737, 39738, 39741, 39742, 39743, 39744, 39750, + 39754, 39755, 39756, 39758, 39760, 39762, 39763, 39765, 39766, 39767, + 39768, 39769, 39770, 39771, 39772, 39773, 39774, 39775, 39776, 39777, + 39778, 39779, 39780, 39781, 39782, 39783, 39784, 39785, 39786, 39787, + 39788, 39789, 39790, 39791, 39792, 39793, 39794, 39795, 39796, 39797, + 39798, 39799, 39800, 39801, 39802, 39803, 31775, 31786, 31782, 31800, + 31809, 31808, 33278, 33281, 33282, 33284, 33260, 34884, 33313, 33314, + 33315, 33325, 33327, 33320, 33323, 33336, 33339, 33331, 33332, 33342, + 33348, 33353, 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, + 35032, 35039, 35166, 32669, 32671, 32679, 32687, 32688, 32690, 31868, + 25929, 31889, 31901, 31900, 31902, 31906, 31922, 31932, 31933, 31937, + 31943, 31948, 31949, 31944, 31941, 31959, 31976, 33390, 26280, 32703, + 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, 31992, 32119, + 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, 36241, + 36273, 36199, 36205, 35911, 35913, 37194, 37200, 37198, 37199, 37220, + 39804, 39805, 39806, 39807, 39808, 39809, 39810, 39811, 39812, 39813, + 39814, 39815, 39816, 39817, 39818, 39819, 39820, 39821, 39822, 39823, + 39824, 39825, 39826, 39827, 39828, 39829, 39830, 39831, 39832, 39833, + 39834, 39835, 39836, 39837, 39838, 39839, 39840, 39841, 39842, 39843, + 39844, 39845, 39846, 39847, 39848, 39849, 39850, 39851, 39852, 39853, + 39854, 39855, 39856, 39857, 39858, 39859, 39860, 39861, 39862, 39863, + 39864, 39865, 39866, 39867, 39868, 39869, 39870, 39871, 39872, 39873, + 39874, 39875, 39876, 39877, 39878, 39879, 39880, 39881, 39882, 39883, + 39884, 39885, 39886, 39887, 39888, 39889, 39890, 39891, 39892, 39893, + 39894, 39895, 39896, 39897, 39898, 39899, 37218, 37217, 37232, 37225, + 37231, 37245, 37246, 37234, 37236, 37241, 37260, 37253, 37264, 37261, + 37265, 37282, 37283, 37290, 37293, 37294, 37295, 37301, 37300, 37306, + 35925, 40574, 36280, 36331, 36357, 36441, 36457, 36277, 36287, 36284, + 36282, 36292, 36310, 36311, 36314, 36318, 36302, 36303, 36315, 36294, + 36332, 36343, 36344, 36323, 36345, 36347, 36324, 36361, 36349, 36372, + 36381, 36383, 36396, 36398, 36387, 36399, 36410, 36416, 36409, 36405, + 36413, 36401, 36425, 36417, 36418, 36433, 36434, 36426, 36464, 36470, + 36476, 36463, 36468, 36485, 36495, 36500, 36496, 36508, 36510, 35960, + 35970, 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, + 39900, 39901, 39902, 39903, 39904, 39905, 39906, 39907, 39908, 39909, + 39910, 39911, 39912, 39913, 39914, 39915, 39916, 39917, 39918, 39919, + 39920, 39921, 39922, 39923, 39924, 39925, 39926, 39927, 39928, 39929, + 39930, 39931, 39932, 39933, 39934, 39935, 39936, 39937, 39938, 39939, + 39940, 39941, 39942, 39943, 39944, 39945, 39946, 39947, 39948, 39949, + 39950, 39951, 39952, 39953, 39954, 39955, 39956, 39957, 39958, 39959, + 39960, 39961, 39962, 39963, 39964, 39965, 39966, 39967, 39968, 39969, + 39970, 39971, 39972, 39973, 39974, 39975, 39976, 39977, 39978, 39979, + 39980, 39981, 39982, 39983, 39984, 39985, 39986, 39987, 39988, 39989, + 39990, 39991, 39992, 39993, 39994, 39995, 35301, 35307, 35311, 35390, + 35622, 38739, 38633, 38643, 38639, 38662, 38657, 38664, 38671, 38670, + 38698, 38701, 38704, 38718, 40832, 40835, 40837, 40838, 40839, 40840, + 40841, 40842, 40844, 40702, 40715, 40717, 38585, 38588, 38589, 38606, + 38610, 30655, 38624, 37518, 37550, 37576, 37694, 37738, 37834, 37775, + 37950, 37995, 40063, 40066, 40069, 40070, 40071, 40072, 31267, 40075, + 40078, 40080, 40081, 40082, 40084, 40085, 40090, 40091, 40094, 40095, + 40096, 40097, 40098, 40099, 40101, 40102, 40103, 40104, 40105, 40107, + 40109, 40110, 40112, 40113, 40114, 40115, 40116, 40117, 40118, 40119, + 40122, 40123, 40124, 40125, 40132, 40133, 40134, 40135, 40138, 40139, + 39996, 39997, 39998, 39999, 40000, 40001, 40002, 40003, 40004, 40005, + 40006, 40007, 40008, 40009, 40010, 40011, 40012, 40013, 40014, 40015, + 40016, 40017, 40018, 40019, 40020, 40021, 40022, 40023, 40024, 40025, + 40026, 40027, 40028, 40029, 40030, 40031, 40032, 40033, 40034, 40035, + 40036, 40037, 40038, 40039, 40040, 40041, 40042, 40043, 40044, 40045, + 40046, 40047, 40048, 40049, 40050, 40051, 40052, 40053, 40054, 40055, + 40056, 40057, 40058, 40059, 40061, 40062, 40064, 40067, 40068, 40073, + 40074, 40076, 40079, 40083, 40086, 40087, 40088, 40089, 40093, 40106, + 40108, 40111, 40121, 40126, 40127, 40128, 40129, 40130, 40136, 40137, + 40145, 40146, 40154, 40155, 40160, 40161, 40140, 40141, 40142, 40143, + 40144, 40147, 40148, 40149, 40151, 40152, 40153, 40156, 40157, 40159, + 40162, 38780, 38789, 38801, 38802, 38804, 38831, 38827, 38819, 38834, + 38836, 39601, 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, + 39621, 39618, 39627, 39628, 39633, 39749, 39747, 39751, 39753, 39752, + 39757, 39761, 39144, 39181, 39214, 39253, 39252, 39647, 39649, 39654, + 39663, 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, + 40637, 40638, 32315, 40578, 40583, 40584, 40587, 40594, 37846, 40605, + 40607, 40667, 40668, 40669, 40672, 40671, 40674, 40681, 40679, 40677, + 40682, 40687, 40738, 40748, 40751, 40761, 40759, 40765, 40766, 40772, + 40163, 40164, 40165, 40166, 40167, 40168, 40169, 40170, 40171, 40172, + 40173, 40174, 40175, 40176, 40177, 40178, 40179, 40180, 40181, 40182, + 40183, 40184, 40185, 40186, 40187, 40188, 40189, 40190, 40191, 40192, + 40193, 40194, 40195, 40196, 40197, 40198, 40199, 40200, 40201, 40202, + 40203, 40204, 40205, 40206, 40207, 40208, 40209, 40210, 40211, 40212, + 40213, 40214, 40215, 40216, 40217, 40218, 40219, 40220, 40221, 40222, + 40223, 40224, 40225, 40226, 40227, 40228, 40229, 40230, 40231, 40232, + 40233, 40234, 40235, 40236, 40237, 40238, 40239, 40240, 40241, 40242, + 40243, 40244, 40245, 40246, 40247, 40248, 40249, 40250, 40251, 40252, + 40253, 40254, 40255, 40256, 40257, 40258, 57908, 57909, 57910, 57911, + 57912, 57913, 57914, 57915, 57916, 57917, 57918, 57919, 57920, 57921, + 57922, 57923, 57924, 57925, 57926, 57927, 57928, 57929, 57930, 57931, + 57932, 57933, 57934, 57935, 57936, 57937, 57938, 57939, 57940, 57941, + 57942, 57943, 57944, 57945, 57946, 57947, 57948, 57949, 57950, 57951, + 57952, 57953, 57954, 57955, 57956, 57957, 57958, 57959, 57960, 57961, + 57962, 57963, 57964, 57965, 57966, 57967, 57968, 57969, 57970, 57971, + 57972, 57973, 57974, 57975, 57976, 57977, 57978, 57979, 57980, 57981, + 57982, 57983, 57984, 57985, 57986, 57987, 57988, 57989, 57990, 57991, + 57992, 57993, 57994, 57995, 57996, 57997, 57998, 57999, 58000, 58001, + 40259, 40260, 40261, 40262, 40263, 40264, 40265, 40266, 40267, 40268, + 40269, 40270, 40271, 40272, 40273, 40274, 40275, 40276, 40277, 40278, + 40279, 40280, 40281, 40282, 40283, 40284, 40285, 40286, 40287, 40288, + 40289, 40290, 40291, 40292, 40293, 40294, 40295, 40296, 40297, 40298, + 40299, 40300, 40301, 40302, 40303, 40304, 40305, 40306, 40307, 40308, + 40309, 40310, 40311, 40312, 40313, 40314, 40315, 40316, 40317, 40318, + 40319, 40320, 40321, 40322, 40323, 40324, 40325, 40326, 40327, 40328, + 40329, 40330, 40331, 40332, 40333, 40334, 40335, 40336, 40337, 40338, + 40339, 40340, 40341, 40342, 40343, 40344, 40345, 40346, 40347, 40348, + 40349, 40350, 40351, 40352, 40353, 40354, 58002, 58003, 58004, 58005, + 58006, 58007, 58008, 58009, 58010, 58011, 58012, 58013, 58014, 58015, + 58016, 58017, 58018, 58019, 58020, 58021, 58022, 58023, 58024, 58025, + 58026, 58027, 58028, 58029, 58030, 58031, 58032, 58033, 58034, 58035, + 58036, 58037, 58038, 58039, 58040, 58041, 58042, 58043, 58044, 58045, + 58046, 58047, 58048, 58049, 58050, 58051, 58052, 58053, 58054, 58055, + 58056, 58057, 58058, 58059, 58060, 58061, 58062, 58063, 58064, 58065, + 58066, 58067, 58068, 58069, 58070, 58071, 58072, 58073, 58074, 58075, + 58076, 58077, 58078, 58079, 58080, 58081, 58082, 58083, 58084, 58085, + 58086, 58087, 58088, 58089, 58090, 58091, 58092, 58093, 58094, 58095, + 40355, 40356, 40357, 40358, 40359, 40360, 40361, 40362, 40363, 40364, + 40365, 40366, 40367, 40368, 40369, 40370, 40371, 40372, 40373, 40374, + 40375, 40376, 40377, 40378, 40379, 40380, 40381, 40382, 40383, 40384, + 40385, 40386, 40387, 40388, 40389, 40390, 40391, 40392, 40393, 40394, + 40395, 40396, 40397, 40398, 40399, 40400, 40401, 40402, 40403, 40404, + 40405, 40406, 40407, 40408, 40409, 40410, 40411, 40412, 40413, 40414, + 40415, 40416, 40417, 40418, 40419, 40420, 40421, 40422, 40423, 40424, + 40425, 40426, 40427, 40428, 40429, 40430, 40431, 40432, 40433, 40434, + 40435, 40436, 40437, 40438, 40439, 40440, 40441, 40442, 40443, 40444, + 40445, 40446, 40447, 40448, 40449, 40450, 58096, 58097, 58098, 58099, + 58100, 58101, 58102, 58103, 58104, 58105, 58106, 58107, 58108, 58109, + 58110, 58111, 58112, 58113, 58114, 58115, 58116, 58117, 58118, 58119, + 58120, 58121, 58122, 58123, 58124, 58125, 58126, 58127, 58128, 58129, + 58130, 58131, 58132, 58133, 58134, 58135, 58136, 58137, 58138, 58139, + 58140, 58141, 58142, 58143, 58144, 58145, 58146, 58147, 58148, 58149, + 58150, 58151, 58152, 58153, 58154, 58155, 58156, 58157, 58158, 58159, + 58160, 58161, 58162, 58163, 58164, 58165, 58166, 58167, 58168, 58169, + 58170, 58171, 58172, 58173, 58174, 58175, 58176, 58177, 58178, 58179, + 58180, 58181, 58182, 58183, 58184, 58185, 58186, 58187, 58188, 58189, + 40451, 40452, 40453, 40454, 40455, 40456, 40457, 40458, 40459, 40460, + 40461, 40462, 40463, 40464, 40465, 40466, 40467, 40468, 40469, 40470, + 40471, 40472, 40473, 40474, 40475, 40476, 40477, 40478, 40484, 40487, + 40494, 40496, 40500, 40507, 40508, 40512, 40525, 40528, 40530, 40531, + 40532, 40534, 40537, 40541, 40543, 40544, 40545, 40546, 40549, 40558, + 40559, 40562, 40564, 40565, 40566, 40567, 40568, 40569, 40570, 40571, + 40572, 40573, 40576, 40577, 40579, 40580, 40581, 40582, 40585, 40586, + 40588, 40589, 40590, 40591, 40592, 40593, 40596, 40597, 40598, 40599, + 40600, 40601, 40602, 40603, 40604, 40606, 40608, 40609, 40610, 40611, + 40612, 40613, 40615, 40616, 40617, 40618, 58190, 58191, 58192, 58193, + 58194, 58195, 58196, 58197, 58198, 58199, 58200, 58201, 58202, 58203, + 58204, 58205, 58206, 58207, 58208, 58209, 58210, 58211, 58212, 58213, + 58214, 58215, 58216, 58217, 58218, 58219, 58220, 58221, 58222, 58223, + 58224, 58225, 58226, 58227, 58228, 58229, 58230, 58231, 58232, 58233, + 58234, 58235, 58236, 58237, 58238, 58239, 58240, 58241, 58242, 58243, + 58244, 58245, 58246, 58247, 58248, 58249, 58250, 58251, 58252, 58253, + 58254, 58255, 58256, 58257, 58258, 58259, 58260, 58261, 58262, 58263, + 58264, 58265, 58266, 58267, 58268, 58269, 58270, 58271, 58272, 58273, + 58274, 58275, 58276, 58277, 58278, 58279, 58280, 58281, 58282, 58283, + 40619, 40620, 40621, 40622, 40623, 40624, 40625, 40626, 40627, 40629, + 40630, 40631, 40633, 40634, 40636, 40639, 40640, 40641, 40642, 40643, + 40645, 40646, 40647, 40648, 40650, 40651, 40652, 40656, 40658, 40659, + 40661, 40662, 40663, 40665, 40666, 40670, 40673, 40675, 40676, 40678, + 40680, 40683, 40684, 40685, 40686, 40688, 40689, 40690, 40691, 40692, + 40693, 40694, 40695, 40696, 40698, 40701, 40703, 40704, 40705, 40706, + 40707, 40708, 40709, 40710, 40711, 40712, 40713, 40714, 40716, 40719, + 40721, 40722, 40724, 40725, 40726, 40728, 40730, 40731, 40732, 40733, + 40734, 40735, 40737, 40739, 40740, 40741, 40742, 40743, 40744, 40745, + 40746, 40747, 40749, 40750, 40752, 40753, 58284, 58285, 58286, 58287, + 58288, 58289, 58290, 58291, 58292, 58293, 58294, 58295, 58296, 58297, + 58298, 58299, 58300, 58301, 58302, 58303, 58304, 58305, 58306, 58307, + 58308, 58309, 58310, 58311, 58312, 58313, 58314, 58315, 58316, 58317, + 58318, 58319, 58320, 58321, 58322, 58323, 58324, 58325, 58326, 58327, + 58328, 58329, 58330, 58331, 58332, 58333, 58334, 58335, 58336, 58337, + 58338, 58339, 58340, 58341, 58342, 58343, 58344, 58345, 58346, 58347, + 58348, 58349, 58350, 58351, 58352, 58353, 58354, 58355, 58356, 58357, + 58358, 58359, 58360, 58361, 58362, 58363, 58364, 58365, 58366, 58367, + 58368, 58369, 58370, 58371, 58372, 58373, 58374, 58375, 58376, 58377, + 40754, 40755, 40756, 40757, 40758, 40760, 40762, 40764, 40767, 40768, + 40769, 40770, 40771, 40773, 40774, 40775, 40776, 40777, 40778, 40779, + 40780, 40781, 40782, 40783, 40786, 40787, 40788, 40789, 40790, 40791, + 40792, 40793, 40794, 40795, 40796, 40797, 40798, 40799, 40800, 40801, + 40802, 40803, 40804, 40805, 40806, 40807, 40808, 40809, 40810, 40811, + 40812, 40813, 40814, 40815, 40816, 40817, 40818, 40819, 40820, 40821, + 40822, 40823, 40824, 40825, 40826, 40827, 40828, 40829, 40830, 40833, + 40834, 40845, 40846, 40847, 40848, 40849, 40850, 40851, 40852, 40853, + 40854, 40855, 40856, 40860, 40861, 40862, 40865, 40866, 40867, 40868, + 40869, 63788, 63865, 63893, 63975, 63985, 58378, 58379, 58380, 58381, + 58382, 58383, 58384, 58385, 58386, 58387, 58388, 58389, 58390, 58391, + 58392, 58393, 58394, 58395, 58396, 58397, 58398, 58399, 58400, 58401, + 58402, 58403, 58404, 58405, 58406, 58407, 58408, 58409, 58410, 58411, + 58412, 58413, 58414, 58415, 58416, 58417, 58418, 58419, 58420, 58421, + 58422, 58423, 58424, 58425, 58426, 58427, 58428, 58429, 58430, 58431, + 58432, 58433, 58434, 58435, 58436, 58437, 58438, 58439, 58440, 58441, + 58442, 58443, 58444, 58445, 58446, 58447, 58448, 58449, 58450, 58451, + 58452, 58453, 58454, 58455, 58456, 58457, 58458, 58459, 58460, 58461, + 58462, 58463, 58464, 58465, 58466, 58467, 58468, 58469, 58470, 58471, + 64012, 64013, 64014, 64015, 64017, 64019, 64020, 64024, 64031, 64032, + 64033, 64035, 64036, 64039, 64040, 64041, 11905, 59414, 59415, 59416, + 11908, 13427, 13383, 11912, 11915, 59422, 13726, 13850, 13838, 11916, + 11927, 14702, 14616, 59430, 14799, 14815, 14963, 14800, 59435, 59436, + 15182, 15470, 15584, 11943, 59441, 59442, 11946, 16470, 16735, 11950, + 17207, 11955, 11958, 11959, 59451, 17329, 17324, 11963, 17373, 17622, + 18017, 17996, 59459, 18211, 18217, 18300, 18317, 11978, 18759, 18810, + 18813, 18818, 18819, 18821, 18822, 18847, 18843, 18871, 18870, 59476, + 59477, 19619, 19615, 19616, 19617, 19575, 19618, 19731, 19732, 19733, + 19734, 19735, 19736, 19737, 19886, 59492, 58472, 58473, 58474, 58475, + 58476, 58477, 58478, 58479, 58480, 58481, 58482, 58483, 58484, 58485, + 58486, 58487, 58488, 58489, 58490, 58491, 58492, 58493, 58494, 58495, + 58496, 58497, 58498, 58499, 58500, 58501, 58502, 58503, 58504, 58505, + 58506, 58507, 58508, 58509, 58510, 58511, 58512, 58513, 58514, 58515, + 58516, 58517, 58518, 58519, 58520, 58521, 58522, 58523, 58524, 58525, + 58526, 58527, 58528, 58529, 58530, 58531, 58532, 58533, 58534, 58535, + 58536, 58537, 58538, 58539, 58540, 58541, 58542, 58543, 58544, 58545, + 58546, 58547, 58548, 58549, 58550, 58551, 58552, 58553, 58554, 58555, + 58556, 58557, 58558, 58559, 58560, 58561, 58562, 58563, 58564, 58565, + +}; + +static const unsigned long myencoding_map_gb18030_ranges[][2] = { + {0, 128}, {36, 165}, {38, 169}, {45, 178}, {50, 184}, + {81, 216}, {89, 226}, {95, 235}, {96, 238}, {100, 244}, + {103, 248}, {104, 251}, {105, 253}, {109, 258}, {126, 276}, + {133, 284}, {148, 300}, {172, 325}, {175, 329}, {179, 334}, + {208, 364}, {306, 463}, {307, 465}, {308, 467}, {309, 469}, + {310, 471}, {311, 473}, {312, 475}, {313, 477}, {341, 506}, + {428, 594}, {443, 610}, {544, 712}, {545, 716}, {558, 730}, + {741, 930}, {742, 938}, {749, 962}, {750, 970}, {805, 1026}, + {819, 1104}, {820, 1106}, {7922, 8209}, {7924, 8215}, {7925, 8218}, + {7927, 8222}, {7934, 8231}, {7943, 8241}, {7944, 8244}, {7945, 8246}, + {7950, 8252}, {8062, 8365}, {8148, 8452}, {8149, 8454}, {8152, 8458}, + {8164, 8471}, {8174, 8482}, {8236, 8556}, {8240, 8570}, {8262, 8596}, + {8264, 8602}, {8374, 8713}, {8380, 8720}, {8381, 8722}, {8384, 8726}, + {8388, 8731}, {8390, 8737}, {8392, 8740}, {8393, 8742}, {8394, 8748}, + {8396, 8751}, {8401, 8760}, {8406, 8766}, {8416, 8777}, {8419, 8781}, + {8424, 8787}, {8437, 8802}, {8439, 8808}, {8445, 8816}, {8482, 8854}, + {8485, 8858}, {8496, 8870}, {8521, 8896}, {8603, 8979}, {8936, 9322}, + {8946, 9372}, {9046, 9548}, {9050, 9588}, {9063, 9616}, {9066, 9622}, + {9076, 9634}, {9092, 9652}, {9100, 9662}, {9108, 9672}, {9111, 9676}, + {9113, 9680}, {9131, 9702}, {9162, 9735}, {9164, 9738}, {9218, 9793}, + {9219, 9795}, {11329, 11906}, {11331, 11909}, {11334, 11913}, {11336, 11917}, + {11346, 11928}, {11361, 11944}, {11363, 11947}, {11366, 11951}, {11370, 11956}, + {11372, 11960}, {11375, 11964}, {11389, 11979}, {11682, 12284}, {11686, 12292}, + {11687, 12312}, {11692, 12319}, {11694, 12330}, {11714, 12351}, {11716, 12436}, + {11723, 12447}, {11725, 12535}, {11730, 12543}, {11736, 12586}, {11982, 12842}, + {11989, 12850}, {12102, 12964}, {12336, 13200}, {12348, 13215}, {12350, 13218}, + {12384, 13253}, {12393, 13263}, {12395, 13267}, {12397, 13270}, {12510, 13384}, + {12553, 13428}, {12851, 13727}, {12962, 13839}, {12973, 13851}, {13738, 14617}, + {13823, 14703}, {13919, 14801}, {13933, 14816}, {14080, 14964}, {14298, 15183}, + {14585, 15471}, {14698, 15585}, {15583, 16471}, {15847, 16736}, {16318, 17208}, + {16434, 17325}, {16438, 17330}, {16481, 17374}, {16729, 17623}, {17102, 17997}, + {17122, 18018}, {17315, 18212}, {17320, 18218}, {17402, 18301}, {17418, 18318}, + {17859, 18760}, {17909, 18811}, {17911, 18814}, {17915, 18820}, {17916, 18823}, + {17936, 18844}, {17939, 18848}, {17961, 18872}, {18664, 19576}, {18703, 19620}, + {18814, 19738}, {18962, 19887}, {19043, 40870}, {33469, 59244}, {33470, 59336}, + {33471, 59367}, {33484, 59413}, {33485, 59417}, {33490, 59423}, {33497, 59431}, + {33501, 59437}, {33505, 59443}, {33513, 59452}, {33520, 59460}, {33536, 59478}, + {33550, 59493}, {37845, 63789}, {37921, 63866}, {37948, 63894}, {38029, 63976}, + {38038, 63986}, {38064, 64016}, {38065, 64018}, {38066, 64021}, {38069, 64025}, + {38075, 64034}, {38076, 64037}, {38078, 64042}, {39108, 65074}, {39109, 65093}, + {39113, 65107}, {39114, 65112}, {39115, 65127}, {39116, 65132}, {39265, 65375}, + {39394, 65510}, {189000, 65536}, +}; + +static const unsigned long myencoding_map_ibm866[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 9617, 9618, + 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, + 9565, 9564, 9563, 9488, 9492, 9524, 9516, 9500, 9472, 9532, + 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, + 9576, 9572, 9573, 9561, 9560, 9554, 9555, 9579, 9578, 9496, + 9484, 9608, 9604, 9612, 9616, 9600, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 1025, 1105, 1028, 1108, 1031, 1111, 1038, 1118, + 176, 8729, 183, 8730, 8470, 164, 9632, 160, +}; + +static const unsigned long myencoding_map_iso_8859_10[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 274, 290, 298, 296, 310, 167, + 315, 272, 352, 358, 381, 173, 362, 330, 176, 261, + 275, 291, 299, 297, 311, 183, 316, 273, 353, 359, + 382, 8213, 363, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 207, + 208, 325, 332, 211, 212, 213, 214, 360, 216, 370, + 218, 219, 220, 221, 222, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 239, 240, 326, 333, 243, 244, 245, 246, 361, + 248, 371, 250, 251, 252, 253, 254, 312, +}; + +static const unsigned long myencoding_map_iso_8859_13[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8221, 162, 163, 164, 8222, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 8220, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 8217, +}; + +static const unsigned long myencoding_map_iso_8859_14[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 7682, 7683, 163, 266, 267, 7690, 167, + 7808, 169, 7810, 7691, 7922, 173, 174, 376, 7710, 7711, + 288, 289, 7744, 7745, 182, 7766, 7809, 7767, 7811, 7776, + 7923, 7812, 7813, 7777, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 372, 209, 210, 211, 212, 213, 214, 7786, 216, 217, + 218, 219, 220, 221, 374, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 373, 241, 242, 243, 244, 245, 246, 7787, + 248, 249, 250, 251, 252, 253, 375, 255, +}; + +static const unsigned long myencoding_map_iso_8859_15[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 8364, 165, 352, 167, + 353, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 381, 181, 182, 183, 382, 185, 186, 187, + 338, 339, 376, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myencoding_map_iso_8859_16[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 261, 321, 8364, 8222, 352, 167, + 353, 169, 536, 171, 377, 173, 378, 379, 176, 177, + 268, 322, 381, 8221, 182, 183, 382, 269, 537, 187, + 338, 339, 376, 380, 192, 193, 194, 258, 196, 262, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 272, 323, 210, 211, 212, 336, 214, 346, 368, 217, + 218, 219, 220, 280, 538, 223, 224, 225, 226, 259, + 228, 263, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 273, 324, 242, 243, 244, 337, 246, 347, + 369, 249, 250, 251, 252, 281, 539, 255, +}; + +static const unsigned long myencoding_map_iso_8859_2[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 728, 321, 164, 317, 346, 167, + 168, 352, 350, 356, 377, 173, 381, 379, 176, 261, + 731, 322, 180, 318, 347, 711, 184, 353, 351, 357, + 378, 733, 382, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myencoding_map_iso_8859_3[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 294, 728, 163, 164, 0x0000, 292, 167, + 168, 304, 350, 286, 308, 173, 0x0000, 379, 176, 295, + 178, 179, 180, 181, 293, 183, 184, 305, 351, 287, + 309, 189, 0x0000, 380, 192, 193, 194, 0x0000, 196, 266, + 264, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 0x0000, 209, 210, 211, 212, 288, 214, 215, 284, 217, + 218, 219, 220, 364, 348, 223, 224, 225, 226, 0x0000, + 228, 267, 265, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 0x0000, 241, 242, 243, 244, 289, 246, 247, + 285, 249, 250, 251, 252, 365, 349, 729, +}; + +static const unsigned long myencoding_map_iso_8859_4[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 260, 312, 342, 164, 296, 315, 167, + 168, 352, 274, 290, 358, 173, 381, 175, 176, 261, + 731, 343, 180, 297, 316, 711, 184, 353, 275, 291, + 359, 330, 382, 331, 256, 193, 194, 195, 196, 197, + 198, 302, 268, 201, 280, 203, 278, 205, 206, 298, + 272, 325, 332, 310, 212, 213, 214, 215, 216, 370, + 218, 219, 220, 360, 362, 223, 257, 225, 226, 227, + 228, 229, 230, 303, 269, 233, 281, 235, 279, 237, + 238, 299, 273, 326, 333, 311, 244, 245, 246, 247, + 248, 371, 250, 251, 252, 361, 363, 729, +}; + +static const unsigned long myencoding_map_iso_8859_5[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 1025, 1026, 1027, 1028, 1029, 1030, 1031, + 1032, 1033, 1034, 1035, 1036, 173, 1038, 1039, 1040, 1041, + 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, + 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, + 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, + 1102, 1103, 8470, 1105, 1106, 1107, 1108, 1109, 1110, 1111, + 1112, 1113, 1114, 1115, 1116, 167, 1118, 1119, +}; + +static const unsigned long myencoding_map_iso_8859_6[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 0x0000, 0x0000, 164, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1548, 173, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1563, + 0x0000, 0x0000, 0x0000, 1567, 0x0000, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myencoding_map_iso_8859_7[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 8216, 8217, 163, 8364, 8367, 166, 167, + 168, 169, 890, 171, 172, 173, 0x0000, 8213, 176, 177, + 178, 179, 900, 901, 902, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myencoding_map_iso_8859_8[] = { + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 0x0000, 162, 163, 164, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8215, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myencoding_map_jis0208[] = { + 12288, 12289, 12290, 65292, 65294, 12539, 65306, 65307, 65311, 65281, + 12443, 12444, 180, 65344, 168, 65342, 65507, 65343, 12541, 12542, + 12445, 12446, 12291, 20189, 12293, 12294, 12295, 12540, 8213, 8208, + 65295, 65340, 65374, 8741, 65372, 8230, 8229, 8216, 8217, 8220, + 8221, 65288, 65289, 12308, 12309, 65339, 65341, 65371, 65373, 12296, + 12297, 12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 65291, + 65293, 177, 215, 247, 65309, 8800, 65308, 65310, 8806, 8807, + 8734, 8756, 9794, 9792, 176, 8242, 8243, 8451, 65509, 65284, + 65504, 65505, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, + 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, + 9660, 8251, 12306, 8594, 8592, 8593, 8595, 12307, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8712, + 8715, 8838, 8839, 8834, 8835, 8746, 8745, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8743, 8744, 65506, 8658, 8660, + 8704, 8707, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 8736, 8869, 8978, 8706, 8711, 8801, 8786, + 8810, 8811, 8730, 8765, 8733, 8757, 8747, 8748, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8491, 8240, 9839, 9837, 9834, + 8224, 8225, 182, 0x0000, 0x0000, 0x0000, 0x0000, 9711, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 65296, 65297, 65298, 65299, 65300, 65301, 65302, + 65303, 65304, 65305, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, + 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, + 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 0x0000, 0x0000, + 0x0000, 0x0000, 12353, 12354, 12355, 12356, 12357, 12358, 12359, 12360, + 12361, 12362, 12363, 12364, 12365, 12366, 12367, 12368, 12369, 12370, + 12371, 12372, 12373, 12374, 12375, 12376, 12377, 12378, 12379, 12380, + 12381, 12382, 12383, 12384, 12385, 12386, 12387, 12388, 12389, 12390, + 12391, 12392, 12393, 12394, 12395, 12396, 12397, 12398, 12399, 12400, + 12401, 12402, 12403, 12404, 12405, 12406, 12407, 12408, 12409, 12410, + 12411, 12412, 12413, 12414, 12415, 12416, 12417, 12418, 12419, 12420, + 12421, 12422, 12423, 12424, 12425, 12426, 12427, 12428, 12429, 12430, + 12431, 12432, 12433, 12434, 12435, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 12449, 12450, 12451, 12452, + 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, 12461, 12462, + 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, 12471, 12472, + 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, 12481, 12482, + 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, 12491, 12492, + 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, 12501, 12502, + 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, 12511, 12512, + 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, 12521, 12522, + 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, 12531, 12532, + 12533, 12534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, + 934, 935, 936, 937, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 945, 946, 947, 948, 949, 950, 951, 952, + 953, 954, 955, 956, 957, 958, 959, 960, 961, 963, + 964, 965, 966, 967, 968, 969, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 1040, 1041, 1042, 1043, 1044, 1045, + 1025, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, + 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, + 1065, 1066, 1067, 1068, 1069, 1070, 1071, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, + 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, 1103, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9472, 9474, + 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, + 9475, 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, + 9504, 9519, 9512, 9527, 9535, 9501, 9520, 9509, 9528, 9538, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 9312, 9313, + 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 9322, 9323, + 9324, 9325, 9326, 9327, 9328, 9329, 9330, 9331, 8544, 8545, + 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 0x0000, 13129, + 13076, 13090, 13133, 13080, 13095, 13059, 13110, 13137, 13143, 13069, + 13094, 13091, 13099, 13130, 13115, 13212, 13213, 13214, 13198, 13199, + 13252, 13217, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 13179, 12317, 12319, 8470, 13261, 8481, 12964, 12965, 12966, 12967, + 12968, 12849, 12850, 12857, 13182, 13181, 13180, 8786, 8801, 8747, + 8750, 8721, 8730, 8869, 8736, 8735, 8895, 8757, 8745, 8746, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 20124, 21782, 23043, 38463, 21696, 24859, 25384, 23030, 36898, 33909, + 33564, 31312, 24746, 25569, 28197, 26093, 33894, 33446, 39925, 26771, + 22311, 26017, 25201, 23451, 22992, 34427, 39156, 32098, 32190, 39822, + 25110, 31903, 34999, 23433, 24245, 25353, 26263, 26696, 38343, 38797, + 26447, 20197, 20234, 20301, 20381, 20553, 22258, 22839, 22996, 23041, + 23561, 24799, 24847, 24944, 26131, 26885, 28858, 30031, 30064, 31227, + 32173, 32239, 32963, 33806, 34915, 35586, 36949, 36986, 21307, 20117, + 20133, 22495, 32946, 37057, 30959, 19968, 22769, 28322, 36920, 31282, + 33576, 33419, 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, + 39154, 28139, 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, + 23431, 28879, 32701, 36802, 38632, 21359, 40284, 31418, 19985, 30867, + 33276, 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, 28006, + 29916, 38287, 22082, 20113, 36939, 38642, 33615, 39180, 21473, 21942, + 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, 29787, 30408, + 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, 30410, 39365, + 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, 22576, 22852, + 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, 28948, 29017, + 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, 40219, 22633, + 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, 25276, 26106, + 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, 40644, 23713, + 27798, 33659, 20740, 23627, 25014, 33222, 26742, 29281, 20057, 20474, + 21368, 24681, 28201, 31311, 38899, 19979, 21270, 20206, 20309, 20285, + 20385, 20339, 21152, 21487, 22025, 22799, 23233, 23478, 23521, 31185, + 26247, 26524, 26550, 27468, 27827, 28779, 29634, 31117, 31166, 31292, + 31623, 33457, 33499, 33540, 33655, 33775, 33747, 34662, 35506, 22057, + 36008, 36838, 36942, 38686, 34442, 20420, 23784, 25105, 29273, 30011, + 33253, 33469, 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, + 22238, 22602, 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, + 25296, 25913, 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, + 33445, 34809, 38283, 38542, 35997, 20977, 21182, 22806, 21683, 23475, + 23830, 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, + 28012, 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, + 24275, 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, + 35282, 36203, 36611, 37101, 38307, 38548, 38761, 23398, 23731, 27005, + 38989, 38990, 25499, 31520, 27179, 27263, 26806, 39949, 28511, 21106, + 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, 36676, 19988, + 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, 33970, 37340, + 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, 33477, 29926, + 20094, 20355, 20896, 23506, 21002, 21208, 21223, 24059, 21914, 22570, + 23014, 23436, 23448, 23515, 24178, 24185, 24739, 24863, 24931, 25022, + 25563, 25954, 26577, 26707, 26874, 27454, 27475, 27735, 28450, 28567, + 28485, 29872, 29976, 30435, 30475, 31487, 31649, 31777, 32233, 32566, + 32752, 32925, 33382, 33694, 35251, 35532, 36011, 36996, 37969, 38291, + 38289, 38306, 38501, 38867, 39208, 33304, 20024, 21547, 23736, 24012, + 29609, 30284, 30524, 23721, 32747, 36107, 38593, 38929, 38996, 39000, + 20225, 20238, 21361, 21916, 22120, 22522, 22855, 23305, 23492, 23696, + 24076, 24190, 24524, 25582, 26426, 26071, 26082, 26399, 26827, 26820, + 27231, 24112, 27589, 27671, 27773, 30079, 31048, 23395, 31232, 32000, + 24509, 35215, 35352, 36020, 36215, 36556, 36637, 39138, 39438, 39740, + 20096, 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, + 30097, 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, + 21507, 21931, 26708, 27224, 35440, 30759, 26485, 40653, 21364, 23458, + 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, + 24339, 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, 31350, + 31406, 31496, 32026, 31998, 32102, 26087, 29275, 21435, 23621, 24040, + 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, 28417, 31142, + 39770, 20136, 20139, 20140, 20379, 20384, 20689, 20807, 31478, 20849, + 20982, 21332, 21281, 21375, 21483, 21932, 22659, 23777, 24375, 24394, + 24623, 24656, 24685, 25375, 25945, 27211, 27841, 29378, 29421, 30703, + 33016, 33029, 33288, 34126, 37111, 37857, 38911, 39255, 39514, 20208, + 20957, 23597, 26241, 26989, 23616, 26354, 26997, 29577, 26704, 31873, + 20677, 21220, 22343, 24062, 37670, 26020, 27427, 27453, 29748, 31105, + 31165, 31563, 32202, 33465, 33740, 34943, 35167, 35641, 36817, 37329, + 21535, 37504, 20061, 20534, 21477, 21306, 29399, 29590, 30697, 33510, + 36527, 39366, 39368, 39378, 20855, 24858, 34398, 21936, 31354, 20598, + 23507, 36935, 38533, 20018, 27355, 37351, 23633, 23624, 25496, 31391, + 27795, 38772, 36705, 31402, 29066, 38536, 31874, 26647, 32368, 26705, + 37740, 21234, 21531, 34219, 35347, 32676, 36557, 37089, 21350, 34952, + 31041, 20418, 20670, 21009, 20804, 21843, 22317, 29674, 22411, 22865, + 24418, 24452, 24693, 24950, 24935, 25001, 25522, 25658, 25964, 26223, + 26690, 28179, 30054, 31293, 31995, 32076, 32153, 32331, 32619, 33550, + 33610, 34509, 35336, 35427, 35686, 36605, 38938, 40335, 33464, 36814, + 39912, 21127, 25119, 25731, 28608, 38553, 26689, 20625, 27424, 27770, + 28500, 31348, 32080, 34880, 35363, 26376, 20214, 20537, 20518, 20581, + 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, 25010, 25080, + 25331, 25458, 26908, 27177, 29309, 29356, 29486, 30740, 30831, 32121, + 30476, 32937, 35211, 35609, 36066, 36562, 36963, 37749, 38522, 38997, + 39443, 40568, 20803, 21407, 21427, 24187, 24358, 28187, 28304, 29572, + 29694, 32067, 33335, 35328, 35578, 38480, 20046, 20491, 21476, 21628, + 22266, 22993, 23396, 24049, 24235, 24359, 25144, 25925, 26543, 28246, + 29392, 31946, 34996, 32929, 32993, 33776, 34382, 35463, 36328, 37431, + 38599, 39015, 40723, 20116, 20114, 20237, 21320, 21577, 21566, 23087, + 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, 35703, + 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, 20844, + 21151, 21177, 21246, 21402, 21475, 21521, 21518, 21897, 22353, 22434, + 22909, 23380, 23389, 23439, 24037, 24039, 24055, 24184, 24195, 24218, + 24247, 24344, 24658, 24908, 25239, 25304, 25511, 25915, 26114, 26179, + 26356, 26477, 26657, 26775, 27083, 27743, 27946, 28009, 28207, 28317, + 30002, 30343, 30828, 31295, 31968, 32005, 32024, 32094, 32177, 32789, + 32771, 32943, 32945, 33108, 33167, 33322, 33618, 34892, 34913, 35611, + 36002, 36092, 37066, 37237, 37489, 30783, 37628, 38308, 38477, 38917, + 39321, 39640, 40251, 21083, 21163, 21495, 21512, 22741, 25335, 28640, + 35946, 36703, 40633, 20811, 21051, 21578, 22269, 31296, 37239, 40288, + 40658, 29508, 28425, 33136, 29969, 24573, 24794, 39592, 29403, 36796, + 27492, 38915, 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, + 26118, 26681, 26801, 28151, 30165, 32058, 33390, 39746, 20123, 20304, + 21449, 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, + 37782, 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, + 22622, 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, + 37319, 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, + 38555, 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, + 27018, 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, + 25662, 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, + 31545, 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, + 34217, 38609, 30352, 39894, 25420, 37638, 39851, 30399, 26194, 19977, + 20632, 21442, 23665, 24808, 25746, 25955, 26719, 29158, 29642, 29987, + 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, 27531, + 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, 22763, + 22987, 22985, 23039, 23376, 23629, 24066, 24107, 24535, 24605, 25351, + 25903, 23388, 26031, 26045, 26088, 26525, 27490, 27515, 27663, 29509, + 31049, 31169, 31992, 32025, 32043, 32930, 33026, 33267, 35222, 35422, + 35433, 35430, 35468, 35566, 36039, 36060, 38604, 39164, 27503, 20107, + 20284, 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, + 27835, 29246, 29885, 30164, 30913, 31034, 32780, 32819, 33258, 33940, + 36766, 27728, 40575, 24335, 35672, 40235, 31482, 36600, 23437, 38635, + 19971, 21489, 22519, 22833, 23241, 23460, 24713, 28287, 28422, 30142, + 36074, 23455, 34048, 31712, 20594, 26612, 33437, 23649, 34122, 32286, + 33294, 20889, 23556, 25448, 36198, 26012, 29038, 31038, 32023, 32773, + 35613, 36554, 36974, 34503, 37034, 20511, 21242, 23610, 26451, 28796, + 29237, 37196, 37320, 37675, 33509, 23490, 24369, 24825, 20027, 21462, + 23432, 25163, 26417, 27530, 29417, 29664, 31278, 33131, 36259, 37202, + 39318, 20754, 21463, 21610, 23551, 25480, 27193, 32172, 38656, 22234, + 21454, 21608, 23447, 23601, 24030, 20462, 24833, 25342, 27954, 31168, + 31179, 32066, 32333, 32722, 33261, 33311, 33936, 34886, 35186, 35728, + 36468, 36655, 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, + 21313, 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, + 21460, 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, + 34899, 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, + 24490, 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, + 36981, 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, + 32210, 32626, 26360, 34223, 34295, 35576, 21161, 21465, 22899, 24207, + 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, + 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, 23567, + 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, 25307, 25484, + 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, 27189, 27836, + 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, 30813, 30977, + 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, 33931, 34121, + 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, 37284, 37478, + 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, 20887, 21104, + 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, 26454, 27972, + 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, 22516, 39166, + 25325, 26893, 27542, 29165, 32340, 32887, 33394, 35302, 39135, 34645, + 36785, 23611, 20280, 20449, 20405, 21767, 23072, 23517, 23529, 24515, + 24910, 25391, 26032, 26187, 26862, 27035, 28024, 28145, 30003, 30137, + 30495, 31070, 31206, 32051, 33251, 33455, 34218, 35242, 35386, 36523, + 36763, 36914, 37341, 38663, 20154, 20161, 20995, 22645, 22764, 23563, + 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, + 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, 27700, 28810, + 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, 29790, + 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, 26905, + 33733, 38935, 38592, 35070, 28548, 25722, 23544, 19990, 28716, 30045, + 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, 25919, 25972, + 26143, 26228, 26866, 26646, 27491, 28165, 29298, 29983, 30427, 31934, + 32854, 22768, 35069, 35199, 35488, 35475, 35531, 36893, 37266, 38738, + 38745, 25993, 31246, 33030, 38587, 24109, 24796, 25114, 26021, 26132, + 26512, 30707, 31309, 31821, 32318, 33034, 36012, 36196, 36321, 36447, + 30889, 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, + 38634, 32118, 33292, 34633, 20185, 20808, 21315, 21344, 23459, 23554, + 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, + 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, + 33146, 33307, 33337, 34214, 35438, 36046, 36341, 36984, 36983, 37549, + 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, 32341, + 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, 29401, + 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, 35380, + 38459, 36961, 40736, 20711, 21109, 21452, 21474, 20489, 21930, 22766, + 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, 25475, 25407, + 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, 29157, 20105, + 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, 33624, 33900, + 33980, 34299, 35013, 36208, 36865, 36973, 37783, 38684, 39442, 20687, + 22679, 24974, 33235, 34101, 36104, 36896, 20419, 20596, 21063, 21363, + 24687, 25417, 26463, 28204, 36275, 36895, 20439, 23646, 36042, 26063, + 32154, 21330, 34966, 20854, 25539, 23384, 23403, 23562, 25613, 26449, + 36956, 20182, 22810, 22826, 27760, 35409, 21822, 22549, 22949, 24816, + 25171, 26561, 33333, 26965, 38464, 39364, 39464, 20307, 22534, 23550, + 32784, 23729, 24111, 24453, 24608, 24907, 25140, 26367, 27888, 28382, + 32974, 33151, 33492, 34955, 36024, 36864, 36910, 38538, 40667, 39899, + 20195, 21488, 22823, 31532, 37261, 38988, 40441, 28381, 28711, 21331, + 21828, 23429, 25176, 25246, 25299, 27810, 28655, 29730, 35351, 37944, + 28609, 35582, 33592, 20967, 34552, 21482, 21481, 20294, 36948, 36784, + 22890, 33073, 24061, 31466, 36799, 26842, 35895, 29432, 40008, 27197, + 35504, 20025, 21336, 22022, 22374, 25285, 25506, 26086, 27470, 28129, + 28251, 28845, 30701, 31471, 31658, 32187, 32829, 32966, 34507, 35477, + 37723, 22243, 22727, 24382, 26029, 26262, 27264, 27573, 30007, 35527, + 20516, 30693, 22320, 24347, 24677, 26234, 27744, 30196, 31258, 32622, + 33268, 34584, 36933, 39347, 31689, 30044, 31481, 31569, 33988, 36880, + 31209, 31378, 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, + 26172, 26609, 27880, 34411, 34935, 35387, 37198, 37619, 39376, 27159, + 28710, 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, + 24086, 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, + 26397, 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, + 35548, 36229, 36339, 37530, 38263, 38914, 40165, 21189, 25431, 30452, + 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, 26894, 27084, + 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, 20291, 28460, + 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, 22775, 23340, + 32044, 29226, 21514, 37347, 40372, 20141, 20302, 20572, 20597, 21059, + 35998, 21576, 22564, 23450, 24093, 24213, 24237, 24311, 24351, 24716, + 25269, 25402, 25552, 26799, 27712, 30855, 31118, 31243, 32224, 33351, + 35330, 35558, 36420, 36883, 37048, 37165, 37336, 40718, 27877, 25688, + 25826, 25973, 28404, 30340, 31515, 36969, 37841, 28346, 21746, 24505, + 25764, 36685, 36845, 37444, 20856, 22635, 22825, 23637, 24215, 28155, + 32399, 29980, 36028, 36578, 39003, 28857, 20253, 27583, 28593, 30000, + 38651, 20814, 21520, 22581, 22615, 22956, 23648, 24466, 26007, 26460, + 28193, 30331, 33759, 36077, 36884, 37117, 37709, 30757, 30778, 21162, + 24230, 22303, 22900, 24594, 20498, 20826, 20908, 20941, 20992, 21776, + 22612, 22616, 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, + 26691, 26812, 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, + 30168, 31095, 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, + 34276, 35342, 35588, 35910, 36367, 36867, 36879, 37913, 38518, 38957, + 39472, 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, + 30643, 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, + 24499, 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, + 27233, 20984, 31361, 26932, 23626, 40182, 33515, 23493, 37193, 28702, + 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, + 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, + 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, + 20108, 23612, 24336, 36841, 21250, 36049, 32905, 34425, 24319, 26085, + 20083, 20837, 22914, 23615, 38894, 20219, 22922, 24525, 35469, 28641, + 31152, 31074, 23527, 33905, 29483, 29105, 24180, 24565, 25467, 25754, + 29123, 31896, 20035, 24316, 20043, 22492, 22178, 24745, 28611, 32013, + 33021, 33075, 33215, 36786, 35223, 34468, 24052, 25226, 25773, 35207, + 26487, 27874, 27966, 29750, 30772, 23110, 32629, 33453, 39340, 20467, + 24259, 25309, 25490, 25943, 26479, 30403, 29260, 32972, 32954, 36649, + 37197, 20493, 22521, 23186, 26757, 26995, 29028, 29437, 36023, 22770, + 36064, 38506, 36889, 34687, 31204, 30695, 33833, 20271, 21093, 21338, + 25293, 26575, 27850, 30333, 31636, 31893, 33334, 34180, 36843, 26333, + 28448, 29190, 32283, 33707, 39361, 40614, 20989, 31665, 30834, 31672, + 32903, 31560, 27368, 24161, 32908, 30033, 30048, 20843, 37474, 28300, + 30330, 37271, 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, + 22617, 34532, 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, + 26001, 26495, 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, + 34281, 36009, 31684, 37318, 29033, 38930, 39151, 25405, 26217, 30058, + 30436, 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, + 24754, 25161, 25209, 25259, 26000, 27604, 27852, 30130, 30382, 30865, + 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, 38750, 39131, + 27147, 31800, 20633, 23614, 24494, 26503, 27608, 29749, 30473, 32654, + 40763, 26570, 31255, 21305, 30091, 39661, 24422, 33181, 33777, 32920, + 24380, 24517, 30050, 31558, 36924, 26727, 23019, 23195, 32016, 30334, + 35628, 20469, 24426, 27161, 27703, 28418, 29922, 31080, 34920, 35413, + 35961, 24287, 25551, 30149, 31186, 33495, 37672, 37618, 33948, 34541, + 39981, 21697, 24428, 25996, 27996, 28693, 36007, 36051, 38971, 25935, + 29942, 19981, 20184, 22496, 22827, 23142, 23500, 20904, 24067, 24220, + 24598, 25206, 25975, 26023, 26222, 28014, 29238, 31526, 33104, 33178, + 33433, 35676, 36000, 36070, 36212, 38428, 38468, 20398, 25771, 27494, + 33310, 33889, 34154, 37096, 23553, 26963, 39080, 33914, 34135, 20239, + 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, + 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, + 25198, 28954, 22894, 31881, 31966, 32027, 38640, 25991, 32862, 19993, + 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, 38281, + 38491, 31859, 38913, 20731, 22721, 30294, 30887, 21029, 30629, 34065, + 31622, 20559, 22793, 29255, 31687, 32232, 36794, 36820, 36941, 20415, + 21193, 23081, 24321, 38829, 20445, 33303, 37610, 22275, 25429, 27497, + 29995, 35036, 36628, 31298, 21215, 22675, 24917, 25098, 26286, 27597, + 31807, 33769, 20515, 20472, 21253, 21574, 22577, 22857, 23453, 23792, + 23791, 23849, 24214, 25265, 25447, 25918, 26041, 26379, 27861, 27873, + 28921, 30770, 32299, 32990, 33459, 33804, 34028, 34562, 35090, 35370, + 35914, 37030, 37586, 39165, 40179, 40300, 20047, 20129, 20621, 21078, + 22346, 22952, 24125, 24536, 24537, 25151, 26292, 26395, 26576, 26834, + 20882, 32033, 32938, 33192, 35584, 35980, 36031, 37502, 38450, 21536, + 38956, 21271, 20693, 21340, 22696, 25778, 26420, 29287, 30566, 31302, + 37350, 21187, 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, + 30406, 25705, 30952, 39764, 40635, 22475, 22969, 26151, 26522, 27598, + 21737, 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, + 20451, 21448, 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, + 24930, 28288, 28459, 34067, 21619, 26410, 39749, 24051, 31637, 23724, + 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, 27665, 30496, + 21209, 22818, 28961, 29279, 30683, 38695, 40289, 26891, 23167, 23064, + 20901, 21517, 21629, 26126, 30431, 36855, 37528, 40180, 23018, 29277, + 28357, 20813, 26825, 32191, 32236, 38754, 40634, 25720, 27169, 33538, + 22916, 23391, 27611, 29467, 30450, 32178, 32791, 33945, 20786, 26408, + 40665, 30446, 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, + 24758, 32011, 38272, 21249, 20063, 20918, 22812, 29242, 32822, 37326, + 24357, 30690, 21380, 24441, 32004, 34220, 35379, 36493, 38742, 26611, + 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, 21807, 20305, + 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, 26377, 26586, + 28263, 28044, 29494, 29495, 30001, 31056, 35029, 35480, 36938, 37009, + 37109, 38596, 34701, 22805, 20104, 20313, 19982, 35465, 36671, 38928, + 20653, 24188, 22934, 23481, 24248, 25562, 25594, 25793, 26332, 26954, + 27096, 27915, 28342, 29076, 29992, 31407, 32650, 32768, 33865, 33993, + 35201, 35617, 36362, 36965, 38525, 39178, 24958, 25233, 27442, 27779, + 28020, 32716, 32764, 28096, 32645, 34746, 35064, 26469, 33713, 38972, + 38647, 27931, 32097, 33853, 37226, 20081, 21365, 23888, 27396, 28651, + 34253, 34349, 35239, 21033, 21519, 23653, 26446, 26792, 29702, 29827, + 30178, 35023, 35041, 37324, 38626, 38520, 24459, 29575, 31435, 33870, + 25504, 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, + 31452, 40845, 20406, 24942, 26053, 34396, 20102, 20142, 20698, 20001, + 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, 31260, 31975, + 33391, 35538, 36988, 37327, 38517, 38936, 21147, 32209, 20523, 21400, + 26519, 28107, 29136, 29747, 33256, 36650, 38563, 40023, 40607, 29792, + 22593, 28057, 32047, 39006, 20196, 20278, 20363, 20919, 21169, 23994, + 24604, 29618, 31036, 33491, 37428, 38583, 38646, 38666, 40599, 40802, + 26278, 27508, 21015, 21155, 28872, 35010, 24265, 24651, 24976, 28451, + 29001, 31806, 32244, 32879, 34030, 36899, 37676, 21570, 39791, 27347, + 28809, 36034, 36335, 38706, 21172, 23105, 24266, 24324, 26391, 27004, + 27028, 28010, 28431, 29282, 29436, 31725, 32769, 32894, 34635, 37070, + 20845, 40595, 31108, 32907, 37682, 35542, 20525, 21644, 35441, 27498, + 36036, 33031, 24785, 26528, 40434, 20121, 20120, 39952, 35435, 34241, + 34152, 26880, 28286, 30871, 33109, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 24332, 19984, + 19989, 20010, 20017, 20022, 20028, 20031, 20034, 20054, 20056, 20098, + 20101, 35947, 20106, 33298, 24333, 20110, 20126, 20127, 20128, 20130, + 20144, 20147, 20150, 20174, 20173, 20164, 20166, 20162, 20183, 20190, + 20205, 20191, 20215, 20233, 20314, 20272, 20315, 20317, 20311, 20295, + 20342, 20360, 20367, 20376, 20347, 20329, 20336, 20369, 20335, 20358, + 20374, 20760, 20436, 20447, 20430, 20440, 20443, 20433, 20442, 20432, + 20452, 20453, 20506, 20520, 20500, 20522, 20517, 20485, 20252, 20470, + 20513, 20521, 20524, 20478, 20463, 20497, 20486, 20547, 20551, 26371, + 20565, 20560, 20552, 20570, 20566, 20588, 20600, 20608, 20634, 20613, + 20660, 20658, 20681, 20682, 20659, 20674, 20694, 20702, 20709, 20717, + 20707, 20718, 20729, 20725, 20745, 20737, 20738, 20758, 20757, 20756, + 20762, 20769, 20794, 20791, 20796, 20795, 20799, 20800, 20818, 20812, + 20820, 20834, 31480, 20841, 20842, 20846, 20864, 20866, 22232, 20876, + 20873, 20879, 20881, 20883, 20885, 20886, 20900, 20902, 20898, 20905, + 20906, 20907, 20915, 20913, 20914, 20912, 20917, 20925, 20933, 20937, + 20955, 20960, 34389, 20969, 20973, 20976, 20981, 20990, 20996, 21003, + 21012, 21006, 21031, 21034, 21038, 21043, 21049, 21071, 21060, 21067, + 21068, 21086, 21076, 21098, 21108, 21097, 21107, 21119, 21117, 21133, + 21140, 21138, 21105, 21128, 21137, 36776, 36775, 21164, 21165, 21180, + 21173, 21185, 21197, 21207, 21214, 21219, 21222, 39149, 21216, 21235, + 21237, 21240, 21241, 21254, 21256, 30008, 21261, 21264, 21263, 21269, + 21274, 21283, 21295, 21297, 21299, 21304, 21312, 21318, 21317, 19991, + 21321, 21325, 20950, 21342, 21353, 21358, 22808, 21371, 21367, 21378, + 21398, 21408, 21414, 21413, 21422, 21424, 21430, 21443, 31762, 38617, + 21471, 26364, 29166, 21486, 21480, 21485, 21498, 21505, 21565, 21568, + 21548, 21549, 21564, 21550, 21558, 21545, 21533, 21582, 21647, 21621, + 21646, 21599, 21617, 21623, 21616, 21650, 21627, 21632, 21622, 21636, + 21648, 21638, 21703, 21666, 21688, 21669, 21676, 21700, 21704, 21672, + 21675, 21698, 21668, 21694, 21692, 21720, 21733, 21734, 21775, 21780, + 21757, 21742, 21741, 21754, 21730, 21817, 21824, 21859, 21836, 21806, + 21852, 21829, 21846, 21847, 21816, 21811, 21853, 21913, 21888, 21679, + 21898, 21919, 21883, 21886, 21912, 21918, 21934, 21884, 21891, 21929, + 21895, 21928, 21978, 21957, 21983, 21956, 21980, 21988, 21972, 22036, + 22007, 22038, 22014, 22013, 22043, 22009, 22094, 22096, 29151, 22068, + 22070, 22066, 22072, 22123, 22116, 22063, 22124, 22122, 22150, 22144, + 22154, 22176, 22164, 22159, 22181, 22190, 22198, 22196, 22210, 22204, + 22209, 22211, 22208, 22216, 22222, 22225, 22227, 22231, 22254, 22265, + 22272, 22271, 22276, 22281, 22280, 22283, 22285, 22291, 22296, 22294, + 21959, 22300, 22310, 22327, 22328, 22350, 22331, 22336, 22351, 22377, + 22464, 22408, 22369, 22399, 22409, 22419, 22432, 22451, 22436, 22442, + 22448, 22467, 22470, 22484, 22482, 22483, 22538, 22486, 22499, 22539, + 22553, 22557, 22642, 22561, 22626, 22603, 22640, 27584, 22610, 22589, + 22649, 22661, 22713, 22687, 22699, 22714, 22750, 22715, 22712, 22702, + 22725, 22739, 22737, 22743, 22745, 22744, 22757, 22748, 22756, 22751, + 22767, 22778, 22777, 22779, 22780, 22781, 22786, 22794, 22800, 22811, + 26790, 22821, 22828, 22829, 22834, 22840, 22846, 31442, 22869, 22864, + 22862, 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, + 22941, 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, 23001, + 23002, 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, + 23093, 23094, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, + 23267, 23255, 23270, 23273, 23254, 23290, 23291, 23308, 23307, 23318, + 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, + 23386, 23387, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, + 23424, 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, 23524, + 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, 23559, + 23560, 23565, 23571, 23584, 23586, 23592, 23608, 23609, 23617, 23622, + 23630, 23635, 23632, 23631, 23409, 23660, 23662, 20066, 23670, 23673, + 23692, 23697, 23700, 22939, 23723, 23739, 23734, 23740, 23735, 23749, + 23742, 23751, 23769, 23785, 23805, 23802, 23789, 23948, 23786, 23819, + 23829, 23831, 23900, 23839, 23835, 23825, 23828, 23842, 23834, 23833, + 23832, 23884, 23890, 23886, 23883, 23916, 23923, 23926, 23943, 23940, + 23938, 23970, 23965, 23980, 23982, 23997, 23952, 23991, 23996, 24009, + 24013, 24019, 24018, 24022, 24027, 24043, 24050, 24053, 24075, 24090, + 24089, 24081, 24091, 24118, 24119, 24132, 24131, 24128, 24142, 24151, + 24148, 24159, 24162, 24164, 24135, 24181, 24182, 24186, 40636, 24191, + 24224, 24257, 24258, 24264, 24272, 24271, 24278, 24291, 24285, 24282, + 24283, 24290, 24289, 24296, 24297, 24300, 24305, 24307, 24304, 24308, + 24312, 24318, 24323, 24329, 24413, 24412, 24331, 24337, 24342, 24361, + 24365, 24376, 24385, 24392, 24396, 24398, 24367, 24401, 24406, 24407, + 24409, 24417, 24429, 24435, 24439, 24451, 24450, 24447, 24458, 24456, + 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, 24534, + 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, 24601, + 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, 24634, + 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, 24643, + 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, 24730, + 24708, 24731, 24726, 24727, 24722, 24743, 24715, 24801, 24760, 24800, + 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, 24838, + 24822, 24823, 24832, 24820, 24826, 24835, 24865, 24827, 24817, 24845, + 24846, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, 24884, + 24893, 24898, 24900, 24947, 24951, 24920, 24921, 24922, 24939, 24948, + 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, + 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, + 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, + 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, 25096, 25097, + 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, 25138, + 25139, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, 25218, + 25225, 25214, 25234, 25235, 25238, 25300, 25219, 25236, 25303, 25297, + 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, 25282, + 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, 25327, + 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, 25515, + 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, 25577, + 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, 25606, + 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, 25718, + 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, 25810, + 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, 25824, 25825, + 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, 25856, 25853, + 25880, 25884, 25861, 25892, 25891, 25899, 25908, 25909, 25911, 25910, + 25912, 30027, 25928, 25942, 25941, 25933, 25944, 25950, 25949, 25970, + 25976, 25986, 25987, 35722, 26011, 26015, 26027, 26039, 26051, 26054, + 26049, 26052, 26060, 26066, 26075, 26073, 26080, 26081, 26097, 26482, + 26122, 26115, 26107, 26483, 26165, 26166, 26164, 26140, 26191, 26180, + 26185, 26177, 26206, 26205, 26212, 26215, 26216, 26207, 26210, 26224, + 26243, 26248, 26254, 26249, 26244, 26264, 26269, 26305, 26297, 26313, + 26302, 26300, 26308, 26296, 26326, 26330, 26336, 26175, 26342, 26345, + 26352, 26357, 26359, 26383, 26390, 26398, 26406, 26407, 38712, 26414, + 26431, 26422, 26433, 26424, 26423, 26438, 26462, 26464, 26457, 26467, + 26468, 26505, 26480, 26537, 26492, 26474, 26508, 26507, 26534, 26529, + 26501, 26551, 26607, 26548, 26604, 26547, 26601, 26552, 26596, 26590, + 26589, 26594, 26606, 26553, 26574, 26566, 26599, 27292, 26654, 26694, + 26665, 26688, 26701, 26674, 26702, 26803, 26667, 26713, 26723, 26743, + 26751, 26783, 26767, 26797, 26772, 26781, 26779, 26755, 27310, 26809, + 26740, 26805, 26784, 26810, 26895, 26765, 26750, 26881, 26826, 26888, + 26840, 26914, 26918, 26849, 26892, 26829, 26836, 26855, 26837, 26934, + 26898, 26884, 26839, 26851, 26917, 26873, 26848, 26863, 26920, 26922, + 26906, 26915, 26913, 26822, 27001, 26999, 26972, 27000, 26987, 26964, + 27006, 26990, 26937, 26996, 26941, 26969, 26928, 26977, 26974, 26973, + 27009, 26986, 27058, 27054, 27088, 27071, 27073, 27091, 27070, 27086, + 23528, 27082, 27101, 27067, 27075, 27047, 27182, 27025, 27040, 27036, + 27029, 27060, 27102, 27112, 27138, 27163, 27135, 27402, 27129, 27122, + 27111, 27141, 27057, 27166, 27117, 27156, 27115, 27146, 27154, 27329, + 27171, 27155, 27204, 27148, 27250, 27190, 27256, 27207, 27234, 27225, + 27238, 27208, 27192, 27170, 27280, 27277, 27296, 27268, 27298, 27299, + 27287, 34327, 27323, 27331, 27330, 27320, 27315, 27308, 27358, 27345, + 27359, 27306, 27354, 27370, 27387, 27397, 34326, 27386, 27410, 27414, + 39729, 27423, 27448, 27447, 30428, 27449, 39150, 27463, 27459, 27465, + 27472, 27481, 27476, 27483, 27487, 27489, 27512, 27513, 27519, 27520, + 27524, 27523, 27533, 27544, 27541, 27550, 27556, 27562, 27563, 27567, + 27570, 27569, 27571, 27575, 27580, 27590, 27595, 27603, 27615, 27628, + 27627, 27635, 27631, 40638, 27656, 27667, 27668, 27675, 27684, 27683, + 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, 27774, + 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, 27845, + 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, 27935, + 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, 27916, + 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, 28037, + 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, 28126, + 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, 28142, + 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, 28203, + 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, 28216, + 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, 28338, + 28372, 28373, 28303, 28325, 28354, 28319, 28481, 28433, 28748, 28396, + 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, 28435, + 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, 28525, + 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, 28577, + 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, 28657, + 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, 28699, + 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, 28771, + 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, 28875, + 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, 29030, + 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, 29100, + 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, 29159, + 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, 29228, + 29232, 29234, 29243, 29244, 29247, 29248, 29254, 29259, 29272, 29300, + 29310, 29314, 29313, 29319, 29330, 29334, 29346, 29351, 29369, 29362, + 29379, 29382, 29380, 29390, 29394, 29410, 29408, 29409, 29433, 29431, + 20495, 29463, 29450, 29468, 29462, 29469, 29492, 29487, 29481, 29477, + 29502, 29518, 29519, 40664, 29527, 29546, 29544, 29552, 29560, 29557, + 29563, 29562, 29640, 29619, 29646, 29627, 29632, 29669, 29678, 29662, + 29858, 29701, 29807, 29733, 29688, 29746, 29754, 29781, 29759, 29791, + 29785, 29761, 29788, 29801, 29808, 29795, 29802, 29814, 29822, 29835, + 29854, 29863, 29898, 29903, 29908, 29681, 29920, 29923, 29927, 29929, + 29934, 29938, 29936, 29937, 29944, 29943, 29956, 29955, 29957, 29964, + 29966, 29965, 29973, 29971, 29982, 29990, 29996, 30012, 30020, 30029, + 30026, 30025, 30043, 30022, 30042, 30057, 30052, 30055, 30059, 30061, + 30072, 30070, 30086, 30087, 30068, 30090, 30089, 30082, 30100, 30106, + 30109, 30117, 30115, 30146, 30131, 30147, 30133, 30141, 30136, 30140, + 30129, 30157, 30154, 30162, 30169, 30179, 30174, 30206, 30207, 30204, + 30209, 30192, 30202, 30194, 30195, 30219, 30221, 30217, 30239, 30247, + 30240, 30241, 30242, 30244, 30260, 30256, 30267, 30279, 30280, 30278, + 30300, 30296, 30305, 30306, 30312, 30313, 30314, 30311, 30316, 30320, + 30322, 30326, 30328, 30332, 30336, 30339, 30344, 30347, 30350, 30358, + 30355, 30361, 30362, 30384, 30388, 30392, 30393, 30394, 30402, 30413, + 30422, 30418, 30430, 30433, 30437, 30439, 30442, 34351, 30459, 30472, + 30471, 30468, 30505, 30500, 30494, 30501, 30502, 30491, 30519, 30520, + 30535, 30554, 30568, 30571, 30555, 30565, 30591, 30590, 30585, 30606, + 30603, 30609, 30624, 30622, 30640, 30646, 30649, 30655, 30652, 30653, + 30651, 30663, 30669, 30679, 30682, 30684, 30691, 30702, 30716, 30732, + 30738, 31014, 30752, 31018, 30789, 30862, 30836, 30854, 30844, 30874, + 30860, 30883, 30901, 30890, 30895, 30929, 30918, 30923, 30932, 30910, + 30908, 30917, 30922, 30956, 30951, 30938, 30973, 30964, 30983, 30994, + 30993, 31001, 31020, 31019, 31040, 31072, 31063, 31071, 31066, 31061, + 31059, 31098, 31103, 31114, 31133, 31143, 40779, 31146, 31150, 31155, + 31161, 31162, 31177, 31189, 31207, 31212, 31201, 31203, 31240, 31245, + 31256, 31257, 31264, 31263, 31104, 31281, 31291, 31294, 31287, 31299, + 31319, 31305, 31329, 31330, 31337, 40861, 31344, 31353, 31357, 31368, + 31383, 31381, 31384, 31382, 31401, 31432, 31408, 31414, 31429, 31428, + 31423, 36995, 31431, 31434, 31437, 31439, 31445, 31443, 31449, 31450, + 31453, 31457, 31458, 31462, 31469, 31472, 31490, 31503, 31498, 31494, + 31539, 31512, 31513, 31518, 31541, 31528, 31542, 31568, 31610, 31492, + 31565, 31499, 31564, 31557, 31605, 31589, 31604, 31591, 31600, 31601, + 31596, 31598, 31645, 31640, 31647, 31629, 31644, 31642, 31627, 31634, + 31631, 31581, 31641, 31691, 31681, 31692, 31695, 31668, 31686, 31709, + 31721, 31761, 31764, 31718, 31717, 31840, 31744, 31751, 31763, 31731, + 31735, 31767, 31757, 31734, 31779, 31783, 31786, 31775, 31799, 31787, + 31805, 31820, 31811, 31828, 31823, 31808, 31824, 31832, 31839, 31844, + 31830, 31845, 31852, 31861, 31875, 31888, 31908, 31917, 31906, 31915, + 31905, 31912, 31923, 31922, 31921, 31918, 31929, 31933, 31936, 31941, + 31938, 31960, 31954, 31964, 31970, 39739, 31983, 31986, 31988, 31990, + 31994, 32006, 32002, 32028, 32021, 32010, 32069, 32075, 32046, 32050, + 32063, 32053, 32070, 32115, 32086, 32078, 32114, 32104, 32110, 32079, + 32099, 32147, 32137, 32091, 32143, 32125, 32155, 32186, 32174, 32163, + 32181, 32199, 32189, 32171, 32317, 32162, 32175, 32220, 32184, 32159, + 32176, 32216, 32221, 32228, 32222, 32251, 32242, 32225, 32261, 32266, + 32291, 32289, 32274, 32305, 32287, 32265, 32267, 32290, 32326, 32358, + 32315, 32309, 32313, 32323, 32311, 32306, 32314, 32359, 32349, 32342, + 32350, 32345, 32346, 32377, 32362, 32361, 32380, 32379, 32387, 32213, + 32381, 36782, 32383, 32392, 32393, 32396, 32402, 32400, 32403, 32404, + 32406, 32398, 32411, 32412, 32568, 32570, 32581, 32588, 32589, 32590, + 32592, 32593, 32597, 32596, 32600, 32607, 32608, 32616, 32617, 32615, + 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, 32669, + 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, 32709, + 32710, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, 39132, + 32774, 32772, 32779, 32786, 32792, 32793, 32796, 32801, 32808, 32831, + 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, 32872, 32883, + 32882, 32880, 32886, 32889, 32893, 32895, 32900, 32902, 32901, 32923, + 32915, 32922, 32941, 20880, 32940, 32987, 32997, 32985, 32989, 32964, + 32986, 32982, 33033, 33007, 33009, 33051, 33065, 33059, 33071, 33099, + 38539, 33094, 33086, 33107, 33105, 33020, 33137, 33134, 33125, 33126, + 33140, 33155, 33160, 33162, 33152, 33154, 33184, 33173, 33188, 33187, + 33119, 33171, 33193, 33200, 33205, 33214, 33208, 33213, 33216, 33218, + 33210, 33225, 33229, 33233, 33241, 33240, 33224, 33242, 33247, 33248, + 33255, 33274, 33275, 33278, 33281, 33282, 33285, 33287, 33290, 33293, + 33296, 33302, 33321, 33323, 33336, 33331, 33344, 33369, 33368, 33373, + 33370, 33375, 33380, 33378, 33384, 33386, 33387, 33326, 33393, 33399, + 33400, 33406, 33421, 33426, 33451, 33439, 33467, 33452, 33505, 33507, + 33503, 33490, 33524, 33523, 33530, 33683, 33539, 33531, 33529, 33502, + 33542, 33500, 33545, 33497, 33589, 33588, 33558, 33586, 33585, 33600, + 33593, 33616, 33605, 33583, 33579, 33559, 33560, 33669, 33690, 33706, + 33695, 33698, 33686, 33571, 33678, 33671, 33674, 33660, 33717, 33651, + 33653, 33696, 33673, 33704, 33780, 33811, 33771, 33742, 33789, 33795, + 33752, 33803, 33729, 33783, 33799, 33760, 33778, 33805, 33826, 33824, + 33725, 33848, 34054, 33787, 33901, 33834, 33852, 34138, 33924, 33911, + 33899, 33965, 33902, 33922, 33897, 33862, 33836, 33903, 33913, 33845, + 33994, 33890, 33977, 33983, 33951, 34009, 33997, 33979, 34010, 34000, + 33985, 33990, 34006, 33953, 34081, 34047, 34036, 34071, 34072, 34092, + 34079, 34069, 34068, 34044, 34112, 34147, 34136, 34120, 34113, 34306, + 34123, 34133, 34176, 34212, 34184, 34193, 34186, 34216, 34157, 34196, + 34203, 34282, 34183, 34204, 34167, 34174, 34192, 34249, 34234, 34255, + 34233, 34256, 34261, 34269, 34277, 34268, 34297, 34314, 34323, 34315, + 34302, 34298, 34310, 34338, 34330, 34352, 34367, 34381, 20053, 34388, + 34399, 34407, 34417, 34451, 34467, 34473, 34474, 34443, 34444, 34486, + 34479, 34500, 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, + 34540, 34527, 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, + 34577, 34569, 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, + 34601, 34586, 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, + 34670, 34649, 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, + 34763, 34749, 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, + 34747, 34799, 34802, 34784, 34831, 34829, 34814, 34806, 34807, 34830, + 34770, 34833, 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, + 34875, 34884, 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, + 34974, 34933, 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, + 34978, 34957, 34980, 34992, 35007, 34993, 35011, 35012, 35028, 35032, + 35033, 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, + 35082, 35091, 35139, 35102, 35109, 35114, 35115, 35137, 35140, 35131, + 35126, 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, + 35183, 35188, 35191, 35198, 35203, 35208, 35210, 35219, 35224, 35233, + 35241, 35238, 35244, 35247, 35250, 35258, 35261, 35263, 35264, 35290, + 35292, 35293, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, + 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, + 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, 35493, 35494, + 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, + 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, + 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, + 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, + 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, 35730, 35731, + 35734, 35737, 35738, 35898, 35905, 35903, 35912, 35916, 35918, 35920, + 35925, 35938, 35948, 35960, 35962, 35970, 35977, 35973, 35978, 35981, + 35982, 35988, 35964, 35992, 25117, 36013, 36010, 36029, 36018, 36019, + 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, 36090, 36091, + 36100, 36101, 36106, 36103, 36111, 36109, 36112, 40782, 36115, 36045, + 36116, 36118, 36199, 36205, 36209, 36211, 36225, 36249, 36290, 36286, + 36282, 36303, 36314, 36310, 36300, 36315, 36299, 36330, 36331, 36319, + 36323, 36348, 36360, 36361, 36351, 36381, 36382, 36368, 36383, 36418, + 36405, 36400, 36404, 36426, 36423, 36425, 36428, 36432, 36424, 36441, + 36452, 36448, 36394, 36451, 36437, 36470, 36466, 36476, 36481, 36487, + 36485, 36484, 36491, 36490, 36499, 36497, 36500, 36505, 36522, 36513, + 36524, 36528, 36550, 36529, 36542, 36549, 36552, 36555, 36571, 36579, + 36604, 36603, 36587, 36606, 36618, 36613, 36629, 36626, 36633, 36627, + 36636, 36639, 36635, 36620, 36646, 36659, 36667, 36665, 36677, 36674, + 36670, 36684, 36681, 36678, 36686, 36695, 36700, 36706, 36707, 36708, + 36764, 36767, 36771, 36781, 36783, 36791, 36826, 36837, 36834, 36842, + 36847, 36999, 36852, 36869, 36857, 36858, 36881, 36885, 36897, 36877, + 36894, 36886, 36875, 36903, 36918, 36917, 36921, 36856, 36943, 36944, + 36945, 36946, 36878, 36937, 36926, 36950, 36952, 36958, 36968, 36975, + 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, 37001, 37007, + 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, 37122, 37138, + 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, 37225, 37235, + 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, 37301, 37300, + 37306, 37312, 37313, 37321, 37323, 37328, 37334, 37343, 37345, 37339, + 37372, 37365, 37366, 37406, 37375, 37396, 37420, 37397, 37393, 37470, + 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, 37456, 37532, + 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, 37647, 37626, + 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, 37691, 37724, + 37728, 37756, 37742, 37718, 37808, 37804, 37805, 37780, 37817, 37846, + 37847, 37864, 37861, 37848, 37827, 37853, 37840, 37832, 37860, 37914, + 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, 37921, 37946, + 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, 37417, 38000, + 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, 38274, 38279, + 38282, 38292, 38294, 38296, 38297, 38304, 38312, 38311, 38317, 38332, + 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, 38357, 38356, + 38358, 38364, 38369, 38373, 38370, 38433, 38440, 38446, 38447, 38466, + 38476, 38479, 38475, 38519, 38492, 38494, 38493, 38495, 38502, 38514, + 38508, 38541, 38552, 38549, 38551, 38570, 38567, 38577, 38578, 38576, + 38580, 38582, 38584, 38585, 38606, 38603, 38601, 38605, 35149, 38620, + 38669, 38613, 38649, 38660, 38662, 38664, 38675, 38670, 38673, 38671, + 38678, 38681, 38692, 38698, 38704, 38713, 38717, 38718, 38724, 38726, + 38728, 38722, 38729, 38748, 38752, 38756, 38758, 38760, 21202, 38763, + 38769, 38777, 38789, 38780, 38785, 38778, 38790, 38795, 38799, 38800, + 38812, 38824, 38822, 38819, 38835, 38836, 38851, 38854, 38856, 38859, + 38876, 38893, 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, + 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, 39023, 39024, + 39025, 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, + 39145, 39147, 39171, 39177, 39186, 39188, 39192, 39201, 39197, 39198, + 39204, 39200, 39212, 39214, 39229, 39230, 39234, 39241, 39237, 39248, + 39243, 39249, 39250, 39244, 39253, 39319, 39320, 39333, 39341, 39342, + 39356, 39391, 39387, 39389, 39384, 39377, 39405, 39406, 39409, 39410, + 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, 39479, 39493, + 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, 39519, 39522, + 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, 39616, 39631, + 39633, 39635, 39636, 39646, 39647, 39650, 39651, 39654, 39663, 39659, + 39662, 39668, 39665, 39671, 39675, 39686, 39704, 39706, 39711, 39714, + 39715, 39717, 39719, 39720, 39721, 39722, 39726, 39727, 39730, 39748, + 39747, 39759, 39757, 39758, 39761, 39768, 39796, 39827, 39811, 39825, + 39830, 39831, 39839, 39840, 39848, 39860, 39872, 39882, 39865, 39878, + 39887, 39889, 39890, 39907, 39906, 39908, 39892, 39905, 39994, 39922, + 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, 39954, + 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, 39986, + 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, 40176, + 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, 40223, + 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, 40285, 40286, + 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, 40303, 40314, + 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, 40378, 40390, + 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, 40445, 40474, + 40475, 40478, 40565, 40569, 40573, 40577, 40584, 40587, 40588, 40594, + 40597, 40593, 40605, 40613, 40617, 40632, 40618, 40621, 38753, 40652, + 40654, 40655, 40656, 40660, 40668, 40670, 40669, 40672, 40677, 40680, + 40687, 40692, 40694, 40695, 40697, 40699, 40700, 40701, 40711, 40712, + 30391, 40725, 40737, 40748, 40766, 40778, 40786, 40788, 40803, 40799, + 40800, 40801, 40806, 40807, 40812, 40810, 40823, 40818, 40822, 40853, + 40860, 40864, 22575, 27079, 36953, 29796, 20956, 29081, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 32394, 35100, 37704, 37512, 34012, 20425, 28859, 26161, + 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, 20227, 20281, + 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, 20479, 20510, + 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, 20893, 20926, + 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, 21284, 21362, + 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, 21894, 22361, + 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, 22795, 22867, + 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, 23512, 23532, + 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, 23917, 23992, + 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, 24709, 24714, + 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, 25107, 25254, + 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, 26121, 26158, + 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, 26290, + 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, 26625, 26692, + 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, + 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, + 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, + 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, + 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, 29182, 29361, + 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, + 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, 29953, 30063, + 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, + 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, 31131, 31441, + 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, 32160, 32214, + 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, 33782, 33864, + 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, 34823, 35061, + 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, 35667, 35711, + 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, 36967, 37086, + 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, 37348, 37349, + 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, 37457, 37433, + 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, 64039, 37589, + 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, 37661, 37634, + 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, 37960, 38290, + 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, 38735, 38737, + 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, 39502, 39641, + 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, 40299, 64045, + 40473, 40657, 0x0000, 0x0000, 8560, 8561, 8562, 8563, 8564, 8565, + 8566, 8567, 8568, 8569, 65506, 65508, 65287, 65282, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 8560, 8561, 8562, 8563, + 8564, 8565, 8566, 8567, 8568, 8569, 8544, 8545, 8546, 8547, + 8548, 8549, 8550, 8551, 8552, 8553, 65506, 65508, 65287, 65282, + 12849, 8470, 8481, 8757, 32394, 35100, 37704, 37512, 34012, 20425, + 28859, 26161, 26824, 37625, 26363, 24389, 20008, 20193, 20220, 20224, + 20227, 20281, 20310, 20370, 20362, 20378, 20372, 20429, 20544, 20514, + 20479, 20510, 20550, 20592, 20546, 20628, 20724, 20696, 20810, 20836, + 20893, 20926, 20972, 21013, 21148, 21158, 21184, 21211, 21248, 21255, + 21284, 21362, 21395, 21426, 21469, 64014, 21660, 21642, 21673, 21759, + 21894, 22361, 22373, 22444, 22472, 22471, 64015, 64016, 22686, 22706, + 22795, 22867, 22875, 22877, 22883, 22948, 22970, 23382, 23488, 29999, + 23512, 23532, 23582, 23718, 23738, 23797, 23847, 23891, 64017, 23874, + 23917, 23992, 23993, 24016, 24353, 24372, 24423, 24503, 24542, 24669, + 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, 24984, + 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, 26171, + 26121, 26158, 26142, 26148, 26213, 26199, 26201, 64018, 26227, 26265, + 26272, 26290, 26303, 26362, 26382, 63785, 26470, 26555, 26706, 26560, + 26625, 26692, 26831, 64019, 26984, 64020, 27032, 27106, 27184, 27243, + 27206, 27251, 27262, 27362, 27364, 27606, 27711, 27740, 27782, 27759, + 27866, 27908, 28039, 28015, 28054, 28076, 28111, 28152, 28146, 28156, + 28217, 28252, 28199, 28220, 28351, 28552, 28597, 28661, 28677, 28679, + 28712, 28805, 28843, 28943, 28932, 29020, 28998, 28999, 64021, 29121, + 29182, 29361, 29374, 29476, 64022, 29559, 29629, 29641, 29654, 29667, + 29650, 29703, 29685, 29734, 29738, 29737, 29742, 29794, 29833, 29855, + 29953, 30063, 30338, 30364, 30366, 30363, 30374, 64023, 30534, 21167, + 30753, 30798, 30820, 30842, 31024, 64024, 64025, 64026, 31124, 64027, + 31131, 31441, 31463, 64028, 31467, 31646, 64029, 32072, 32092, 32183, + 32160, 32214, 32338, 32583, 32673, 64030, 33537, 33634, 33663, 33735, + 33782, 33864, 33972, 34131, 34137, 34155, 64031, 34224, 64032, 64033, + 34823, 35061, 35346, 35383, 35449, 35495, 35518, 35551, 64034, 35574, + 35667, 35711, 36080, 36084, 36114, 36214, 64035, 36559, 64036, 64037, + 36967, 37086, 64038, 37141, 37159, 37338, 37335, 37342, 37357, 37358, + 37348, 37349, 37382, 37392, 37386, 37434, 37440, 37436, 37454, 37465, + 37457, 37433, 37479, 37543, 37495, 37496, 37607, 37591, 37593, 37584, + 64039, 37589, 37600, 37587, 37669, 37665, 37627, 64040, 37662, 37631, + 37661, 37634, 37744, 37719, 37796, 37830, 37854, 37880, 37937, 37957, + 37960, 38290, 63964, 64041, 38557, 38575, 38707, 38715, 38723, 38733, + 38735, 38737, 38741, 38999, 39013, 64042, 64043, 39207, 64044, 39326, + 39502, 39641, 39644, 39797, 39794, 39823, 39857, 39867, 39936, 40304, + 40299, 64045, 40473, 40657, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + +}; + +static const unsigned long myencoding_map_jis0212[] = { + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 728, 711, + 184, 729, 733, 175, 731, 730, 65374, 900, 901, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 161, 166, 191, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 186, 170, + 169, 174, 8482, 164, 8470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 902, 904, 905, 906, 938, 0x0000, + 908, 0x0000, 910, 939, 0x0000, 911, 0x0000, 0x0000, 0x0000, 0x0000, + 940, 941, 942, 943, 970, 912, 972, 962, 973, 971, + 944, 974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1026, 1027, 1028, + 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1038, 1039, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1106, 1107, 1108, 1109, 1110, + 1111, 1112, 1113, 1114, 1115, 1116, 1118, 1119, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 198, 272, 0x0000, 294, 0x0000, 306, 0x0000, 321, + 319, 0x0000, 330, 216, 338, 0x0000, 358, 222, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 230, 273, 240, 295, 305, 307, + 312, 322, 320, 329, 331, 248, 339, 223, 359, 254, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 193, 192, 196, 194, + 258, 461, 256, 260, 197, 195, 262, 264, 268, 199, + 266, 270, 201, 200, 203, 202, 282, 278, 274, 280, + 0x0000, 284, 286, 290, 288, 292, 205, 204, 207, 206, + 463, 304, 298, 302, 296, 308, 310, 313, 317, 315, + 323, 327, 325, 209, 211, 210, 214, 212, 465, 336, + 332, 213, 340, 344, 342, 346, 348, 352, 350, 356, + 354, 218, 217, 220, 219, 364, 467, 368, 362, 370, + 366, 360, 471, 475, 473, 469, 372, 221, 376, 374, + 377, 381, 379, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 225, 224, 228, 226, 259, 462, 257, 261, 229, 227, + 263, 265, 269, 231, 267, 271, 233, 232, 235, 234, + 283, 279, 275, 281, 501, 285, 287, 0x0000, 289, 293, + 237, 236, 239, 238, 464, 0x0000, 299, 303, 297, 309, + 311, 314, 318, 316, 324, 328, 326, 241, 243, 242, + 246, 244, 466, 337, 333, 245, 341, 345, 343, 347, + 349, 353, 351, 357, 355, 250, 249, 252, 251, 365, + 468, 369, 363, 371, 367, 361, 472, 476, 474, 470, + 373, 253, 255, 375, 378, 382, 380, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 19970, 19972, 19973, 19980, 19986, 19999, 20003, 20004, 20008, 20011, + 20014, 20015, 20016, 20021, 20032, 20033, 20036, 20039, 20049, 20058, + 20060, 20067, 20072, 20073, 20084, 20085, 20089, 20095, 20109, 20118, + 20119, 20125, 20143, 20153, 20163, 20176, 20186, 20187, 20192, 20193, + 20194, 20200, 20207, 20209, 20211, 20213, 20221, 20222, 20223, 20224, + 20226, 20227, 20232, 20235, 20236, 20242, 20245, 20246, 20247, 20249, + 20270, 20273, 20320, 20275, 20277, 20279, 20281, 20283, 20286, 20288, + 20290, 20296, 20297, 20299, 20300, 20306, 20308, 20310, 20312, 20319, + 20323, 20330, 20332, 20334, 20337, 20343, 20344, 20345, 20346, 20349, + 20350, 20353, 20354, 20356, 20357, 20361, 20362, 20364, 20366, 20368, + 20370, 20371, 20372, 20375, 20377, 20378, 20382, 20383, 20402, 20407, + 20409, 20411, 20412, 20413, 20414, 20416, 20417, 20421, 20422, 20424, + 20425, 20427, 20428, 20429, 20431, 20434, 20444, 20448, 20450, 20464, + 20466, 20476, 20477, 20479, 20480, 20481, 20484, 20487, 20490, 20492, + 20494, 20496, 20499, 20503, 20504, 20507, 20508, 20509, 20510, 20514, + 20519, 20526, 20528, 20530, 20531, 20533, 20544, 20545, 20546, 20549, + 20550, 20554, 20556, 20558, 20561, 20562, 20563, 20567, 20569, 20575, + 20576, 20578, 20579, 20582, 20583, 20586, 20589, 20592, 20593, 20539, + 20609, 20611, 20612, 20614, 20618, 20622, 20623, 20624, 20626, 20627, + 20628, 20630, 20635, 20636, 20638, 20639, 20640, 20641, 20642, 20650, + 20655, 20656, 20665, 20666, 20669, 20672, 20675, 20676, 20679, 20684, + 20686, 20688, 20691, 20692, 20696, 20700, 20701, 20703, 20706, 20708, + 20710, 20712, 20713, 20719, 20721, 20726, 20730, 20734, 20739, 20742, + 20743, 20744, 20747, 20748, 20749, 20750, 20722, 20752, 20759, 20761, + 20763, 20764, 20765, 20766, 20771, 20775, 20776, 20780, 20781, 20783, + 20785, 20787, 20788, 20789, 20792, 20793, 20802, 20810, 20815, 20819, + 20821, 20823, 20824, 20831, 20836, 20838, 20862, 20867, 20868, 20875, + 20878, 20888, 20893, 20897, 20899, 20909, 20920, 20922, 20924, 20926, + 20927, 20930, 20936, 20943, 20945, 20946, 20947, 20949, 20952, 20958, + 20962, 20965, 20974, 20978, 20979, 20980, 20983, 20993, 20994, 20997, + 21010, 21011, 21013, 21014, 21016, 21026, 21032, 21041, 21042, 21045, + 21052, 21061, 21065, 21077, 21079, 21080, 21082, 21084, 21087, 21088, + 21089, 21094, 21102, 21111, 21112, 21113, 21120, 21122, 21125, 21130, + 21132, 21139, 21141, 21142, 21143, 21144, 21146, 21148, 21156, 21157, + 21158, 21159, 21167, 21168, 21174, 21175, 21176, 21178, 21179, 21181, + 21184, 21188, 21190, 21192, 21196, 21199, 21201, 21204, 21206, 21211, + 21212, 21217, 21221, 21224, 21225, 21226, 21228, 21232, 21233, 21236, + 21238, 21239, 21248, 21251, 21258, 21259, 21260, 21265, 21267, 21272, + 21275, 21276, 21278, 21279, 21285, 21287, 21288, 21289, 21291, 21292, + 21293, 21296, 21298, 21301, 21308, 21309, 21310, 21314, 21324, 21323, + 21337, 21339, 21345, 21347, 21349, 21356, 21357, 21362, 21369, 21374, + 21379, 21383, 21384, 21390, 21395, 21396, 21401, 21405, 21409, 21412, + 21418, 21419, 21423, 21426, 21428, 21429, 21431, 21432, 21434, 21437, + 21440, 21445, 21455, 21458, 21459, 21461, 21466, 21469, 21470, 21472, + 21478, 21479, 21493, 21506, 21523, 21530, 21537, 21543, 21544, 21546, + 21551, 21553, 21556, 21557, 21571, 21572, 21575, 21581, 21583, 21598, + 21602, 21604, 21606, 21607, 21609, 21611, 21613, 21614, 21620, 21631, + 21633, 21635, 21637, 21640, 21641, 21645, 21649, 21653, 21654, 21660, + 21663, 21665, 21670, 21671, 21673, 21674, 21677, 21678, 21681, 21687, + 21689, 21690, 21691, 21695, 21702, 21706, 21709, 21710, 21728, 21738, + 21740, 21743, 21750, 21756, 21758, 21759, 21760, 21761, 21765, 21768, + 21769, 21772, 21773, 21774, 21781, 21802, 21803, 21810, 21813, 21814, + 21819, 21820, 21821, 21825, 21831, 21833, 21834, 21837, 21840, 21841, + 21848, 21850, 21851, 21854, 21856, 21857, 21860, 21862, 21887, 21889, + 21890, 21894, 21896, 21902, 21903, 21905, 21906, 21907, 21908, 21911, + 21923, 21924, 21933, 21938, 21951, 21953, 21955, 21958, 21961, 21963, + 21964, 21966, 21969, 21970, 21971, 21975, 21976, 21979, 21982, 21986, + 21993, 22006, 22015, 22021, 22024, 22026, 22029, 22030, 22031, 22032, + 22033, 22034, 22041, 22060, 22064, 22067, 22069, 22071, 22073, 22075, + 22076, 22077, 22079, 22080, 22081, 22083, 22084, 22086, 22089, 22091, + 22093, 22095, 22100, 22110, 22112, 22113, 22114, 22115, 22118, 22121, + 22125, 22127, 22129, 22130, 22133, 22148, 22149, 22152, 22155, 22156, + 22165, 22169, 22170, 22173, 22174, 22175, 22182, 22183, 22184, 22185, + 22187, 22188, 22189, 22193, 22195, 22199, 22206, 22213, 22217, 22218, + 22219, 22223, 22224, 22220, 22221, 22233, 22236, 22237, 22239, 22241, + 22244, 22245, 22246, 22247, 22248, 22257, 22251, 22253, 22262, 22263, + 22273, 22274, 22279, 22282, 22284, 22289, 22293, 22298, 22299, 22301, + 22304, 22306, 22307, 22308, 22309, 22313, 22314, 22316, 22318, 22319, + 22323, 22324, 22333, 22334, 22335, 22341, 22342, 22348, 22349, 22354, + 22370, 22373, 22375, 22376, 22379, 22381, 22382, 22383, 22384, 22385, + 22387, 22388, 22389, 22391, 22393, 22394, 22395, 22396, 22398, 22401, + 22403, 22412, 22420, 22423, 22425, 22426, 22428, 22429, 22430, 22431, + 22433, 22421, 22439, 22440, 22441, 22444, 22456, 22461, 22471, 22472, + 22476, 22479, 22485, 22493, 22494, 22500, 22502, 22503, 22505, 22509, + 22512, 22517, 22518, 22520, 22525, 22526, 22527, 22531, 22532, 22536, + 22537, 22497, 22540, 22541, 22555, 22558, 22559, 22560, 22566, 22567, + 22573, 22578, 22585, 22591, 22601, 22604, 22605, 22607, 22608, 22613, + 22623, 22625, 22628, 22631, 22632, 22648, 22652, 22655, 22656, 22657, + 22663, 22664, 22665, 22666, 22668, 22669, 22671, 22672, 22676, 22678, + 22685, 22688, 22689, 22690, 22694, 22697, 22705, 22706, 22724, 22716, + 22722, 22728, 22733, 22734, 22736, 22738, 22740, 22742, 22746, 22749, + 22753, 22754, 22761, 22771, 22789, 22790, 22795, 22796, 22802, 22803, + 22804, 34369, 22813, 22817, 22819, 22820, 22824, 22831, 22832, 22835, + 22837, 22838, 22847, 22851, 22854, 22866, 22867, 22873, 22875, 22877, + 22878, 22879, 22881, 22883, 22891, 22893, 22895, 22898, 22901, 22902, + 22905, 22907, 22908, 22923, 22924, 22926, 22930, 22933, 22935, 22943, + 22948, 22951, 22957, 22958, 22959, 22960, 22963, 22967, 22970, 22972, + 22977, 22979, 22980, 22984, 22986, 22989, 22994, 23005, 23006, 23007, + 23011, 23012, 23015, 23022, 23023, 23025, 23026, 23028, 23031, 23040, + 23044, 23052, 23053, 23054, 23058, 23059, 23070, 23075, 23076, 23079, + 23080, 23082, 23085, 23088, 23108, 23109, 23111, 23112, 23116, 23120, + 23125, 23134, 23139, 23141, 23143, 23149, 23159, 23162, 23163, 23166, + 23179, 23184, 23187, 23190, 23193, 23196, 23198, 23199, 23200, 23202, + 23207, 23212, 23217, 23218, 23219, 23221, 23224, 23226, 23227, 23231, + 23236, 23238, 23240, 23247, 23258, 23260, 23264, 23269, 23274, 23278, + 23285, 23286, 23293, 23296, 23297, 23304, 23319, 23348, 23321, 23323, + 23325, 23329, 23333, 23341, 23352, 23361, 23371, 23372, 23378, 23382, + 23390, 23400, 23406, 23407, 23420, 23421, 23422, 23423, 23425, 23428, + 23430, 23434, 23438, 23440, 23441, 23443, 23444, 23446, 23464, 23465, + 23468, 23469, 23471, 23473, 23474, 23479, 23482, 23484, 23488, 23489, + 23501, 23503, 23510, 23511, 23512, 23513, 23514, 23520, 23535, 23537, + 23540, 23549, 23564, 23575, 23582, 23583, 23587, 23590, 23593, 23595, + 23596, 23598, 23600, 23602, 23605, 23606, 23641, 23642, 23644, 23650, + 23651, 23655, 23656, 23657, 23661, 23664, 23668, 23669, 23674, 23675, + 23676, 23677, 23687, 23688, 23690, 23695, 23698, 23709, 23711, 23712, + 23714, 23715, 23718, 23722, 23730, 23732, 23733, 23738, 23753, 23755, + 23762, 23773, 23767, 23790, 23793, 23794, 23796, 23809, 23814, 23821, + 23826, 23851, 23843, 23844, 23846, 23847, 23857, 23860, 23865, 23869, + 23871, 23874, 23875, 23878, 23880, 23893, 23889, 23897, 23882, 23903, + 23904, 23905, 23906, 23908, 23914, 23917, 23920, 23929, 23930, 23934, + 23935, 23937, 23939, 23944, 23946, 23954, 23955, 23956, 23957, 23961, + 23963, 23967, 23968, 23975, 23979, 23984, 23988, 23992, 23993, 24003, + 24007, 24011, 24016, 24014, 24024, 24025, 24032, 24036, 24041, 24056, + 24057, 24064, 24071, 24077, 24082, 24084, 24085, 24088, 24095, 24096, + 24110, 24104, 24114, 24117, 24126, 24139, 24144, 24137, 24145, 24150, + 24152, 24155, 24156, 24158, 24168, 24170, 24171, 24172, 24173, 24174, + 24176, 24192, 24203, 24206, 24226, 24228, 24229, 24232, 24234, 24236, + 24241, 24243, 24253, 24254, 24255, 24262, 24268, 24267, 24270, 24273, + 24274, 24276, 24277, 24284, 24286, 24293, 24299, 24322, 24326, 24327, + 24328, 24334, 24345, 24348, 24349, 24353, 24354, 24355, 24356, 24360, + 24363, 24364, 24366, 24368, 24372, 24374, 24379, 24381, 24383, 24384, + 24388, 24389, 24391, 24397, 24400, 24404, 24408, 24411, 24416, 24419, + 24420, 24423, 24431, 24434, 24436, 24437, 24440, 24442, 24445, 24446, + 24457, 24461, 24463, 24470, 24476, 24477, 24482, 24487, 24491, 24484, + 24492, 24495, 24496, 24497, 24504, 24516, 24519, 24520, 24521, 24523, + 24528, 24529, 24530, 24531, 24532, 24542, 24545, 24546, 24552, 24553, + 24554, 24556, 24557, 24558, 24559, 24562, 24563, 24566, 24570, 24572, + 24583, 24586, 24589, 24595, 24596, 24599, 24600, 24602, 24607, 24612, + 24621, 24627, 24629, 24640, 24647, 24648, 24649, 24652, 24657, 24660, + 24662, 24663, 24669, 24673, 24679, 24689, 24702, 24703, 24706, 24710, + 24712, 24714, 24718, 24721, 24723, 24725, 24728, 24733, 24734, 24738, + 24740, 24741, 24744, 24752, 24753, 24759, 24763, 24766, 24770, 24772, + 24776, 24777, 24778, 24779, 24782, 24783, 24788, 24789, 24793, 24795, + 24797, 24798, 24802, 24805, 24818, 24821, 24824, 24828, 24829, 24834, + 24839, 24842, 24844, 24848, 24849, 24850, 24851, 24852, 24854, 24855, + 24857, 24860, 24862, 24866, 24874, 24875, 24880, 24881, 24885, 24886, + 24887, 24889, 24897, 24901, 24902, 24905, 24926, 24928, 24940, 24946, + 24952, 24955, 24956, 24959, 24960, 24961, 24963, 24964, 24971, 24973, + 24978, 24979, 24983, 24984, 24988, 24989, 24991, 24992, 24997, 25000, + 25002, 25005, 25016, 25017, 25020, 25024, 25025, 25026, 25038, 25039, + 25045, 25052, 25053, 25054, 25055, 25057, 25058, 25063, 25065, 25061, + 25068, 25069, 25071, 25089, 25091, 25092, 25095, 25107, 25109, 25116, + 25120, 25122, 25123, 25127, 25129, 25131, 25145, 25149, 25154, 25155, + 25156, 25158, 25164, 25168, 25169, 25170, 25172, 25174, 25178, 25180, + 25188, 25197, 25199, 25203, 25210, 25213, 25229, 25230, 25231, 25232, + 25254, 25256, 25267, 25270, 25271, 25274, 25278, 25279, 25284, 25294, + 25301, 25302, 25306, 25322, 25330, 25332, 25340, 25341, 25347, 25348, + 25354, 25355, 25357, 25360, 25363, 25366, 25368, 25385, 25386, 25389, + 25397, 25398, 25401, 25404, 25409, 25410, 25411, 25412, 25414, 25418, + 25419, 25422, 25426, 25427, 25428, 25432, 25435, 25445, 25446, 25452, + 25453, 25457, 25460, 25461, 25464, 25468, 25469, 25471, 25474, 25476, + 25479, 25482, 25488, 25492, 25493, 25497, 25498, 25502, 25508, 25510, + 25517, 25518, 25519, 25533, 25537, 25541, 25544, 25550, 25553, 25555, + 25556, 25557, 25564, 25568, 25573, 25578, 25580, 25586, 25587, 25589, + 25592, 25593, 25609, 25610, 25616, 25618, 25620, 25624, 25630, 25632, + 25634, 25636, 25637, 25641, 25642, 25647, 25648, 25653, 25661, 25663, + 25675, 25679, 25681, 25682, 25683, 25684, 25690, 25691, 25692, 25693, + 25695, 25696, 25697, 25699, 25709, 25715, 25716, 25723, 25725, 25733, + 25735, 25743, 25744, 25745, 25752, 25753, 25755, 25757, 25759, 25761, + 25763, 25766, 25768, 25772, 25779, 25789, 25790, 25791, 25796, 25801, + 25802, 25803, 25804, 25806, 25808, 25809, 25813, 25815, 25828, 25829, + 25833, 25834, 25837, 25840, 25845, 25847, 25851, 25855, 25857, 25860, + 25864, 25865, 25866, 25871, 25875, 25876, 25878, 25881, 25883, 25886, + 25887, 25890, 25894, 25897, 25902, 25905, 25914, 25916, 25917, 25923, + 25927, 25929, 25936, 25938, 25940, 25951, 25952, 25959, 25963, 25978, + 25981, 25985, 25989, 25994, 26002, 26005, 26008, 26013, 26016, 26019, + 26022, 26030, 26034, 26035, 26036, 26047, 26050, 26056, 26057, 26062, + 26064, 26068, 26070, 26072, 26079, 26096, 26098, 26100, 26101, 26105, + 26110, 26111, 26112, 26116, 26120, 26121, 26125, 26129, 26130, 26133, + 26134, 26141, 26142, 26145, 26146, 26147, 26148, 26150, 26153, 26154, + 26155, 26156, 26158, 26160, 26161, 26163, 26169, 26167, 26176, 26181, + 26182, 26186, 26188, 26193, 26190, 26199, 26200, 26201, 26203, 26204, + 26208, 26209, 26363, 26218, 26219, 26220, 26238, 26227, 26229, 26239, + 26231, 26232, 26233, 26235, 26240, 26236, 26251, 26252, 26253, 26256, + 26258, 26265, 26266, 26267, 26268, 26271, 26272, 26276, 26285, 26289, + 26290, 26293, 26299, 26303, 26304, 26306, 26307, 26312, 26316, 26318, + 26319, 26324, 26331, 26335, 26344, 26347, 26348, 26350, 26362, 26373, + 26375, 26382, 26387, 26393, 26396, 26400, 26402, 26419, 26430, 26437, + 26439, 26440, 26444, 26452, 26453, 26461, 26470, 26476, 26478, 26484, + 26486, 26491, 26497, 26500, 26510, 26511, 26513, 26515, 26518, 26520, + 26521, 26523, 26544, 26545, 26546, 26549, 26555, 26556, 26557, 26617, + 26560, 26562, 26563, 26565, 26568, 26569, 26578, 26583, 26585, 26588, + 26593, 26598, 26608, 26610, 26614, 26615, 26706, 26644, 26649, 26653, + 26655, 26664, 26663, 26668, 26669, 26671, 26672, 26673, 26675, 26683, + 26687, 26692, 26693, 26698, 26700, 26709, 26711, 26712, 26715, 26731, + 26734, 26735, 26736, 26737, 26738, 26741, 26745, 26746, 26747, 26748, + 26754, 26756, 26758, 26760, 26774, 26776, 26778, 26780, 26785, 26787, + 26789, 26793, 26794, 26798, 26802, 26811, 26821, 26824, 26828, 26831, + 26832, 26833, 26835, 26838, 26841, 26844, 26845, 26853, 26856, 26858, + 26859, 26860, 26861, 26864, 26865, 26869, 26870, 26875, 26876, 26877, + 26886, 26889, 26890, 26896, 26897, 26899, 26902, 26903, 26929, 26931, + 26933, 26936, 26939, 26946, 26949, 26953, 26958, 26967, 26971, 26979, + 26980, 26981, 26982, 26984, 26985, 26988, 26992, 26993, 26994, 27002, + 27003, 27007, 27008, 27021, 27026, 27030, 27032, 27041, 27045, 27046, + 27048, 27051, 27053, 27055, 27063, 27064, 27066, 27068, 27077, 27080, + 27089, 27094, 27095, 27106, 27109, 27118, 27119, 27121, 27123, 27125, + 27134, 27136, 27137, 27139, 27151, 27153, 27157, 27162, 27165, 27168, + 27172, 27176, 27184, 27186, 27188, 27191, 27195, 27198, 27199, 27205, + 27206, 27209, 27210, 27214, 27216, 27217, 27218, 27221, 27222, 27227, + 27236, 27239, 27242, 27249, 27251, 27262, 27265, 27267, 27270, 27271, + 27273, 27275, 27281, 27291, 27293, 27294, 27295, 27301, 27307, 27311, + 27312, 27313, 27316, 27325, 27326, 27327, 27334, 27337, 27336, 27340, + 27344, 27348, 27349, 27350, 27356, 27357, 27364, 27367, 27372, 27376, + 27377, 27378, 27388, 27389, 27394, 27395, 27398, 27399, 27401, 27407, + 27408, 27409, 27415, 27419, 27422, 27428, 27432, 27435, 27436, 27439, + 27445, 27446, 27451, 27455, 27462, 27466, 27469, 27474, 27478, 27480, + 27485, 27488, 27495, 27499, 27502, 27504, 27509, 27517, 27518, 27522, + 27525, 27543, 27547, 27551, 27552, 27554, 27555, 27560, 27561, 27564, + 27565, 27566, 27568, 27576, 27577, 27581, 27582, 27587, 27588, 27593, + 27596, 27606, 27610, 27617, 27619, 27622, 27623, 27630, 27633, 27639, + 27641, 27647, 27650, 27652, 27653, 27657, 27661, 27662, 27664, 27666, + 27673, 27679, 27686, 27687, 27688, 27692, 27694, 27699, 27701, 27702, + 27706, 27707, 27711, 27722, 27723, 27725, 27727, 27730, 27732, 27737, + 27739, 27740, 27755, 27757, 27759, 27764, 27766, 27768, 27769, 27771, + 27781, 27782, 27783, 27785, 27796, 27797, 27799, 27800, 27804, 27807, + 27824, 27826, 27828, 27842, 27846, 27853, 27855, 27856, 27857, 27858, + 27860, 27862, 27866, 27868, 27872, 27879, 27881, 27883, 27884, 27886, + 27890, 27892, 27908, 27911, 27914, 27918, 27919, 27921, 27923, 27930, + 27942, 27943, 27944, 27751, 27950, 27951, 27953, 27961, 27964, 27967, + 27991, 27998, 27999, 28001, 28005, 28007, 28015, 28016, 28028, 28034, + 28039, 28049, 28050, 28052, 28054, 28055, 28056, 28074, 28076, 28084, + 28087, 28089, 28093, 28095, 28100, 28104, 28106, 28110, 28111, 28118, + 28123, 28125, 28127, 28128, 28130, 28133, 28137, 28143, 28144, 28148, + 28150, 28156, 28160, 28164, 28190, 28194, 28199, 28210, 28214, 28217, + 28219, 28220, 28228, 28229, 28232, 28233, 28235, 28239, 28241, 28242, + 28243, 28244, 28247, 28252, 28253, 28254, 28258, 28259, 28264, 28275, + 28283, 28285, 28301, 28307, 28313, 28320, 28327, 28333, 28334, 28337, + 28339, 28347, 28351, 28352, 28353, 28355, 28359, 28360, 28362, 28365, + 28366, 28367, 28395, 28397, 28398, 28409, 28411, 28413, 28420, 28424, + 28426, 28428, 28429, 28438, 28440, 28442, 28443, 28454, 28457, 28458, + 28463, 28464, 28467, 28470, 28475, 28476, 28461, 28495, 28497, 28498, + 28499, 28503, 28505, 28506, 28509, 28510, 28513, 28514, 28520, 28524, + 28541, 28542, 28547, 28551, 28552, 28555, 28556, 28557, 28560, 28562, + 28563, 28564, 28566, 28570, 28575, 28576, 28581, 28582, 28583, 28584, + 28590, 28591, 28592, 28597, 28598, 28604, 28613, 28615, 28616, 28618, + 28634, 28638, 28648, 28649, 28656, 28661, 28665, 28668, 28669, 28672, + 28677, 28678, 28679, 28685, 28695, 28704, 28707, 28719, 28724, 28727, + 28729, 28732, 28739, 28740, 28744, 28745, 28746, 28747, 28756, 28757, + 28765, 28766, 28750, 28772, 28773, 28780, 28782, 28789, 28790, 28798, + 28801, 28805, 28806, 28820, 28821, 28822, 28823, 28824, 28827, 28836, + 28843, 28848, 28849, 28852, 28855, 28874, 28881, 28883, 28884, 28885, + 28886, 28888, 28892, 28900, 28922, 28931, 28932, 28933, 28934, 28935, + 28939, 28940, 28943, 28958, 28960, 28971, 28973, 28975, 28976, 28977, + 28984, 28993, 28997, 28998, 28999, 29002, 29003, 29008, 29010, 29015, + 29018, 29020, 29022, 29024, 29032, 29049, 29056, 29061, 29063, 29068, + 29074, 29082, 29083, 29088, 29090, 29103, 29104, 29106, 29107, 29114, + 29119, 29120, 29121, 29124, 29131, 29132, 29139, 29142, 29145, 29146, + 29148, 29176, 29182, 29184, 29191, 29192, 29193, 29203, 29207, 29210, + 29213, 29215, 29220, 29227, 29231, 29236, 29240, 29241, 29249, 29250, + 29251, 29253, 29262, 29263, 29264, 29267, 29269, 29270, 29274, 29276, + 29278, 29280, 29283, 29288, 29291, 29294, 29295, 29297, 29303, 29304, + 29307, 29308, 29311, 29316, 29321, 29325, 29326, 29331, 29339, 29352, + 29357, 29358, 29361, 29364, 29374, 29377, 29383, 29385, 29388, 29397, + 29398, 29400, 29407, 29413, 29427, 29428, 29434, 29435, 29438, 29442, + 29444, 29445, 29447, 29451, 29453, 29458, 29459, 29464, 29465, 29470, + 29474, 29476, 29479, 29480, 29484, 29489, 29490, 29493, 29498, 29499, + 29501, 29507, 29517, 29520, 29522, 29526, 29528, 29533, 29534, 29535, + 29536, 29542, 29543, 29545, 29547, 29548, 29550, 29551, 29553, 29559, + 29561, 29564, 29568, 29569, 29571, 29573, 29574, 29582, 29584, 29587, + 29589, 29591, 29592, 29596, 29598, 29599, 29600, 29602, 29605, 29606, + 29610, 29611, 29613, 29621, 29623, 29625, 29628, 29629, 29631, 29637, + 29638, 29641, 29643, 29644, 29647, 29650, 29651, 29654, 29657, 29661, + 29665, 29667, 29670, 29671, 29673, 29684, 29685, 29687, 29689, 29690, + 29691, 29693, 29695, 29696, 29697, 29700, 29703, 29706, 29713, 29722, + 29723, 29732, 29734, 29736, 29737, 29738, 29739, 29740, 29741, 29742, + 29743, 29744, 29745, 29753, 29760, 29763, 29764, 29766, 29767, 29771, + 29773, 29777, 29778, 29783, 29789, 29794, 29798, 29799, 29800, 29803, + 29805, 29806, 29809, 29810, 29824, 29825, 29829, 29830, 29831, 29833, + 29839, 29840, 29841, 29842, 29848, 29849, 29850, 29852, 29855, 29856, + 29857, 29859, 29862, 29864, 29865, 29866, 29867, 29870, 29871, 29873, + 29874, 29877, 29881, 29883, 29887, 29896, 29897, 29900, 29904, 29907, + 29912, 29914, 29915, 29918, 29919, 29924, 29928, 29930, 29931, 29935, + 29940, 29946, 29947, 29948, 29951, 29958, 29970, 29974, 29975, 29984, + 29985, 29988, 29991, 29993, 29994, 29999, 30006, 30009, 30013, 30014, + 30015, 30016, 30019, 30023, 30024, 30030, 30032, 30034, 30039, 30046, + 30047, 30049, 30063, 30065, 30073, 30074, 30075, 30076, 30077, 30078, + 30081, 30085, 30096, 30098, 30099, 30101, 30105, 30108, 30114, 30116, + 30132, 30138, 30143, 30144, 30145, 30148, 30150, 30156, 30158, 30159, + 30167, 30172, 30175, 30176, 30177, 30180, 30183, 30188, 30190, 30191, + 30193, 30201, 30208, 30210, 30211, 30212, 30215, 30216, 30218, 30220, + 30223, 30226, 30227, 30229, 30230, 30233, 30235, 30236, 30237, 30238, + 30243, 30245, 30246, 30249, 30253, 30258, 30259, 30261, 30264, 30265, + 30266, 30268, 30282, 30272, 30273, 30275, 30276, 30277, 30281, 30283, + 30293, 30297, 30303, 30308, 30309, 30317, 30318, 30319, 30321, 30324, + 30337, 30341, 30348, 30349, 30357, 30363, 30364, 30365, 30367, 30368, + 30370, 30371, 30372, 30373, 30374, 30375, 30376, 30378, 30381, 30397, + 30401, 30405, 30409, 30411, 30412, 30414, 30420, 30425, 30432, 30438, + 30440, 30444, 30448, 30449, 30454, 30457, 30460, 30464, 30470, 30474, + 30478, 30482, 30484, 30485, 30487, 30489, 30490, 30492, 30498, 30504, + 30509, 30510, 30511, 30516, 30517, 30518, 30521, 30525, 30526, 30530, + 30533, 30534, 30538, 30541, 30542, 30543, 30546, 30550, 30551, 30556, + 30558, 30559, 30560, 30562, 30564, 30567, 30570, 30572, 30576, 30578, + 30579, 30580, 30586, 30589, 30592, 30596, 30604, 30605, 30612, 30613, + 30614, 30618, 30623, 30626, 30631, 30634, 30638, 30639, 30641, 30645, + 30654, 30659, 30665, 30673, 30674, 30677, 30681, 30686, 30687, 30688, + 30692, 30694, 30698, 30700, 30704, 30705, 30708, 30712, 30715, 30725, + 30726, 30729, 30733, 30734, 30737, 30749, 30753, 30754, 30755, 30765, + 30766, 30768, 30773, 30775, 30787, 30788, 30791, 30792, 30796, 30798, + 30802, 30812, 30814, 30816, 30817, 30819, 30820, 30824, 30826, 30830, + 30842, 30846, 30858, 30863, 30868, 30872, 30881, 30877, 30878, 30879, + 30884, 30888, 30892, 30893, 30896, 30897, 30898, 30899, 30907, 30909, + 30911, 30919, 30920, 30921, 30924, 30926, 30930, 30931, 30933, 30934, + 30948, 30939, 30943, 30944, 30945, 30950, 30954, 30962, 30963, 30976, + 30966, 30967, 30970, 30971, 30975, 30982, 30988, 30992, 31002, 31004, + 31006, 31007, 31008, 31013, 31015, 31017, 31021, 31025, 31028, 31029, + 31035, 31037, 31039, 31044, 31045, 31046, 31050, 31051, 31055, 31057, + 31060, 31064, 31067, 31068, 31079, 31081, 31083, 31090, 31097, 31099, + 31100, 31102, 31115, 31116, 31121, 31123, 31124, 31125, 31126, 31128, + 31131, 31132, 31137, 31144, 31145, 31147, 31151, 31153, 31156, 31160, + 31163, 31170, 31172, 31175, 31176, 31178, 31183, 31188, 31190, 31194, + 31197, 31198, 31200, 31202, 31205, 31210, 31211, 31213, 31217, 31224, + 31228, 31234, 31235, 31239, 31241, 31242, 31244, 31249, 31253, 31259, + 31262, 31265, 31271, 31275, 31277, 31279, 31280, 31284, 31285, 31288, + 31289, 31290, 31300, 31301, 31303, 31304, 31308, 31317, 31318, 31321, + 31324, 31325, 31327, 31328, 31333, 31335, 31338, 31341, 31349, 31352, + 31358, 31360, 31362, 31365, 31366, 31370, 31371, 31376, 31377, 31380, + 31390, 31392, 31395, 31404, 31411, 31413, 31417, 31419, 31420, 31430, + 31433, 31436, 31438, 31441, 31451, 31464, 31465, 31467, 31468, 31473, + 31476, 31483, 31485, 31486, 31495, 31508, 31519, 31523, 31527, 31529, + 31530, 31531, 31533, 31534, 31535, 31536, 31537, 31540, 31549, 31551, + 31552, 31553, 31559, 31566, 31573, 31584, 31588, 31590, 31593, 31594, + 31597, 31599, 31602, 31603, 31607, 31620, 31625, 31630, 31632, 31633, + 31638, 31643, 31646, 31648, 31653, 31660, 31663, 31664, 31666, 31669, + 31670, 31674, 31675, 31676, 31677, 31682, 31685, 31688, 31690, 31700, + 31702, 31703, 31705, 31706, 31707, 31720, 31722, 31730, 31732, 31733, + 31736, 31737, 31738, 31740, 31742, 31745, 31746, 31747, 31748, 31750, + 31753, 31755, 31756, 31758, 31759, 31769, 31771, 31776, 31781, 31782, + 31784, 31788, 31793, 31795, 31796, 31798, 31801, 31802, 31814, 31818, + 31829, 31825, 31826, 31827, 31833, 31834, 31835, 31836, 31837, 31838, + 31841, 31843, 31847, 31849, 31853, 31854, 31856, 31858, 31865, 31868, + 31869, 31878, 31879, 31887, 31892, 31902, 31904, 31910, 31920, 31926, + 31927, 31930, 31931, 31932, 31935, 31940, 31943, 31944, 31945, 31949, + 31951, 31955, 31956, 31957, 31959, 31961, 31962, 31965, 31974, 31977, + 31979, 31989, 32003, 32007, 32008, 32009, 32015, 32017, 32018, 32019, + 32022, 32029, 32030, 32035, 32038, 32042, 32045, 32049, 32060, 32061, + 32062, 32064, 32065, 32071, 32072, 32077, 32081, 32083, 32087, 32089, + 32090, 32092, 32093, 32101, 32103, 32106, 32112, 32120, 32122, 32123, + 32127, 32129, 32130, 32131, 32133, 32134, 32136, 32139, 32140, 32141, + 32145, 32150, 32151, 32157, 32158, 32166, 32167, 32170, 32179, 32182, + 32183, 32185, 32194, 32195, 32196, 32197, 32198, 32204, 32205, 32206, + 32215, 32217, 32256, 32226, 32229, 32230, 32234, 32235, 32237, 32241, + 32245, 32246, 32249, 32250, 32264, 32272, 32273, 32277, 32279, 32284, + 32285, 32288, 32295, 32296, 32300, 32301, 32303, 32307, 32310, 32319, + 32324, 32325, 32327, 32334, 32336, 32338, 32344, 32351, 32353, 32354, + 32357, 32363, 32366, 32367, 32371, 32376, 32382, 32385, 32390, 32391, + 32394, 32397, 32401, 32405, 32408, 32410, 32413, 32414, 32572, 32571, + 32573, 32574, 32575, 32579, 32580, 32583, 32591, 32594, 32595, 32603, + 32604, 32605, 32609, 32611, 32612, 32613, 32614, 32621, 32625, 32637, + 32638, 32639, 32640, 32651, 32653, 32655, 32656, 32657, 32662, 32663, + 32668, 32673, 32674, 32678, 32682, 32685, 32692, 32700, 32703, 32704, + 32707, 32712, 32718, 32719, 32731, 32735, 32739, 32741, 32744, 32748, + 32750, 32751, 32754, 32762, 32765, 32766, 32767, 32775, 32776, 32778, + 32781, 32782, 32783, 32785, 32787, 32788, 32790, 32797, 32798, 32799, + 32800, 32804, 32806, 32812, 32814, 32816, 32820, 32821, 32823, 32825, + 32826, 32828, 32830, 32832, 32836, 32864, 32868, 32870, 32877, 32881, + 32885, 32897, 32904, 32910, 32924, 32926, 32934, 32935, 32939, 32952, + 32953, 32968, 32973, 32975, 32978, 32980, 32981, 32983, 32984, 32992, + 33005, 33006, 33008, 33010, 33011, 33014, 33017, 33018, 33022, 33027, + 33035, 33046, 33047, 33048, 33052, 33054, 33056, 33060, 33063, 33068, + 33072, 33077, 33082, 33084, 33093, 33095, 33098, 33100, 33106, 33111, + 33120, 33121, 33127, 33128, 33129, 33133, 33135, 33143, 33153, 33168, + 33156, 33157, 33158, 33163, 33166, 33174, 33176, 33179, 33182, 33186, + 33198, 33202, 33204, 33211, 33227, 33219, 33221, 33226, 33230, 33231, + 33237, 33239, 33243, 33245, 33246, 33249, 33252, 33259, 33260, 33264, + 33265, 33266, 33269, 33270, 33272, 33273, 33277, 33279, 33280, 33283, + 33295, 33299, 33300, 33305, 33306, 33309, 33313, 33314, 33320, 33330, + 33332, 33338, 33347, 33348, 33349, 33350, 33355, 33358, 33359, 33361, + 33366, 33372, 33376, 33379, 33383, 33389, 33396, 33403, 33405, 33407, + 33408, 33409, 33411, 33412, 33415, 33417, 33418, 33422, 33425, 33428, + 33430, 33432, 33434, 33435, 33440, 33441, 33443, 33444, 33447, 33448, + 33449, 33450, 33454, 33456, 33458, 33460, 33463, 33466, 33468, 33470, + 33471, 33478, 33488, 33493, 33498, 33504, 33506, 33508, 33512, 33514, + 33517, 33519, 33526, 33527, 33533, 33534, 33536, 33537, 33543, 33544, + 33546, 33547, 33620, 33563, 33565, 33566, 33567, 33569, 33570, 33580, + 33581, 33582, 33584, 33587, 33591, 33594, 33596, 33597, 33602, 33603, + 33604, 33607, 33613, 33614, 33617, 33621, 33622, 33623, 33648, 33656, + 33661, 33663, 33664, 33666, 33668, 33670, 33677, 33682, 33684, 33685, + 33688, 33689, 33691, 33692, 33693, 33702, 33703, 33705, 33708, 33726, + 33727, 33728, 33735, 33737, 33743, 33744, 33745, 33748, 33757, 33619, + 33768, 33770, 33782, 33784, 33785, 33788, 33793, 33798, 33802, 33807, + 33809, 33813, 33817, 33709, 33839, 33849, 33861, 33863, 33864, 33866, + 33869, 33871, 33873, 33874, 33878, 33880, 33881, 33882, 33884, 33888, + 33892, 33893, 33895, 33898, 33904, 33907, 33908, 33910, 33912, 33916, + 33917, 33921, 33925, 33938, 33939, 33941, 33950, 33958, 33960, 33961, + 33962, 33967, 33969, 33972, 33978, 33981, 33982, 33984, 33986, 33991, + 33992, 33996, 33999, 34003, 34012, 34023, 34026, 34031, 34032, 34033, + 34034, 34039, 34098, 34042, 34043, 34045, 34050, 34051, 34055, 34060, + 34062, 34064, 34076, 34078, 34082, 34083, 34084, 34085, 34087, 34090, + 34091, 34095, 34099, 34100, 34102, 34111, 34118, 34127, 34128, 34129, + 34130, 34131, 34134, 34137, 34140, 34141, 34142, 34143, 34144, 34145, + 34146, 34148, 34155, 34159, 34169, 34170, 34171, 34173, 34175, 34177, + 34181, 34182, 34185, 34187, 34188, 34191, 34195, 34200, 34205, 34207, + 34208, 34210, 34213, 34215, 34228, 34230, 34231, 34232, 34236, 34237, + 34238, 34239, 34242, 34247, 34250, 34251, 34254, 34221, 34264, 34266, + 34271, 34272, 34278, 34280, 34285, 34291, 34294, 34300, 34303, 34304, + 34308, 34309, 34317, 34318, 34320, 34321, 34322, 34328, 34329, 34331, + 34334, 34337, 34343, 34345, 34358, 34360, 34362, 34364, 34365, 34368, + 34370, 34374, 34386, 34387, 34390, 34391, 34392, 34393, 34397, 34400, + 34401, 34402, 34403, 34404, 34409, 34412, 34415, 34421, 34422, 34423, + 34426, 34445, 34449, 34454, 34456, 34458, 34460, 34465, 34470, 34471, + 34472, 34477, 34481, 34483, 34484, 34485, 34487, 34488, 34489, 34495, + 34496, 34497, 34499, 34501, 34513, 34514, 34517, 34519, 34522, 34524, + 34528, 34531, 34533, 34535, 34440, 34554, 34556, 34557, 34564, 34565, + 34567, 34571, 34574, 34575, 34576, 34579, 34580, 34585, 34590, 34591, + 34593, 34595, 34600, 34606, 34607, 34609, 34610, 34617, 34618, 34620, + 34621, 34622, 34624, 34627, 34629, 34637, 34648, 34653, 34657, 34660, + 34661, 34671, 34673, 34674, 34683, 34691, 34692, 34693, 34694, 34695, + 34696, 34697, 34699, 34700, 34704, 34707, 34709, 34711, 34712, 34713, + 34718, 34720, 34723, 34727, 34732, 34733, 34734, 34737, 34741, 34750, + 34751, 34753, 34760, 34761, 34762, 34766, 34773, 34774, 34777, 34778, + 34780, 34783, 34786, 34787, 34788, 34794, 34795, 34797, 34801, 34803, + 34808, 34810, 34815, 34817, 34819, 34822, 34825, 34826, 34827, 34832, + 34841, 34834, 34835, 34836, 34840, 34842, 34843, 34844, 34846, 34847, + 34856, 34861, 34862, 34864, 34866, 34869, 34874, 34876, 34881, 34883, + 34885, 34888, 34889, 34890, 34891, 34894, 34897, 34901, 34902, 34904, + 34906, 34908, 34911, 34912, 34916, 34921, 34929, 34937, 34939, 34944, + 34968, 34970, 34971, 34972, 34975, 34976, 34984, 34986, 35002, 35005, + 35006, 35008, 35018, 35019, 35020, 35021, 35022, 35025, 35026, 35027, + 35035, 35038, 35047, 35055, 35056, 35057, 35061, 35063, 35073, 35078, + 35085, 35086, 35087, 35093, 35094, 35096, 35097, 35098, 35100, 35104, + 35110, 35111, 35112, 35120, 35121, 35122, 35125, 35129, 35130, 35134, + 35136, 35138, 35141, 35142, 35145, 35151, 35154, 35159, 35162, 35163, + 35164, 35169, 35170, 35171, 35179, 35182, 35184, 35187, 35189, 35194, + 35195, 35196, 35197, 35209, 35213, 35216, 35220, 35221, 35227, 35228, + 35231, 35232, 35237, 35248, 35252, 35253, 35254, 35255, 35260, 35284, + 35285, 35286, 35287, 35288, 35301, 35305, 35307, 35309, 35313, 35315, + 35318, 35321, 35325, 35327, 35332, 35333, 35335, 35343, 35345, 35346, + 35348, 35349, 35358, 35360, 35362, 35364, 35366, 35371, 35372, 35375, + 35381, 35383, 35389, 35390, 35392, 35395, 35397, 35399, 35401, 35405, + 35406, 35411, 35414, 35415, 35416, 35420, 35421, 35425, 35429, 35431, + 35445, 35446, 35447, 35449, 35450, 35451, 35454, 35455, 35456, 35459, + 35462, 35467, 35471, 35472, 35474, 35478, 35479, 35481, 35487, 35495, + 35497, 35502, 35503, 35507, 35510, 35511, 35515, 35518, 35523, 35526, + 35528, 35529, 35530, 35537, 35539, 35540, 35541, 35543, 35549, 35551, + 35564, 35568, 35572, 35573, 35574, 35580, 35583, 35589, 35590, 35595, + 35601, 35612, 35614, 35615, 35594, 35629, 35632, 35639, 35644, 35650, + 35651, 35652, 35653, 35654, 35656, 35666, 35667, 35668, 35673, 35661, + 35678, 35683, 35693, 35702, 35704, 35705, 35708, 35710, 35713, 35716, + 35717, 35723, 35725, 35727, 35732, 35733, 35740, 35742, 35743, 35896, + 35897, 35901, 35902, 35909, 35911, 35913, 35915, 35919, 35921, 35923, + 35924, 35927, 35928, 35931, 35933, 35929, 35939, 35940, 35942, 35944, + 35945, 35949, 35955, 35957, 35958, 35963, 35966, 35974, 35975, 35979, + 35984, 35986, 35987, 35993, 35995, 35996, 36004, 36025, 36026, 36037, + 36038, 36041, 36043, 36047, 36054, 36053, 36057, 36061, 36065, 36072, + 36076, 36079, 36080, 36082, 36085, 36087, 36088, 36094, 36095, 36097, + 36099, 36105, 36114, 36119, 36123, 36197, 36201, 36204, 36206, 36223, + 36226, 36228, 36232, 36237, 36240, 36241, 36245, 36254, 36255, 36256, + 36262, 36267, 36268, 36271, 36274, 36277, 36279, 36281, 36283, 36288, + 36293, 36294, 36295, 36296, 36298, 36302, 36305, 36308, 36309, 36311, + 36313, 36324, 36325, 36327, 36332, 36336, 36284, 36337, 36338, 36340, + 36349, 36353, 36356, 36357, 36358, 36363, 36369, 36372, 36374, 36384, + 36385, 36386, 36387, 36390, 36391, 36401, 36403, 36406, 36407, 36408, + 36409, 36413, 36416, 36417, 36427, 36429, 36430, 36431, 36436, 36443, + 36444, 36445, 36446, 36449, 36450, 36457, 36460, 36461, 36463, 36464, + 36465, 36473, 36474, 36475, 36482, 36483, 36489, 36496, 36498, 36501, + 36506, 36507, 36509, 36510, 36514, 36519, 36521, 36525, 36526, 36531, + 36533, 36538, 36539, 36544, 36545, 36547, 36548, 36551, 36559, 36561, + 36564, 36572, 36584, 36590, 36592, 36593, 36599, 36601, 36602, 36589, + 36608, 36610, 36615, 36616, 36623, 36624, 36630, 36631, 36632, 36638, + 36640, 36641, 36643, 36645, 36647, 36648, 36652, 36653, 36654, 36660, + 36661, 36662, 36663, 36666, 36672, 36673, 36675, 36679, 36687, 36689, + 36690, 36691, 36692, 36693, 36696, 36701, 36702, 36709, 36765, 36768, + 36769, 36772, 36773, 36774, 36789, 36790, 36792, 36798, 36800, 36801, + 36806, 36810, 36811, 36813, 36816, 36818, 36819, 36821, 36832, 36835, + 36836, 36840, 36846, 36849, 36853, 36854, 36859, 36862, 36866, 36868, + 36872, 36876, 36888, 36891, 36904, 36905, 36911, 36906, 36908, 36909, + 36915, 36916, 36919, 36927, 36931, 36932, 36940, 36955, 36957, 36962, + 36966, 36967, 36972, 36976, 36980, 36985, 36997, 37000, 37003, 37004, + 37006, 37008, 37013, 37015, 37016, 37017, 37019, 37024, 37025, 37026, + 37029, 37040, 37042, 37043, 37044, 37046, 37053, 37068, 37054, 37059, + 37060, 37061, 37063, 37064, 37077, 37079, 37080, 37081, 37084, 37085, + 37087, 37093, 37074, 37110, 37099, 37103, 37104, 37108, 37118, 37119, + 37120, 37124, 37125, 37126, 37128, 37133, 37136, 37140, 37142, 37143, + 37144, 37146, 37148, 37150, 37152, 37157, 37154, 37155, 37159, 37161, + 37166, 37167, 37169, 37172, 37174, 37175, 37177, 37178, 37180, 37181, + 37187, 37191, 37192, 37199, 37203, 37207, 37209, 37210, 37211, 37217, + 37220, 37223, 37229, 37236, 37241, 37242, 37243, 37249, 37251, 37253, + 37254, 37258, 37262, 37265, 37267, 37268, 37269, 37272, 37278, 37281, + 37286, 37288, 37292, 37293, 37294, 37296, 37297, 37298, 37299, 37302, + 37307, 37308, 37309, 37311, 37314, 37315, 37317, 37331, 37332, 37335, + 37337, 37338, 37342, 37348, 37349, 37353, 37354, 37356, 37357, 37358, + 37359, 37360, 37361, 37367, 37369, 37371, 37373, 37376, 37377, 37380, + 37381, 37382, 37383, 37385, 37386, 37388, 37392, 37394, 37395, 37398, + 37400, 37404, 37405, 37411, 37412, 37413, 37414, 37416, 37422, 37423, + 37424, 37427, 37429, 37430, 37432, 37433, 37434, 37436, 37438, 37440, + 37442, 37443, 37446, 37447, 37450, 37453, 37454, 37455, 37457, 37464, + 37465, 37468, 37469, 37472, 37473, 37477, 37479, 37480, 37481, 37486, + 37487, 37488, 37493, 37494, 37495, 37496, 37497, 37499, 37500, 37501, + 37503, 37512, 37513, 37514, 37517, 37518, 37522, 37527, 37529, 37535, + 37536, 37540, 37541, 37543, 37544, 37547, 37551, 37554, 37558, 37560, + 37562, 37563, 37564, 37565, 37567, 37568, 37569, 37570, 37571, 37573, + 37574, 37575, 37576, 37579, 37580, 37581, 37582, 37584, 37587, 37589, + 37591, 37592, 37593, 37596, 37597, 37599, 37600, 37601, 37603, 37605, + 37607, 37608, 37612, 37614, 37616, 37625, 37627, 37631, 37632, 37634, + 37640, 37645, 37649, 37652, 37653, 37660, 37661, 37662, 37663, 37665, + 37668, 37669, 37671, 37673, 37674, 37683, 37684, 37686, 37687, 37703, + 37704, 37705, 37712, 37713, 37714, 37717, 37719, 37720, 37722, 37726, + 37732, 37733, 37735, 37737, 37738, 37741, 37743, 37744, 37745, 37747, + 37748, 37750, 37754, 37757, 37759, 37760, 37761, 37762, 37768, 37770, + 37771, 37773, 37775, 37778, 37781, 37784, 37787, 37790, 37793, 37795, + 37796, 37798, 37800, 37803, 37812, 37813, 37814, 37818, 37801, 37825, + 37828, 37829, 37830, 37831, 37833, 37834, 37835, 37836, 37837, 37843, + 37849, 37852, 37854, 37855, 37858, 37862, 37863, 37881, 37879, 37880, + 37882, 37883, 37885, 37889, 37890, 37892, 37896, 37897, 37901, 37902, + 37903, 37909, 37910, 37911, 37919, 37934, 37935, 37937, 37938, 37939, + 37940, 37947, 37951, 37949, 37955, 37957, 37960, 37962, 37964, 37973, + 37977, 37980, 37983, 37985, 37987, 37992, 37995, 37997, 37998, 37999, + 38001, 38002, 38020, 38019, 38264, 38265, 38270, 38276, 38280, 38284, + 38285, 38286, 38301, 38302, 38303, 38305, 38310, 38313, 38315, 38316, + 38324, 38326, 38330, 38333, 38335, 38342, 38344, 38345, 38347, 38352, + 38353, 38354, 38355, 38361, 38362, 38365, 38366, 38367, 38368, 38372, + 38374, 38429, 38430, 38434, 38436, 38437, 38438, 38444, 38449, 38451, + 38455, 38456, 38457, 38458, 38460, 38461, 38465, 38482, 38484, 38486, + 38487, 38488, 38497, 38510, 38516, 38523, 38524, 38526, 38527, 38529, + 38530, 38531, 38532, 38537, 38545, 38550, 38554, 38557, 38559, 38564, + 38565, 38566, 38569, 38574, 38575, 38579, 38586, 38602, 38610, 23986, + 38616, 38618, 38621, 38622, 38623, 38633, 38639, 38641, 38650, 38658, + 38659, 38661, 38665, 38682, 38683, 38685, 38689, 38690, 38691, 38696, + 38705, 38707, 38721, 38723, 38730, 38734, 38735, 38741, 38743, 38744, + 38746, 38747, 38755, 38759, 38762, 38766, 38771, 38774, 38775, 38776, + 38779, 38781, 38783, 38784, 38793, 38805, 38806, 38807, 38809, 38810, + 38814, 38815, 38818, 38828, 38830, 38833, 38834, 38837, 38838, 38840, + 38841, 38842, 38844, 38846, 38847, 38849, 38852, 38853, 38855, 38857, + 38858, 38860, 38861, 38862, 38864, 38865, 38868, 38871, 38872, 38873, + 38877, 38878, 38880, 38875, 38881, 38884, 38895, 38897, 38900, 38903, + 38904, 38906, 38919, 38922, 38937, 38925, 38926, 38932, 38934, 38940, + 38942, 38944, 38947, 38950, 38955, 38958, 38959, 38960, 38962, 38963, + 38965, 38949, 38974, 38980, 38983, 38986, 38993, 38994, 38995, 38998, + 38999, 39001, 39002, 39010, 39011, 39013, 39014, 39018, 39020, 39083, + 39085, 39086, 39088, 39092, 39095, 39096, 39098, 39099, 39103, 39106, + 39109, 39112, 39116, 39137, 39139, 39141, 39142, 39143, 39146, 39155, + 39158, 39170, 39175, 39176, 39185, 39189, 39190, 39191, 39194, 39195, + 39196, 39199, 39202, 39206, 39207, 39211, 39217, 39218, 39219, 39220, + 39221, 39225, 39226, 39227, 39228, 39232, 39233, 39238, 39239, 39240, + 39245, 39246, 39252, 39256, 39257, 39259, 39260, 39262, 39263, 39264, + 39323, 39325, 39327, 39334, 39344, 39345, 39346, 39349, 39353, 39354, + 39357, 39359, 39363, 39369, 39379, 39380, 39385, 39386, 39388, 39390, + 39399, 39402, 39403, 39404, 39408, 39412, 39413, 39417, 39421, 39422, + 39426, 39427, 39428, 39435, 39436, 39440, 39441, 39446, 39454, 39456, + 39458, 39459, 39460, 39463, 39469, 39470, 39475, 39477, 39478, 39480, + 39495, 39489, 39492, 39498, 39499, 39500, 39502, 39505, 39508, 39510, + 39517, 39594, 39596, 39598, 39599, 39602, 39604, 39605, 39606, 39609, + 39611, 39614, 39615, 39617, 39619, 39622, 39624, 39630, 39632, 39634, + 39637, 39638, 39639, 39643, 39644, 39648, 39652, 39653, 39655, 39657, + 39660, 39666, 39667, 39669, 39673, 39674, 39677, 39679, 39680, 39681, + 39682, 39683, 39684, 39685, 39688, 39689, 39691, 39692, 39693, 39694, + 39696, 39698, 39702, 39705, 39707, 39708, 39712, 39718, 39723, 39725, + 39731, 39732, 39733, 39735, 39737, 39738, 39741, 39752, 39755, 39756, + 39765, 39766, 39767, 39771, 39774, 39777, 39779, 39781, 39782, 39784, + 39786, 39787, 39788, 39789, 39790, 39795, 39797, 39799, 39800, 39801, + 39807, 39808, 39812, 39813, 39814, 39815, 39817, 39818, 39819, 39821, + 39823, 39824, 39828, 39834, 39837, 39838, 39846, 39847, 39849, 39852, + 39856, 39857, 39858, 39863, 39864, 39867, 39868, 39870, 39871, 39873, + 39879, 39880, 39886, 39888, 39895, 39896, 39901, 39903, 39909, 39911, + 39914, 39915, 39919, 39923, 39927, 39928, 39929, 39930, 39933, 39935, + 39936, 39938, 39947, 39951, 39953, 39958, 39960, 39961, 39962, 39964, + 39966, 39970, 39971, 39974, 39975, 39976, 39977, 39978, 39985, 39989, + 39990, 39991, 39997, 40001, 40003, 40004, 40005, 40009, 40010, 40014, + 40015, 40016, 40019, 40020, 40022, 40024, 40027, 40029, 40030, 40031, + 40035, 40041, 40042, 40028, 40043, 40040, 40046, 40048, 40050, 40053, + 40055, 40059, 40166, 40178, 40183, 40185, 40203, 40194, 40209, 40215, + 40216, 40220, 40221, 40222, 40239, 40240, 40242, 40243, 40244, 40250, + 40252, 40261, 40253, 40258, 40259, 40263, 40266, 40275, 40276, 40287, + 40291, 40290, 40293, 40297, 40298, 40299, 40304, 40310, 40311, 40315, + 40316, 40318, 40323, 40324, 40326, 40330, 40333, 40334, 40338, 40339, + 40341, 40342, 40343, 40344, 40353, 40362, 40364, 40366, 40369, 40373, + 40377, 40380, 40383, 40387, 40391, 40393, 40394, 40404, 40405, 40406, + 40407, 40410, 40414, 40415, 40416, 40421, 40423, 40425, 40427, 40430, + 40432, 40435, 40436, 40446, 40458, 40450, 40455, 40462, 40464, 40465, + 40466, 40469, 40470, 40473, 40476, 40477, 40570, 40571, 40572, 40576, + 40578, 40579, 40580, 40581, 40583, 40590, 40591, 40598, 40600, 40603, + 40606, 40612, 40616, 40620, 40622, 40623, 40624, 40627, 40628, 40629, + 40646, 40648, 40651, 40661, 40671, 40676, 40679, 40684, 40685, 40686, + 40688, 40689, 40690, 40693, 40696, 40703, 40706, 40707, 40713, 40719, + 40720, 40721, 40722, 40724, 40726, 40727, 40729, 40730, 40731, 40735, + 40738, 40742, 40746, 40747, 40751, 40753, 40754, 40756, 40759, 40761, + 40762, 40764, 40765, 40767, 40769, 40771, 40772, 40773, 40774, 40775, + 40787, 40789, 40790, 40791, 40792, 40794, 40797, 40798, 40808, 40809, + 40813, 40814, 40815, 40816, 40817, 40819, 40821, 40826, 40829, 40847, + 40848, 40849, 40850, 40852, 40854, 40855, 40862, 40865, 40866, 40867, + 40869, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myencoding_map_koi8_r[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 9555, 9556, 9557, 9558, + 9559, 9560, 9561, 9562, 9563, 9564, 9565, 9566, 9567, 9568, + 9569, 1025, 9570, 9571, 9572, 9573, 9574, 9575, 9576, 9577, + 9578, 9579, 9580, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myencoding_map_koi8_u[] = { + 9472, 9474, 9484, 9488, 9492, 9496, 9500, 9508, 9516, 9524, + 9532, 9600, 9604, 9608, 9612, 9616, 9617, 9618, 9619, 8992, + 9632, 8729, 8730, 8776, 8804, 8805, 160, 8993, 176, 178, + 183, 247, 9552, 9553, 9554, 1105, 1108, 9556, 1110, 1111, + 9559, 9560, 9561, 9562, 9563, 1169, 1118, 9566, 9567, 9568, + 9569, 1025, 1028, 9571, 1030, 1031, 9574, 9575, 9576, 9577, + 9578, 1168, 1038, 169, 1102, 1072, 1073, 1094, 1076, 1077, + 1092, 1075, 1093, 1080, 1081, 1082, 1083, 1084, 1085, 1086, + 1087, 1103, 1088, 1089, 1090, 1091, 1078, 1074, 1100, 1099, + 1079, 1096, 1101, 1097, 1095, 1098, 1070, 1040, 1041, 1062, + 1044, 1045, 1060, 1043, 1061, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1071, 1056, 1057, 1058, 1059, 1046, 1042, + 1068, 1067, 1047, 1064, 1069, 1065, 1063, 1066, +}; + +static const unsigned long myencoding_map_macintosh[] = { + 196, 197, 199, 201, 209, 214, 220, 225, 224, 226, + 228, 227, 229, 231, 233, 232, 234, 235, 237, 236, + 238, 239, 241, 243, 242, 244, 246, 245, 250, 249, + 251, 252, 8224, 176, 162, 163, 167, 8226, 182, 223, + 174, 169, 8482, 180, 168, 8800, 198, 216, 8734, 177, + 8804, 8805, 165, 181, 8706, 8721, 8719, 960, 8747, 170, + 186, 937, 230, 248, 191, 161, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 192, 195, 213, 338, 339, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 9674, 255, 376, + 8260, 8364, 8249, 8250, 64257, 64258, 8225, 183, 8218, 8222, + 8240, 194, 202, 193, 203, 200, 205, 206, 207, 204, + 211, 212, 63743, 210, 218, 219, 217, 305, 710, 732, + 175, 728, 729, 730, 184, 733, 731, 711, +}; + +static const unsigned long myencoding_map_windows_1250[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 352, 8249, 346, 356, 381, 377, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 353, 8250, 347, 357, + 382, 378, 160, 711, 728, 321, 164, 260, 166, 167, + 168, 169, 350, 171, 172, 173, 174, 379, 176, 177, + 731, 322, 180, 181, 182, 183, 184, 261, 351, 187, + 317, 733, 318, 380, 340, 193, 194, 258, 196, 313, + 262, 199, 268, 201, 280, 203, 282, 205, 206, 270, + 272, 323, 327, 211, 212, 336, 214, 215, 344, 366, + 218, 368, 220, 221, 354, 223, 341, 225, 226, 259, + 228, 314, 263, 231, 269, 233, 281, 235, 283, 237, + 238, 271, 273, 324, 328, 243, 244, 337, 246, 247, + 345, 367, 250, 369, 252, 253, 355, 729, +}; + +static const unsigned long myencoding_map_windows_1251[] = { + 1026, 1027, 8218, 1107, 8222, 8230, 8224, 8225, 8364, 8240, + 1033, 8249, 1034, 1036, 1035, 1039, 1106, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 1113, 8250, 1114, 1116, + 1115, 1119, 160, 1038, 1118, 1032, 164, 1168, 166, 167, + 1025, 169, 1028, 171, 172, 173, 174, 1031, 176, 177, + 1030, 1110, 1169, 181, 182, 183, 1105, 8470, 1108, 187, + 1112, 1029, 1109, 1111, 1040, 1041, 1042, 1043, 1044, 1045, + 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, 1054, 1055, + 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, 1064, 1065, + 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, +}; + +static const unsigned long myencoding_map_windows_1252[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 381, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 382, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static const unsigned long myencoding_map_windows_1253[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 157, + 158, 159, 160, 901, 902, 163, 164, 165, 166, 167, + 168, 169, 0x0000, 171, 172, 173, 174, 8213, 176, 177, + 178, 179, 900, 181, 182, 183, 904, 905, 906, 187, + 908, 189, 910, 911, 912, 913, 914, 915, 916, 917, + 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, + 928, 929, 0x0000, 931, 932, 933, 934, 935, 936, 937, + 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, + 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, + 968, 969, 970, 971, 972, 973, 974, 0x0000, +}; + +static const unsigned long myencoding_map_windows_1254[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 352, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 286, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 304, 350, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 287, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 305, 351, 255, +}; + +static const unsigned long myencoding_map_windows_1255[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 156, 157, + 158, 159, 160, 161, 162, 163, 8362, 165, 166, 167, + 168, 169, 215, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 247, 187, + 188, 189, 190, 191, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1465, 0x0000, 1467, 1468, 1469, 1470, 1471, + 1472, 1473, 1474, 1475, 1520, 1521, 1522, 1523, 1524, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 0x0000, 0x0000, 8206, 8207, 0x0000, +}; + +static const unsigned long myencoding_map_windows_1256[] = { + 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, + 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, + 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, + 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, + 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, + 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, + 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, + 1617, 249, 1618, 251, 252, 8206, 8207, 1746, +}; + +static const unsigned long myencoding_map_windows_1257[] = { + 8364, 129, 8218, 131, 8222, 8230, 8224, 8225, 136, 8240, + 138, 8249, 140, 168, 711, 184, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 8482, 154, 8250, 156, 175, + 731, 159, 160, 0x0000, 162, 163, 164, 0x0000, 166, 167, + 216, 169, 342, 171, 172, 173, 174, 198, 176, 177, + 178, 179, 180, 181, 182, 183, 248, 185, 343, 187, + 188, 189, 190, 230, 260, 302, 256, 262, 196, 197, + 280, 274, 268, 201, 377, 278, 290, 310, 298, 315, + 352, 323, 325, 211, 332, 213, 214, 215, 370, 321, + 346, 362, 220, 379, 381, 223, 261, 303, 257, 263, + 228, 229, 281, 275, 269, 233, 378, 279, 291, 311, + 299, 316, 353, 324, 326, 243, 333, 245, 246, 247, + 371, 322, 347, 363, 252, 380, 382, 729, +}; + +static const unsigned long myencoding_map_windows_1258[] = { + 8364, 129, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, + 138, 8249, 338, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 732, 8482, 154, 8250, 339, 157, + 158, 376, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 258, 196, 197, + 198, 199, 200, 201, 202, 203, 768, 205, 206, 207, + 272, 209, 777, 211, 212, 416, 214, 215, 216, 217, + 218, 219, 220, 431, 771, 223, 224, 225, 226, 259, + 228, 229, 230, 231, 232, 233, 234, 235, 769, 237, + 238, 239, 273, 241, 803, 243, 244, 417, 246, 247, + 248, 249, 250, 251, 252, 432, 8363, 255, +}; + +static const unsigned long myencoding_map_windows_874[] = { + 8364, 129, 130, 131, 132, 8230, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 8216, 8217, 8220, + 8221, 8226, 8211, 8212, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 3585, 3586, 3587, 3588, 3589, 3590, 3591, + 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, 3611, + 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, + 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, + 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, + 3642, 0x0000, 0x0000, 0x0000, 0x0000, 3647, 3648, 3649, 3650, 3651, + 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660, 3661, + 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, + 3672, 3673, 3674, 3675, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +static const unsigned long myencoding_map_x_mac_cyrillic[] = { + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 8224, 176, 1168, 163, 167, 8226, 182, 1030, + 174, 169, 8482, 1026, 1106, 8800, 1027, 1107, 8734, 177, + 8804, 8805, 1110, 181, 1169, 1032, 1028, 1108, 1031, 1111, + 1033, 1113, 1034, 1114, 1112, 1029, 172, 8730, 402, 8776, + 8710, 171, 187, 8230, 160, 1035, 1115, 1036, 1116, 1109, + 8211, 8212, 8220, 8221, 8216, 8217, 247, 8222, 1038, 1118, + 1039, 1119, 8470, 1025, 1105, 1103, 1072, 1073, 1074, 1075, + 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, + 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1094, 1095, + 1096, 1097, 1098, 1099, 1100, 1101, 1102, 8364, +}; + +//static const myencoding_custom_f myencoding_function_index[] = { +// myencoding_decode_utf_8, NULL, NULL, myencoding_decode_utf_8, myencoding_decode_utf_16le, +// myencoding_decode_utf_16be, myencoding_decode_x_user_defined, +// myencoding_decode_big5, myencoding_decode_euc_kr, myencoding_decode_gb18030, +// myencoding_decode_ibm866, myencoding_decode_iso_8859_10, myencoding_decode_iso_8859_13, +// myencoding_decode_iso_8859_14, myencoding_decode_iso_8859_15, myencoding_decode_iso_8859_16, +// myencoding_decode_iso_8859_2, myencoding_decode_iso_8859_3, myencoding_decode_iso_8859_4, +// myencoding_decode_iso_8859_5, myencoding_decode_iso_8859_6, myencoding_decode_iso_8859_7, +// myencoding_decode_iso_8859_8, myencoding_decode_koi8_r, myencoding_decode_koi8_u, +// myencoding_decode_macintosh, myencoding_decode_windows_1250, myencoding_decode_windows_1251, +// myencoding_decode_windows_1252, myencoding_decode_windows_1253, myencoding_decode_windows_1254, +// myencoding_decode_windows_1255, myencoding_decode_windows_1256, myencoding_decode_windows_1257, +// myencoding_decode_windows_1258, myencoding_decode_windows_874, myencoding_decode_x_mac_cyrillic, +// myencoding_decode_iso_2022_jp, myencoding_decode_gbk, myencoding_decode_shift_jis, +// myencoding_decode_euc_jp, myencoding_decode_iso_8859_8_i +//}; + +static const myencoding_custom_f myencoding_function_index[] = +{ + myencoding_decode_utf_8, // MyENCODING_DEFAULT + NULL, + NULL, + myencoding_decode_utf_8, // MyENCODING_UTF_8 + myencoding_decode_utf_16le, // MyENCODING_UTF_16LE + myencoding_decode_utf_16be, // MyENCODING_UTF_16BE + myencoding_decode_x_user_defined, // MyENCODING_X_USER_DEFINED + myencoding_decode_big5, // MyENCODING_BIG5 + myencoding_decode_euc_jp, // MyENCODING_EUC_JP + myencoding_decode_euc_kr, // MyENCODING_EUC_KR + myencoding_decode_gb18030, // MyENCODING_GB18030 + myencoding_decode_gbk, // MyENCODING_GBK + myencoding_decode_ibm866, // MyENCODING_IBM866 + myencoding_decode_iso_2022_jp, // MyENCODING_ISO_2022_JP + myencoding_decode_iso_8859_10, // MyENCODING_ISO_8859_10 + myencoding_decode_iso_8859_13, // MyENCODING_ISO_8859_13 + myencoding_decode_iso_8859_14, // MyENCODING_ISO_8859_14 + myencoding_decode_iso_8859_15, // MyENCODING_ISO_8859_15 + myencoding_decode_iso_8859_16, // MyENCODING_ISO_8859_16 + myencoding_decode_iso_8859_2, // MyENCODING_ISO_8859_2 + myencoding_decode_iso_8859_3, // MyENCODING_ISO_8859_3 + myencoding_decode_iso_8859_4, // MyENCODING_ISO_8859_4 + myencoding_decode_iso_8859_5, // MyENCODING_ISO_8859_5 + myencoding_decode_iso_8859_6, // MyENCODING_ISO_8859_6 + myencoding_decode_iso_8859_7, // MyENCODING_ISO_8859_7 + myencoding_decode_iso_8859_8, // MyENCODING_ISO_8859_8 + myencoding_decode_iso_8859_8_i, // MyENCODING_ISO_8859_8_I + myencoding_decode_koi8_r, // MyENCODING_KOI8_R + myencoding_decode_koi8_u, // MyENCODING_KOI8_U + myencoding_decode_macintosh, // MyENCODING_MACINTOSH + myencoding_decode_shift_jis, // MyENCODING_SHIFT_JIS + myencoding_decode_windows_1250, // MyENCODING_WINDOWS_1250 + myencoding_decode_windows_1251, // MyENCODING_WINDOWS_1251 + myencoding_decode_windows_1252, // MyENCODING_WINDOWS_1252 + myencoding_decode_windows_1253, // MyENCODING_WINDOWS_1253 + myencoding_decode_windows_1254, // MyENCODING_WINDOWS_1254 + myencoding_decode_windows_1255, // MyENCODING_WINDOWS_1255 + myencoding_decode_windows_1256, // MyENCODING_WINDOWS_1256 + myencoding_decode_windows_1257, // MyENCODING_WINDOWS_1257 + myencoding_decode_windows_1258, // MyENCODING_WINDOWS_1258 + myencoding_decode_windows_874, // MyENCODING_WINDOWS_874 + myencoding_decode_x_mac_cyrillic, // MyENCODING_X_MAC_CYRILLIC + NULL, +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyENCODING_RESOURCE_H */ + + + + diff --git a/source/myfont/Makefile.mk b/source/myfont/Makefile.mk index 273d845..91ea339 100644 --- a/source/myfont/Makefile.mk +++ b/source/myfont/Makefile.mk @@ -1,14 +1,13 @@ -find_files_h = $(wildcard $(SRCDIR)/myfont/$(dir)/*.h) -find_files_c = $(wildcard $(SRCDIR)/myfont/$(dir)/*.c) +myfont_dirs := . +myfont_objs := $(call MODEST_UTILS_OBJS,myfont,$(myfont_dirs)) -SUBDIRS := . -HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) -SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) +myfont_description := work with font, metrics, calculating size and more by https://www.microsoft.com/en-us/Typography/SpecificationsOverview.aspx +myfont_dependencies := mycore myport -myfont_clone: MyFONT_DIR_$(SUBDIRS) - mkdir -p $(INCLUDE_TMP)/myfont - cp $(SRCDIR)/myfont/*.h $(INCLUDE_TMP)/myfont +myfont_all: $(myfont_objs) -MyFONT_DIR_$(SUBDIRS): - mkdir -p $(INCLUDE_TMP)/myfont/$(patsubst MyFONT_DIR_%,%,$@) - cp $(SRCDIR)/myfont/$(patsubst MyFONT_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/myfont/$(patsubst MyFONT_DIR_%,%,$@)/ +myfont_clean: + rm -f $(myfont_objs) + +myfont_clone: + $(call MODEST_UTILS_HDRS_CLONE,myfont,$(myfont_dirs)) diff --git a/source/myfont/cmap.c b/source/myfont/cmap.c index 0bce7c2..59c504b 100644 --- a/source/myfont/cmap.c +++ b/source/myfont/cmap.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,9 +20,9 @@ #include "myfont/cmap.h" -myfont_status_t myfont_table_cmap_format_0(myfont_font_t *mf, myfont_tcmap_entry_t *entry, size_t offset) +mystatus_t myfont_table_cmap_format_0(myfont_font_t *mf, myfont_tcmap_entry_t *entry, uint8_t* font_data, size_t data_size, size_t offset) { - if(mf->file_size < (offset + 260)) { + if(data_size < (offset + 260)) { entry->header = NULL; return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } @@ -34,7 +34,7 @@ myfont_status_t myfont_table_cmap_format_0(myfont_font_t *mf, myfont_tcmap_entry return MyFONT_STATUS_ERROR_MEMORY_ALLOCATION; } - uint8_t *data = &mf->file_data[offset]; + uint8_t *data = &font_data[offset]; f0->length = myfont_read_u16(&data); f0->language = myfont_read_u16(&data); @@ -46,9 +46,9 @@ myfont_status_t myfont_table_cmap_format_0(myfont_font_t *mf, myfont_tcmap_entry return MyFONT_STATUS_OK; } -myfont_status_t myfont_table_cmap_format_4(myfont_font_t *mf, myfont_tcmap_entry_t *entry, size_t offset) +mystatus_t myfont_table_cmap_format_4(myfont_font_t *mf, myfont_tcmap_entry_t *entry, uint8_t* font_data, size_t data_size, size_t offset) { - uint8_t *data = &mf->file_data[offset]; + uint8_t *data = &font_data[offset]; myfont_tcmap_format_4_t *f4 = (myfont_tcmap_format_4_t*)myfont_calloc(mf, 1, sizeof(myfont_tcmap_format_4_t)); @@ -57,7 +57,7 @@ myfont_status_t myfont_table_cmap_format_4(myfont_font_t *mf, myfont_tcmap_entry offset += MyFONT_TCMAP_FORMAT_4_FIRST_LENGTH; - if(mf->file_size < offset) { + if(data_size < offset) { myfont_free(mf, f4); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } @@ -73,7 +73,7 @@ myfont_status_t myfont_table_cmap_format_4(myfont_font_t *mf, myfont_tcmap_entry f4->numGlyphId = ((f4->length - (16L + 8L * f4->segCount)) & 0xffff) / 2; offset += sizeof(uint16_t) * (f4->segCount * 5); - if(mf->file_size < offset) + if(data_size < offset) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* init mem */ @@ -137,7 +137,7 @@ myfont_status_t myfont_table_cmap_format_4(myfont_font_t *mf, myfont_tcmap_entry return MyFONT_STATUS_OK; } -uint16_t myfont_glyph_index_by_code_format_0(myfont_tcmap_format_0_t *f0, unsigned long codepoint, myfont_status_t* status) +uint16_t myfont_glyph_index_by_code_format_0(myfont_tcmap_format_0_t *f0, unsigned long codepoint, mystatus_t* status) { if(status) *status = MyFONT_STATUS_OK; @@ -151,7 +151,7 @@ uint16_t myfont_glyph_index_by_code_format_0(myfont_tcmap_format_0_t *f0, unsign return 0; } -uint16_t myfont_glyph_index_by_code_format_4(myfont_tcmap_format_4_t *f4, unsigned long codepoint, myfont_status_t* status) +uint16_t myfont_glyph_index_by_code_format_4(myfont_tcmap_format_4_t *f4, unsigned long codepoint, mystatus_t* status) { uint16_t i; @@ -187,10 +187,10 @@ uint16_t myfont_glyph_index_by_code_format_4(myfont_tcmap_format_4_t *f4, unsign return 0; } -uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long codepoint, myfont_status_t* status) +uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long codepoint, mystatus_t* status) { uint16_t i, index = 0, tcout = mf->table_cmap.header.numTables; - myfont_status_t mf_status; + mystatus_t mf_status; for(i = 0; i < tcout; i++) { @@ -224,7 +224,7 @@ uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long codepo return 0; } -myfont_status_t myfont_load_table_cmap(myfont_font_t *mf) +mystatus_t myfont_load_table_cmap(myfont_font_t *mf, uint8_t* font_data, size_t data_size) { myfont_table_cmap_t *tcmap = &mf->table_cmap; const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_cmap]; @@ -232,11 +232,11 @@ myfont_status_t myfont_load_table_cmap(myfont_font_t *mf) if(table_offset == 0) return MyFONT_STATUS_OK; - if((table_offset + 4) > mf->file_size) + if((table_offset + 4) > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; /* get header */ tcmap->header.version = myfont_read_u16(&data); @@ -248,7 +248,7 @@ myfont_status_t myfont_load_table_cmap(myfont_font_t *mf) size_t size_records = sizeof(myfont_tcmap_record_t) * tcmap->header.numTables; size_t size_entries = sizeof(myfont_tcmap_entry_t) * tcmap->header.numTables; - if(mf->file_size < (size_records + size_entries)) + if(data_size < (size_records + size_entries)) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; if((tcmap->records = (myfont_tcmap_record_t *)myfont_malloc(mf, size_records)) == NULL) @@ -271,19 +271,19 @@ myfont_status_t myfont_load_table_cmap(myfont_font_t *mf) { uint32_t offset = tcmap->records[i].offset + table_offset; - if(mf->file_size <= offset) + if(data_size <= offset) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; - data = &mf->file_data[offset]; + data = &font_data[offset]; tcmap->entries[i].format = myfont_read_u16(&data); switch (tcmap->entries[i].format) { case 0: - myfont_table_cmap_format_0(mf, &tcmap->entries[i], (offset + 2)); + myfont_table_cmap_format_0(mf, &tcmap->entries[i], font_data, data_size, (offset + 2)); break; case 4: - myfont_table_cmap_format_4(mf, &tcmap->entries[i], (offset + 2)); + myfont_table_cmap_format_4(mf, &tcmap->entries[i], font_data, data_size, (offset + 2)); break; default: diff --git a/source/myfont/cmap.h b/source/myfont/cmap.h index aeb671f..737a352 100644 --- a/source/myfont/cmap.h +++ b/source/myfont/cmap.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -208,9 +208,9 @@ typedef myfont_table_cmap_t; #include "myfont/myfont.h" -myfont_status_t myfont_load_table_cmap(myfont_font_t *mf); +mystatus_t myfont_load_table_cmap(myfont_font_t* mf, uint8_t* data, size_t data_size); -uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long char_code, myfont_status_t* status); +uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long char_code, mystatus_t* status); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/glyf.c b/source/myfont/glyf.c index 2b5851e..b284cd4 100644 --- a/source/myfont/glyf.c +++ b/source/myfont/glyf.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/glyf.h" -myfont_status_t myfont_load_table_glyf(struct myfont_font *mf) +mystatus_t myfont_load_table_glyf(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_glyf, 0, sizeof(myfont_table_glyf_t)); @@ -38,7 +38,7 @@ myfont_status_t myfont_load_table_glyf(struct myfont_font *mf) for(uint16_t i = 0; i < mf->table_maxp.numGlyphs; i++) { uint32_t offset = mf->cache.tables_offset[MyFONT_TKEY_glyf] + mf->table_loca.offsets[i]; - myfont_status_t status = myfont_glyf_load_data(mf, &glyphs[i], offset); + mystatus_t status = myfont_glyf_load_data(mf, &glyphs[i], font_data, data_size, offset); if(status) return status; @@ -49,7 +49,7 @@ myfont_status_t myfont_load_table_glyf(struct myfont_font *mf) return MyFONT_STATUS_OK; } -myfont_status_t myfont_glyf_load(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint16_t glyph_index) +mystatus_t myfont_glyf_load(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t* font_data, size_t data_size, uint16_t glyph_index) { memset(glyph, 0, sizeof(myfont_table_glyph_t)); @@ -59,21 +59,21 @@ myfont_status_t myfont_glyf_load(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint16_t offset = myfont_loca_get_offset(mf, glyph_index); offset += mf->cache.tables_offset[MyFONT_TKEY_glyf]; - return myfont_glyf_load_data(mf, glyph, offset); + return myfont_glyf_load_data(mf, glyph, font_data, data_size, offset); } -myfont_status_t myfont_glyf_load_data(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint32_t offset) +mystatus_t myfont_glyf_load_data(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t* font_data, size_t data_size, uint32_t offset) { memset(&glyph->head, 0, sizeof(myfont_table_glyf_head_t)); + /* get current data */ + uint8_t *data = &font_data[offset]; + // load head offset += 10; - if(offset > mf->file_size) + if(offset > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; - /* get current data */ - uint8_t *data = &mf->file_data[offset]; - glyph->head.numberOfContours = myfont_read_16(&data); glyph->head.xMin = myfont_read_16(&data); glyph->head.yMin = myfont_read_16(&data); @@ -81,12 +81,12 @@ myfont_status_t myfont_glyf_load_data(myfont_font_t *mf, myfont_table_glyph_t *g glyph->head.yMax = myfont_read_16(&data); if(glyph->head.numberOfContours > 0) - return myfont_glyf_load_simple(mf, glyph, data, offset); + return myfont_glyf_load_simple(mf, glyph, data, data_size, offset); return MyFONT_STATUS_OK; } -myfont_status_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset) +mystatus_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset) { uint16_t *endPtsOfContours = (uint16_t *)myfont_calloc(mf, glyph->head.numberOfContours, sizeof(uint16_t)); @@ -95,7 +95,7 @@ myfont_status_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t offset = offset + (glyph->head.numberOfContours * 2) + 2; - if(offset > mf->file_size) + if(offset > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; for(uint16_t i = 0; i < glyph->head.numberOfContours; i++) { @@ -108,7 +108,7 @@ myfont_status_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t /* instruction */ offset += glyph->simple.instructionLength; - if(offset > mf->file_size) + if(offset > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; if(glyph->simple.instructionLength) { @@ -121,10 +121,10 @@ myfont_status_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t data += glyph->simple.instructionLength; } - return myfont_glyf_load_simple_flags(mf, glyph, data, offset); + return myfont_glyf_load_simple_flags(mf, glyph, data, data_size, offset); } -myfont_status_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset) +mystatus_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset) { uint8_t *flags = (uint8_t *)myfont_calloc(mf, glyph->pointCount, sizeof(uint8_t)); @@ -134,7 +134,7 @@ myfont_status_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_gl uint16_t i = 0; while(i < glyph->pointCount) { - if(offset >= mf->file_size) { + if(offset >= data_size) { myfont_free(mf, flags); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } @@ -143,7 +143,7 @@ myfont_status_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_gl if(flags[i] & MyFONT_GLYF_SML_FLAGS_repeat) { - if(offset >= mf->file_size) { + if(offset >= data_size) { myfont_free(mf, flags); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } @@ -168,10 +168,10 @@ myfont_status_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_gl glyph->simple.flags = flags; - return myfont_glyf_load_simple_coordinates(mf, glyph, data, offset); + return myfont_glyf_load_simple_coordinates(mf, glyph, data, data_size, offset); } -myfont_status_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset) +mystatus_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset) { /* alloc resources */ int16_t *xCoordinates = (int16_t *)myfont_calloc(mf, glyph->pointCount, sizeof(int16_t)); @@ -192,7 +192,7 @@ myfont_status_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_ta { if(flags[i] & MyFONT_GLYF_SML_FLAGS_x_ShortVector) { - if(offset >= mf->file_size) { + if(offset >= data_size) { myfont_free(mf, xCoordinates); myfont_free(mf, yCoordinates); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; @@ -209,7 +209,7 @@ myfont_status_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_ta { offset++; - if(offset >= mf->file_size) { + if(offset >= data_size) { myfont_free(mf, xCoordinates); myfont_free(mf, yCoordinates); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; @@ -232,7 +232,7 @@ myfont_status_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_ta { if(flags[i] & MyFONT_GLYF_SML_FLAGS_y_ShortVector) { - if(offset >= mf->file_size) { + if(offset >= data_size) { myfont_free(mf, xCoordinates); myfont_free(mf, yCoordinates); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; @@ -248,7 +248,7 @@ myfont_status_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_ta else { offset++; - if(offset >= mf->file_size) { + if(offset >= data_size) { myfont_free(mf, xCoordinates); myfont_free(mf, yCoordinates); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; diff --git a/source/myfont/glyf.h b/source/myfont/glyf.h index 4d853aa..b0ac56b 100644 --- a/source/myfont/glyf.h +++ b/source/myfont/glyf.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -99,13 +99,13 @@ typedef myfont_table_glyf_t; struct myfont_font; -myfont_status_t myfont_load_table_glyf(struct myfont_font *mf); +mystatus_t myfont_load_table_glyf(myfont_font_t *mf, uint8_t* data, size_t data_size); -myfont_status_t myfont_glyf_load(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint16_t glyph_index); -myfont_status_t myfont_glyf_load_data(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint32_t offset); -myfont_status_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset); -myfont_status_t myfont_glyf_load_simple_flags(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset); -myfont_status_t myfont_glyf_load_simple_coordinates(struct myfont_font *mf, myfont_table_glyph_t *glyph, uint8_t *data, uint32_t offset); +mystatus_t myfont_glyf_load(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t* data, size_t data_size, uint16_t glyph_index); +mystatus_t myfont_glyf_load_data(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t* data, size_t data_size, uint32_t offset); +mystatus_t myfont_glyf_load_simple(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset); +mystatus_t myfont_glyf_load_simple_flags(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset); +mystatus_t myfont_glyf_load_simple_coordinates(myfont_font_t *mf, myfont_table_glyph_t *glyph, uint8_t *data, size_t data_size, uint32_t offset); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/head.c b/source/myfont/head.c index fed5822..8fe5648 100644 --- a/source/myfont/head.c +++ b/source/myfont/head.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/head.h" -myfont_status_t myfont_load_table_head(struct myfont_font *mf) +mystatus_t myfont_load_table_head(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_head, 0, sizeof(myfont_table_head_t)); @@ -30,11 +30,11 @@ myfont_status_t myfont_load_table_head(struct myfont_font *mf) myfont_table_head_t *thead = &mf->table_head; const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_head]; - if(mf->file_size < (table_offset + 16 + 4 + 16 + 8 + 4 + 6)) + if(data_size < (table_offset + 16 + 4 + 16 + 8 + 4 + 6)) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; /* u32 */ thead->version = myfont_read_u32(&data); diff --git a/source/myfont/head.h b/source/myfont/head.h index 770c886..89f71c9 100644 --- a/source/myfont/head.h +++ b/source/myfont/head.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -53,9 +53,9 @@ typedef myfont_table_head_t; struct myfont_font; -myfont_status_t myfont_load_table_head(struct myfont_font *mf); +mystatus_t myfont_load_table_head(myfont_font_t *mf, uint8_t* data, size_t data_size); -float myfont_head_yMax_pixel(struct myfont_font *mf, float font_size); +float myfont_head_yMax_pixel(myfont_font_t *mf, float font_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/hhea.c b/source/myfont/hhea.c index 92cd247..16b97d5 100644 --- a/source/myfont/hhea.c +++ b/source/myfont/hhea.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/hhea.h" -myfont_status_t myfont_load_table_hhea(myfont_font_t *mf) +mystatus_t myfont_load_table_hhea(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_hhea, 0, sizeof(myfont_table_hhea_t)); @@ -30,11 +30,11 @@ myfont_status_t myfont_load_table_hhea(myfont_font_t *mf) myfont_table_hhea_t *thhea = &mf->table_hhea; const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_hhea]; - if(mf->file_size < (table_offset + 8 + 6 + 2 + 22 + 2)) + if(data_size < (table_offset + 8 + 6 + 2 + 22 + 2)) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; thhea->version = myfont_read_u32(&data); diff --git a/source/myfont/hhea.h b/source/myfont/hhea.h index 794c5c9..4f5eb07 100644 --- a/source/myfont/hhea.h +++ b/source/myfont/hhea.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -54,7 +54,7 @@ typedef myfont_table_hhea_t; struct myfont_font; -myfont_status_t myfont_load_table_hhea(struct myfont_font *mf); +mystatus_t myfont_load_table_hhea(myfont_font_t *mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/hmtx.c b/source/myfont/hmtx.c index e08c95f..96e10b7 100644 --- a/source/myfont/hmtx.c +++ b/source/myfont/hmtx.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/hmtx.h" -myfont_status_t myfont_load_table_hmtx(struct myfont_font *mf) +mystatus_t myfont_load_table_hmtx(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_hmtx, 0, sizeof(myfont_table_hmtx_t)); @@ -31,13 +31,13 @@ myfont_status_t myfont_load_table_hmtx(struct myfont_font *mf) const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_hmtx]; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; uint16_t num_metrics = mf->table_hhea.numberOfHMetrics; if(num_metrics == 0) return MyFONT_STATUS_OK; - if(mf->file_size < (table_offset + (num_metrics * 2))) + if(data_size < (table_offset + (num_metrics * 2))) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; myfont_long_hor_metric_t *lhor_metric = (myfont_long_hor_metric_t *)myfont_calloc(mf, num_metrics, sizeof(myfont_long_hor_metric_t)); diff --git a/source/myfont/hmtx.h b/source/myfont/hmtx.h index c8368b6..ccc6d29 100644 --- a/source/myfont/hmtx.h +++ b/source/myfont/hmtx.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,7 +45,7 @@ typedef myfont_table_hmtx_t; struct myfont_font; -myfont_status_t myfont_load_table_hmtx(struct myfont_font *mf); +mystatus_t myfont_load_table_hmtx(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/loca.c b/source/myfont/loca.c index 27c5c43..33dcd4b 100644 --- a/source/myfont/loca.c +++ b/source/myfont/loca.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/loca.h" -myfont_status_t myfont_load_table_loca(struct myfont_font *mf) +mystatus_t myfont_load_table_loca(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_loca, 0, sizeof(myfont_table_loca_t)); @@ -31,7 +31,7 @@ myfont_status_t myfont_load_table_loca(struct myfont_font *mf) uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_loca]; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; uint16_t numGlyph = mf->table_maxp.numGlyphs; if(numGlyph == 0) @@ -46,23 +46,23 @@ myfont_status_t myfont_load_table_loca(struct myfont_font *mf) if(mf->table_head.indexToLocFormat) { - if(mf->file_size < (table_offset + (numGlyph * 4))) { + if(data_size < (table_offset + (numGlyph * 4))) { myfont_free(mf, tloca->offsets); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } - for(uint16_t i = 0; i < numGlyph; i++) { + for(size_t i = 0; i < numGlyph; i++) { tloca->offsets[i] = myfont_read_u32(&data); } } else { - if(mf->file_size < (table_offset + (numGlyph * 2))) { + if(data_size < (table_offset + (numGlyph * 2))) { myfont_free(mf, tloca->offsets); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } - for(uint16_t i = 0; i < numGlyph; i++) { + for(size_t i = 0; i < numGlyph; i++) { tloca->offsets[i] = myfont_read_u16(&data) * 2; } } diff --git a/source/myfont/loca.h b/source/myfont/loca.h index bb6c13d..1d22f4f 100644 --- a/source/myfont/loca.h +++ b/source/myfont/loca.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -38,9 +38,9 @@ typedef myfont_table_loca_t; struct myfont_font; -myfont_status_t myfont_load_table_loca(struct myfont_font *mf); +mystatus_t myfont_load_table_loca(myfont_font_t *mf, uint8_t* data, size_t data_size); -uint32_t myfont_loca_get_offset(struct myfont_font *mf, uint16_t glyph_index); +uint32_t myfont_loca_get_offset(myfont_font_t *mf, uint16_t glyph_index); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/maxp.c b/source/myfont/maxp.c index bd652dc..a894522 100644 --- a/source/myfont/maxp.c +++ b/source/myfont/maxp.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/maxp.h" -myfont_status_t myfont_load_table_maxp(myfont_font_t *mf) +mystatus_t myfont_load_table_maxp(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_maxp, 0, sizeof(myfont_table_maxp_t)); @@ -30,17 +30,17 @@ myfont_status_t myfont_load_table_maxp(myfont_font_t *mf) myfont_table_maxp_t *tmaxp = &mf->table_maxp; const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_maxp]; - if((table_offset + 4) > mf->file_size) + if((table_offset + 4) > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; tmaxp->version = myfont_read_u32_as_net(&data); if(myfont_table_version_major(tmaxp->version) == 1) { - if((table_offset + 4 + 28) > mf->file_size) + if((table_offset + 4 + 28) > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tmaxp->numGlyphs = myfont_read_u16(&data); @@ -59,7 +59,7 @@ myfont_status_t myfont_load_table_maxp(myfont_font_t *mf) tmaxp->maxComponentDepth = myfont_read_u16(&data); } else { - if((table_offset + 4 + 2) > mf->file_size) + if((table_offset + 4 + 2) > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tmaxp->numGlyphs = myfont_read_u16(&data); diff --git a/source/myfont/maxp.h b/source/myfont/maxp.h index 85fa03b..b24df05 100644 --- a/source/myfont/maxp.h +++ b/source/myfont/maxp.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -51,7 +51,7 @@ typedef myfont_table_maxp_t; struct myfont_font; -myfont_status_t myfont_load_table_maxp(struct myfont_font *mf); +mystatus_t myfont_load_table_maxp(myfont_font_t *mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/myfont.c b/source/myfont/myfont.c index 9f3ac0d..4129add 100644 --- a/source/myfont/myfont.c +++ b/source/myfont/myfont.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -32,19 +32,28 @@ const char myfont_table_name[][5] = { myfont_font_t * myfont_create(void) { - return (myfont_font_t *)myhtml_calloc(1, sizeof(myfont_font_t)); + return (myfont_font_t *)mycore_calloc(1, sizeof(myfont_font_t)); } -myfont_status_t myfont_init(myfont_font_t *mf) +mystatus_t myfont_init(myfont_font_t *mf) { - mf->mchar = mchar_async_create(64, (4096 * 2)); - mf->mchar_node_id = mchar_async_node_add(mf->mchar); + mystatus_t status; + + mf->mchar = mchar_async_create(); + if(mf->mchar == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if((status = mchar_async_init(mf->mchar, 64, (4096 * 2)))) + return status; + + mf->mchar_node_id = mchar_async_node_add(mf->mchar, &status); + + if(status) + return status; memset(mf->cache.tables_offset, 0, sizeof(uint32_t) * MyFONT_TKEY_LAST_KEY); memset(&mf->header, 0, sizeof(myfont_header_t)); - mf->file_path = NULL; - return MyFONT_STATUS_OK; } @@ -54,17 +63,6 @@ void myfont_clean(myfont_font_t *mf) memset(mf->cache.tables_offset, 0, sizeof(uint32_t) * MyFONT_TKEY_LAST_KEY); memset(&mf->header, 0, sizeof(myfont_header_t)); - - if(mf->file_data) { - myhtml_free(mf->file_data); - mf->file_data = NULL; - } - - if(mf->file_path) { - myhtml_free(mf->file_path); - mf->file_path = NULL; - } - memset(mf, 0, sizeof(myfont_font_t)); } @@ -75,18 +73,8 @@ myfont_font_t * myfont_destroy(myfont_font_t *mf, bool self_destroy) mf->mchar = mchar_async_destroy(mf->mchar, 1); - if(mf->file_data) { - myhtml_free(mf->file_data); - mf->file_data = NULL; - } - - if(mf->file_path) { - myhtml_free(mf->file_path); - mf->file_path = NULL; - } - if(self_destroy) { - myhtml_free(mf); + mycore_free(mf); return NULL; } @@ -111,53 +99,80 @@ void myfont_free(myfont_font_t *mf, void* data) mchar_async_free(mf->mchar, mf->mchar_node_id, data); } -myfont_status_t myfont_load(myfont_font_t *mf, const char *filepath) +mystatus_t myfont_load_from_file(myfont_font_t *mf, const char *filepath, uint8_t** return_data, size_t* data_size) { - FILE *fh = fopen(filepath, "rb"); + if(return_data) + *return_data = NULL; + + if(data_size) + *data_size = 0; + + size_t file_data_size; + + FILE *fh = mycore_fopen(filepath, "rb"); if(fh == NULL) return MyFONT_STATUS_ERROR_FILE_OPEN; - if(fseek(fh, 0L, SEEK_END)) { - fclose(fh); + if(mycore_fseek(fh, 0L, SEEK_END)) { + mycore_fclose(fh); return MyFONT_STATUS_ERROR_FILE_SEEK; } - long file_size = ftell(fh); + long file_size = mycore_ftell(fh); if(file_size == -1) { - fclose(fh); + mycore_fclose(fh); return MyFONT_STATUS_ERROR_FILE_TELL; } - if(fseek(fh, 0L, SEEK_SET)) { - fclose(fh); + if(mycore_fseek(fh, 0L, SEEK_SET)) { + mycore_fclose(fh); return MyFONT_STATUS_ERROR_FILE_SEEK; } if(file_size > 0) - mf->file_size = (size_t)file_size; + file_data_size = (size_t)file_size; else { - fclose(fh); + mycore_fclose(fh); return MyFONT_STATUS_ERROR_FILE_TOO_SMALL; } - mf->file_data = (uint8_t*)myhtml_malloc(file_size); + uint8_t* data = (uint8_t*)mycore_malloc(file_size); - if(mf->file_data == NULL) { - fclose(fh); + if(data == NULL) { + mycore_fclose(fh); return MyFONT_STATUS_ERROR_MEMORY_ALLOCATION; } - if(fread(mf->file_data, 1, file_size, fh) != file_size) { - fclose(fh); + if(mycore_fread(data, 1, file_size, fh) != file_size) { + mycore_fclose(fh); return MyFONT_STATUS_ERROR_FILE_READ; } - fclose(fh); + mycore_fclose(fh); - if(mf->file_size < 12) + if(return_data) + *return_data = data; + + if(data_size) + *data_size = file_data_size; + + return myfont_load(mf, data, file_data_size); +} + +void * myfont_destroy_font_data(myfont_font_t *mf, uint8_t* return_data) +{ + if(return_data) + return mycore_free(return_data); + + return NULL; +} + +mystatus_t myfont_load(myfont_font_t *mf, uint8_t* font_data, size_t data_size) +{ + if(data_size < 12) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; - uint8_t *data = mf->file_data; + uint8_t* data = font_data; mf->header.version_major = myfont_read_u16(&data); mf->header.version_minor = myfont_read_u16(&data); @@ -166,7 +181,7 @@ myfont_status_t myfont_load(myfont_font_t *mf, const char *filepath) mf->header.entrySelector = myfont_read_u16(&data); mf->header.rangeShift = myfont_read_u16(&data); - if(mf->file_size < (12 + (mf->header.numTables * 16))) + if(data_size < (12 + (mf->header.numTables * 16))) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; for(uint16_t i = 0; i < mf->header.numTables; i++) @@ -224,54 +239,48 @@ myfont_status_t myfont_load(myfont_font_t *mf, const char *filepath) if(myfont_check_required_tables(mf)) return MyFONT_STATUS_ERROR_TABLE_LACKS_REQUIRED; - mf->file_path = (char *)myhtml_calloc(strlen(filepath), sizeof(char)); + mystatus_t status; - if(mf->file_path) { - strncpy(mf->file_path, filepath, strlen(filepath)); - } - - myfont_status_t status; - - if((status = myfont_load_table_cmap(mf))) + if((status = myfont_load_table_cmap(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_CMAP; - if((status = myfont_load_table_head(mf))) + if((status = myfont_load_table_head(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_HEAD; - if((status = myfont_load_table_name(mf))) + if((status = myfont_load_table_name(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_NAME; - if((status = myfont_load_table_os_2(mf))) + if((status = myfont_load_table_os_2(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_OS_2; - if((status = myfont_load_table_maxp(mf))) + if((status = myfont_load_table_maxp(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_MAXP; - if((status = myfont_load_table_hhea(mf))) + if((status = myfont_load_table_hhea(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_HHEA; - if((status = myfont_load_table_hmtx(mf))) + if((status = myfont_load_table_hmtx(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_HMTX; - if((status = myfont_load_table_loca(mf))) + if((status = myfont_load_table_loca(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_LOCA; - if((status = myfont_load_table_glyf(mf))) + if((status = myfont_load_table_glyf(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_GLYF; - if((status = myfont_load_table_vhea(mf))) + if((status = myfont_load_table_vhea(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_VHEA; - if((status = myfont_load_table_vmtx(mf))) + if((status = myfont_load_table_vmtx(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_VMTX; - if((status = myfont_load_table_pclt(mf))) + if((status = myfont_load_table_pclt(mf, font_data, data_size))) return MyFONT_STATUS_ERROR_TABLE_LOAD_PCLT; return MyFONT_STATUS_OK; } -myfont_status_t myfont_check_required_tables(myfont_font_t *mf) +mystatus_t myfont_check_required_tables(myfont_font_t *mf) { if(mf->cache.tables_offset[ MyFONT_TKEY_cmap ] == 0 || mf->cache.tables_offset[ MyFONT_TKEY_glyf ] == 0 || @@ -287,17 +296,6 @@ myfont_status_t myfont_check_required_tables(myfont_font_t *mf) return MyFONT_STATUS_OK; } -void myfont_font_print_exists_table(myfont_font_t *mf, FILE *file) -{ - size_t i; - for(i = 0; i < MyFONT_TKEY_LAST_KEY; i++) - { - if(mf->cache.tables_offset[i]) { - fprintf(file, "%s = %u\n", myfont_table_name[i], mf->cache.tables_offset[i]); - } - } -} - // metrics float myfont_metrics_baseline(myfont_font_t *mf, float font_size) { @@ -334,7 +332,7 @@ float myfont_metrics_x_height(myfont_font_t *mf, float font_size) if(xheight == 0) { - myfont_status_t mf_status; + mystatus_t mf_status; uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, (unsigned long)('x'), &mf_status); if(mf_status == MyFONT_STATUS_OK) { @@ -360,7 +358,7 @@ float myfont_metrics_cap_height(myfont_font_t *mf, float font_size) if(cap_height == 0) { - myfont_status_t mf_status; + mystatus_t mf_status; uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, (unsigned long)('H'), &mf_status); if(mf_status == MyFONT_STATUS_OK) { @@ -378,12 +376,12 @@ float myfont_metrics_font_height(myfont_font_t *mf, float font_size) } // width, height and ... -float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status) +float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status) { if(mf->table_hhea.numberOfHMetrics == 0 || mf->table_hmtx.hMetrics == NULL) return 0.0f; - myfont_status_t mf_status; + mystatus_t mf_status; uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, codepoint, &mf_status); @@ -397,12 +395,12 @@ float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float fon return (float)(mf->table_hmtx.hMetrics[glyph_index].advanceWidth) * font_size / (float)(mf->table_head.unitsPerEm); } -float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status) +float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status) { if(mf->table_vhea.numOfLongVerMetrics == 0 || mf->table_vmtx.vMetrics == NULL) return myfont_metrics_font_height(mf, font_size); - myfont_status_t mf_status; + mystatus_t mf_status; uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, codepoint, &mf_status); @@ -416,9 +414,9 @@ float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float fo return (float)(mf->table_vmtx.vMetrics[glyph_index].advanceHeight) * font_size / (float)(mf->table_head.unitsPerEm); } -float myfont_metrics_glyph_offset_y(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status) +float myfont_metrics_glyph_offset_y(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status) { - myfont_status_t mf_status; + mystatus_t mf_status; uint16_t glyph_index = myfont_glyph_index_by_codepoint(mf, codepoint, &mf_status); diff --git a/source/myfont/myfont.h b/source/myfont/myfont.h index 02755ab..6077be6 100644 --- a/source/myfont/myfont.h +++ b/source/myfont/myfont.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,8 @@ #define MyFONT_MyFONT_H #pragma once +#include + #include "myfont/myosi.h" #include "myfont/cmap.h" #include "myfont/head.h" @@ -36,7 +38,13 @@ #include "myfont/pclt.h" #include "myfont/loca.h" -#include "myhtml/utils/mchar_async.h" +#include "mycore/utils/mchar_async.h" + +#define MyFONT_VERSION_MAJOR 0 +#define MyFONT_VERSION_MINOR 0 +#define MyFONT_VERSION_PATCH 2 + +#define MyFONT_VERSION_STRING MyCORE_STR(MyFONT_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyFONT_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyFONT_VERSION_PATCH) #ifdef __cplusplus extern "C" { @@ -83,16 +91,12 @@ struct myfont_font { myfont_table_pclt_t table_pclt; myfont_table_loca_t table_loca; - char* file_path; - size_t file_size; - uint8_t* file_data; - mchar_async_t* mchar; size_t mchar_node_id; }; myfont_font_t * myfont_create(void); -myfont_status_t myfont_init(myfont_font_t *mf); +mystatus_t myfont_init(myfont_font_t *mf); void myfont_clean(myfont_font_t *mf); myfont_font_t * myfont_destroy(myfont_font_t *mf, bool self_destroy); @@ -100,10 +104,11 @@ void * myfont_malloc(myfont_font_t* mf, size_t size); void * myfont_calloc(myfont_font_t* mf, size_t count, size_t size); void myfont_free(myfont_font_t *mf, void* data); -myfont_status_t myfont_load(myfont_font_t *mf, const char *filepath); +mystatus_t myfont_load(myfont_font_t* mf, uint8_t* data, size_t data_size); +mystatus_t myfont_load_from_file(myfont_font_t* mf, const char* filepath, uint8_t** return_data, size_t* data_size); +void * myfont_destroy_font_data(myfont_font_t* mf, uint8_t* return_data); -void myfont_font_print_exists_table(myfont_font_t *mf, FILE *file); -myfont_status_t myfont_check_required_tables(myfont_font_t *mf); +mystatus_t myfont_check_required_tables(myfont_font_t *mf); float myfont_metrics_baseline(myfont_font_t *mf, float font_size); float myfont_metrics_ascender(myfont_font_t *mf, float font_size); @@ -113,11 +118,11 @@ float myfont_metrics_x_height(myfont_font_t *mf, float font_size); float myfont_metrics_cap_height(myfont_font_t *mf, float font_size); float myfont_metrics_font_height(myfont_font_t *mf, float font_size); -float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status); -float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status); -float myfont_metrics_glyph_offset_y(myfont_font_t *mf, unsigned long codepoint, float font_size, myfont_status_t* status); +float myfont_metrics_width(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status); +float myfont_metrics_height(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status); +float myfont_metrics_glyph_offset_y(myfont_font_t *mf, unsigned long codepoint, float font_size, mystatus_t* status); -myfont_status_t myfont_load_table(myfont_font_t *mf, void *table, size_t size, enum myfont_table_key tkey); +mystatus_t myfont_load_table(myfont_font_t *mf, void *table, size_t size, enum myfont_table_key tkey); int16_t myfont_table_version_major(uint32_t version); int16_t myfont_table_version_minor(uint32_t version); diff --git a/source/myfont/myosi.c b/source/myfont/myosi.c index 39cb0d4..e252208 100644 --- a/source/myfont/myosi.c +++ b/source/myfont/myosi.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myfont/myosi.h b/source/myfont/myosi.h index 35904b8..80612f9 100644 --- a/source/myfont/myosi.h +++ b/source/myfont/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -85,7 +85,6 @@ extern "C" { // base /* Very important!!! - see modest/myosi.h:modest_status_t */ enum myfont_status { MyFONT_STATUS_OK = 0x000000, diff --git a/source/myfont/name.c b/source/myfont/name.c index e2f0c33..a89371e 100644 --- a/source/myfont/name.c +++ b/source/myfont/name.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/name.h" -myfont_status_t myfont_load_table_name(myfont_font_t *mf) +mystatus_t myfont_load_table_name(myfont_font_t *mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_name, 0, sizeof(myfont_table_name_t)); @@ -31,18 +31,18 @@ myfont_status_t myfont_load_table_name(myfont_font_t *mf) const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_name]; uint32_t pos = table_offset + 6; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; tname->format = myfont_read_u16(&data); tname->count = myfont_read_u16(&data); tname->stringOffset = myfont_read_u16(&data); pos = pos + (tname->count * 12); - if(pos > mf->file_size) { + if(pos > data_size) { tname->count = 0; return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } @@ -66,13 +66,13 @@ myfont_status_t myfont_load_table_name(myfont_font_t *mf) if(tname->format == 1) { pos += 2; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tname->langTagCount = myfont_read_u16(&data); pos = pos + (tname->langTagCount * 4); - if(pos > mf->file_size) { + if(pos > data_size) { tname->langTagCount = 0; return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } diff --git a/source/myfont/name.h b/source/myfont/name.h index ffcbe0a..7520f20 100644 --- a/source/myfont/name.h +++ b/source/myfont/name.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -60,8 +60,8 @@ typedef myfont_table_name_t; struct myfont_font; -myfont_status_t myfont_load_table_name(struct myfont_font *mf); - +mystatus_t myfont_load_table_name(myfont_font_t *mf, uint8_t* data, size_t data_size); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/source/myfont/os_2.c b/source/myfont/os_2.c index fc4c8bc..4b5e077 100644 --- a/source/myfont/os_2.c +++ b/source/myfont/os_2.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/os_2.h" -myfont_status_t myfont_load_table_os_2(myfont_font_t *mf) +mystatus_t myfont_load_table_os_2(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_os_2, 0, sizeof(myfont_table_os_2_t)); @@ -31,10 +31,10 @@ myfont_status_t myfont_load_table_os_2(myfont_font_t *mf) const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_OS_2]; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; uint32_t pos = table_offset + 32 + 10 + 16 + 4 + 16; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tos_2->version = myfont_read_u16(&data); @@ -77,7 +77,7 @@ myfont_status_t myfont_load_table_os_2(myfont_font_t *mf) switch (tos_2->version) { case 1: pos += 8; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tos_2->ulCodePageRange1 = myfont_read_u32(&data); @@ -88,7 +88,7 @@ myfont_status_t myfont_load_table_os_2(myfont_font_t *mf) case 3: case 4: pos += 18; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tos_2->ulCodePageRange1 = myfont_read_u32(&data); @@ -102,7 +102,7 @@ myfont_status_t myfont_load_table_os_2(myfont_font_t *mf) break; case 5: pos += 22; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; tos_2->ulCodePageRange1 = myfont_read_u32(&data); diff --git a/source/myfont/os_2.h b/source/myfont/os_2.h index c1550f1..323c76a 100644 --- a/source/myfont/os_2.h +++ b/source/myfont/os_2.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -90,9 +90,9 @@ typedef myfont_table_os_2_t; struct myfont_font; -myfont_status_t myfont_load_table_os_2(struct myfont_font *mf); +mystatus_t myfont_load_table_os_2(myfont_font_t* mf, uint8_t* data, size_t data_size); -int8_t myfont_os_2_panose(struct myfont_font *mf, myfont_table_os_2_panose_t id); +int8_t myfont_os_2_panose(myfont_font_t* mf, myfont_table_os_2_panose_t id); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/pclt.c b/source/myfont/pclt.c index ec6b04a..85d86a0 100644 --- a/source/myfont/pclt.c +++ b/source/myfont/pclt.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/pclt.h" -myfont_status_t myfont_load_table_pclt(struct myfont_font *mf) +mystatus_t myfont_load_table_pclt(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_pclt, 0, sizeof(myfont_table_pclt_t)); @@ -31,11 +31,11 @@ myfont_status_t myfont_load_table_pclt(struct myfont_font *mf) const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_PCLT]; uint32_t pos = table_offset + 4 + 16 + 16 + 8 + 6 + 4; - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; tpclt->version = myfont_read_u32_as_net(&data); diff --git a/source/myfont/pclt.h b/source/myfont/pclt.h index 9d44bd0..9b1054d 100644 --- a/source/myfont/pclt.h +++ b/source/myfont/pclt.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -52,7 +52,7 @@ typedef myfont_table_pclt_t; struct myfont_font; -myfont_status_t myfont_load_table_pclt(struct myfont_font *mf); +mystatus_t myfont_load_table_pclt(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/vhea.c b/source/myfont/vhea.c index d0b7b16..8657594 100644 --- a/source/myfont/vhea.c +++ b/source/myfont/vhea.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/vhea.h" -myfont_status_t myfont_load_table_vhea(myfont_font_t *mf) +mystatus_t myfont_load_table_vhea(myfont_font_t *mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_vhea, 0, sizeof(myfont_table_vhea_t)); @@ -30,11 +30,11 @@ myfont_status_t myfont_load_table_vhea(myfont_font_t *mf) myfont_table_vhea_t *tvhea = &mf->table_vhea; const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_vhea]; - if((table_offset + 4 + 32) > mf->file_size) + if((table_offset + 4 + 32) > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; tvhea->version = myfont_read_u32_as_net(&data); tvhea->Ascender = myfont_read_16(&data); diff --git a/source/myfont/vhea.h b/source/myfont/vhea.h index bb89d14..fb29222 100644 --- a/source/myfont/vhea.h +++ b/source/myfont/vhea.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -54,7 +54,7 @@ typedef myfont_table_vhea_t; struct myfont_font; -myfont_status_t myfont_load_table_vhea(struct myfont_font *mf); +mystatus_t myfont_load_table_vhea(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myfont/vmtx.c b/source/myfont/vmtx.c index 3f986b6..2c13652 100644 --- a/source/myfont/vmtx.c +++ b/source/myfont/vmtx.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,7 +20,7 @@ #include "myfont/vmtx.h" -myfont_status_t myfont_load_table_vmtx(myfont_font_t *mf) +mystatus_t myfont_load_table_vmtx(myfont_font_t* mf, uint8_t* font_data, size_t data_size) { memset(&mf->table_vmtx, 0, sizeof(myfont_table_vmtx_t)); @@ -31,14 +31,14 @@ myfont_status_t myfont_load_table_vmtx(myfont_font_t *mf) const uint32_t table_offset = mf->cache.tables_offset[MyFONT_TKEY_vmtx]; /* get current data */ - uint8_t *data = &mf->file_data[table_offset]; + uint8_t *data = &font_data[table_offset]; uint16_t num_metrics = mf->table_vhea.numOfLongVerMetrics; if(num_metrics == 0) return MyFONT_STATUS_OK; uint32_t pos = table_offset + (num_metrics * 4); - if(pos > mf->file_size) + if(pos > data_size) return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; myfont_long_ver_metric_t *lver_metric = (myfont_long_ver_metric_t *)myfont_calloc(mf, num_metrics, sizeof(myfont_long_ver_metric_t)); @@ -60,7 +60,7 @@ myfont_status_t myfont_load_table_vmtx(myfont_font_t *mf) pos = pos + (numOfTSB * 2); - if(pos > mf->file_size) { + if(pos > data_size) { myfont_free(mf, lver_metric); return MyFONT_STATUS_ERROR_TABLE_UNEXPECTED_ENDING; } diff --git a/source/myfont/vmtx.h b/source/myfont/vmtx.h index 7caa8fe..148563b 100644 --- a/source/myfont/vmtx.h +++ b/source/myfont/vmtx.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -45,7 +45,7 @@ typedef myfont_table_vmtx_t; struct myfont_font; -myfont_status_t myfont_load_table_vmtx(struct myfont_font *mf); +mystatus_t myfont_load_table_vmtx(myfont_font_t* mf, uint8_t* data, size_t data_size); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myhtml/Makefile.mk b/source/myhtml/Makefile.mk index 81d5d63..b4b30cb 100644 --- a/source/myhtml/Makefile.mk +++ b/source/myhtml/Makefile.mk @@ -1,14 +1,13 @@ -find_files_h = $(wildcard $(SRCDIR)/myhtml/$(dir)/*.h) -find_files_c = $(wildcard $(SRCDIR)/myhtml/$(dir)/*.c) +myhtml_dirs := . +myhtml_objs := $(call MODEST_UTILS_OBJS,myhtml,$(myhtml_dirs)) -SUBDIRS := . utils -HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) -SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) +myhtml_description := HTML parser by https://html.spec.whatwg.org/multipage/ +myhtml_dependencies := mycore myencoding myport -myhtml_clone: MyHTML_DIR_$(SUBDIRS) - mkdir -p $(INCLUDE_TMP)/myhtml/utils - cp $(SRCDIR)/myhtml/utils/*.h $(INCLUDE_TMP)/myhtml/utils +myhtml_all: $(myhtml_objs) -MyHTML_DIR_$(SUBDIRS): - mkdir -p $(INCLUDE_TMP)/myhtml/$(patsubst MyHTML_DIR_%,%,$@) - cp $(SRCDIR)/myhtml/$(patsubst MyHTML_DIR_%,%,$@)/*.h $(INCLUDE_TMP)/myhtml/$(patsubst MyHTML_DIR_%,%,$@)/ +myhtml_clean: + rm -f $(myhtml_objs) + +myhtml_clone: + $(call MODEST_UTILS_HDRS_CLONE,myhtml,$(myhtml_dirs)) diff --git a/source/myhtml/api.h b/source/myhtml/api.h index e7eb4a6..9599750 100755 --- a/source/myhtml/api.h +++ b/source/myhtml/api.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -34,14 +34,22 @@ * */ -#define MyHTML_VERSION_MAJOR 3 +#define MyHTML_VERSION_MAJOR 4 #define MyHTML_VERSION_MINOR 0 #define MyHTML_VERSION_PATCH 0 +#define MyHTML_VERSION_STRING MyCORE_STR(MyHTML_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_PATCH) + #include #include #include +#include +#include +#include +#include +#include + #if defined(_MSC_VER) # define MyHTML_DEPRECATED(func) __declspec(deprecated) func #elif defined(__GNUC__) || defined(__INTEL_COMPILER) @@ -54,56 +62,6 @@ extern "C" { #endif -/** - * encodings type - */ -enum myhtml_encoding_list { - MyHTML_ENCODING_DEFAULT = 0x00, -// MyHTML_ENCODING_AUTO = 0x01, // future - MyHTML_ENCODING_NOT_DETERMINED = 0x02, - MyHTML_ENCODING_UTF_8 = 0x00, // default encoding - MyHTML_ENCODING_UTF_16LE = 0x04, - MyHTML_ENCODING_UTF_16BE = 0x05, - MyHTML_ENCODING_X_USER_DEFINED = 0x06, - MyHTML_ENCODING_BIG5 = 0x07, - MyHTML_ENCODING_EUC_JP = 0x08, - MyHTML_ENCODING_EUC_KR = 0x09, - MyHTML_ENCODING_GB18030 = 0x0a, - MyHTML_ENCODING_GBK = 0x0b, - MyHTML_ENCODING_IBM866 = 0x0c, - MyHTML_ENCODING_ISO_2022_JP = 0x0d, - MyHTML_ENCODING_ISO_8859_10 = 0x0e, - MyHTML_ENCODING_ISO_8859_13 = 0x0f, - MyHTML_ENCODING_ISO_8859_14 = 0x10, - MyHTML_ENCODING_ISO_8859_15 = 0x11, - MyHTML_ENCODING_ISO_8859_16 = 0x12, - MyHTML_ENCODING_ISO_8859_2 = 0x13, - MyHTML_ENCODING_ISO_8859_3 = 0x14, - MyHTML_ENCODING_ISO_8859_4 = 0x15, - MyHTML_ENCODING_ISO_8859_5 = 0x16, - MyHTML_ENCODING_ISO_8859_6 = 0x17, - MyHTML_ENCODING_ISO_8859_7 = 0x18, - MyHTML_ENCODING_ISO_8859_8 = 0x19, - MyHTML_ENCODING_ISO_8859_8_I = 0x1a, - MyHTML_ENCODING_KOI8_R = 0x1b, - MyHTML_ENCODING_KOI8_U = 0x1c, - MyHTML_ENCODING_MACINTOSH = 0x1d, - MyHTML_ENCODING_SHIFT_JIS = 0x1e, - MyHTML_ENCODING_WINDOWS_1250 = 0x1f, - MyHTML_ENCODING_WINDOWS_1251 = 0x20, - MyHTML_ENCODING_WINDOWS_1252 = 0x21, - MyHTML_ENCODING_WINDOWS_1253 = 0x22, - MyHTML_ENCODING_WINDOWS_1254 = 0x23, - MyHTML_ENCODING_WINDOWS_1255 = 0x24, - MyHTML_ENCODING_WINDOWS_1256 = 0x25, - MyHTML_ENCODING_WINDOWS_1257 = 0x26, - MyHTML_ENCODING_WINDOWS_1258 = 0x27, - MyHTML_ENCODING_WINDOWS_874 = 0x28, - MyHTML_ENCODING_X_MAC_CYRILLIC = 0x29, - MyHTML_ENCODING_LAST_ENTRY = 0x2a -} -typedef myhtml_encoding_t; - /** * @struct basic tag ids */ @@ -384,54 +342,27 @@ enum myhtml_status { MyHTML_STATUS_OK = 0x0000, MyHTML_STATUS_ERROR = 0x0001, MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0002, - MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, - MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, - MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, - MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, - MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, - MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, - MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, - MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, - MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, - MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, - MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, - MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, - MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, - MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, - MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, - MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, - MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, - MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, - MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, - MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, - MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, - MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, - MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, - MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, - MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, - MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, - MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, - MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, - MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, - MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, - MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, - MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, - MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, - MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x9064, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x912c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x912d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x9190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x9191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x9192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x9193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x9194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x9195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x91f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x91f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x91f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x91f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x91f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x9258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x9259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x9300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x9301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x9302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x9303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x9304 } typedef myhtml_status_t; @@ -492,6 +423,11 @@ typedef struct myhtml myhtml_t; */ typedef struct myhtml_tree myhtml_tree_t; +/** + * @struct myhtml_token_t MyHTML_TOKEN + */ +typedef struct myhtml_token myhtml_token_t; + typedef struct myhtml_token_attr myhtml_tree_attr_t; typedef struct myhtml_tree_node myhtml_tree_node_t; @@ -502,39 +438,6 @@ typedef struct myhtml_tree_node myhtml_tree_node_t; typedef size_t myhtml_tag_id_t; typedef struct myhtml_tag myhtml_tag_t; -/** - * MCHAR_ASYNC structures - * - */ -typedef struct mchar_async mchar_async_t; - -/** - * MyHTML_INCOMING structures - * - */ -typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; - -/** - * MyHTML_STRING structures - * - */ -struct myhtml_string { - char* data; - size_t size; - size_t length; - - mchar_async_t *mchar; - size_t node_idx; -} -typedef myhtml_string_t; - -struct myhtml_string_raw { - char* data; - size_t size; - size_t length; -} -typedef myhtml_string_raw_t; - /** * @struct myhtml_collection_t */ @@ -572,7 +475,6 @@ typedef myhtml_version_t; // callback functions typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); -typedef void (*myhtml_callback_serialize_f)(const char* buffer, size_t size, void* ctx); /*********************************************************************************** * @@ -602,7 +504,7 @@ myhtml_create(void); * * @return MyHTML_STATUS_OK if successful, otherwise an error status value. */ -myhtml_status_t +mystatus_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); @@ -627,7 +529,7 @@ myhtml_destroy(myhtml_t* myhtml); * Parsing HTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @@ -635,15 +537,15 @@ myhtml_destroy(myhtml_t* myhtml); * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); /** * Parsing fragment of HTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 @@ -653,8 +555,8 @@ myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse_fragment(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -663,7 +565,7 @@ myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, * No matter what was said during initialization MyHTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @@ -671,8 +573,8 @@ myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); /** @@ -680,7 +582,7 @@ myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, * No matter what was said during initialization MyHTML * * @param[in] previously created structure myhtml_tree_t* - * @param[in] Input character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] Input character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * @param[in] HTML * @param[in] HTML size * @param[in] fragment base (root) tag id. Default: MyHTML_TAG_DIV if set 0 @@ -690,8 +592,8 @@ myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t -myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, +mystatus_t +myhtml_parse_fragment_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -704,7 +606,7 @@ myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); /** @@ -718,7 +620,7 @@ myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html,size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -732,7 +634,7 @@ myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html,size_t html_si * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); /** @@ -747,7 +649,7 @@ myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_siz * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); @@ -758,7 +660,7 @@ myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_parse_chunk_end(myhtml_tree_t* tree); /*********************************************************************************** @@ -783,7 +685,7 @@ myhtml_tree_create(void); * * @return MyHTML_STATUS_OK if successful, otherwise an error status */ -myhtml_status_t +mystatus_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); /** @@ -935,48 +837,14 @@ myhtml_tree_get_mchar(myhtml_tree_t* tree); size_t myhtml_tree_get_mchar_node_id(myhtml_tree_t* tree); -/** - * Print tree of a node. Print including current node - * - * @param[in] myhtml_tree_t* - * @param[in] myhtml_tree_node_t* - * @param[in] file handle, for example use stdout - * @param[in] tab (\t) increment for pretty print, set 0 - */ -void -myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, - FILE* out, size_t inc); - -/** - * Print tree of a node. Print excluding current node - * - * @param[in] myhtml_tree_t* - * @param[in] myhtml_tree_node_t* - * @param[in] file handle, for example use stdout - * @param[in] tab (\t) increment for pretty print, set 0 - */ -void -myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, - FILE* out, size_t inc); - -/** - * Print a node - * - * @param[in] myhtml_tree_t* - * @param[in] myhtml_tree_node_t* - * @param[in] file handle, for example use stdout - */ -void -myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); - /** * Get first Incoming Buffer * * @param[in] myhtml_tree_t* * - * @return myhtml_incoming_buffer_t* if successful, otherwise a NULL value + * @return mycore_incoming_buffer_t* if successful, otherwise a NULL value */ -myhtml_incoming_buffer_t* +mycore_incoming_buffer_t* myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); /*********************************************************************************** @@ -1007,7 +875,7 @@ myhtml_node_first(myhtml_tree_t* tree); */ myhtml_collection_t* myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, - myhtml_tag_id_t tag_id, myhtml_status_t *status); + myhtml_tag_id_t tag_id, mystatus_t *status); /** * Get nodes by tag name @@ -1022,7 +890,7 @@ myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, */ myhtml_collection_t* myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, - const char* name, size_t length, myhtml_status_t *status); + const char* name, size_t length, mystatus_t *status); /** * Get nodes by attribute key @@ -1039,7 +907,7 @@ myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_collection_t* myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, - const char* key, size_t key_len, myhtml_status_t* status); + const char* key, size_t key_len, mystatus_t* status); /** * Get nodes by attribute value; exactly equal; like a [foo="bar"] @@ -1063,7 +931,7 @@ myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; whitespace separated; like a [foo~="bar"] @@ -1089,7 +957,7 @@ myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; value begins exactly with the string; like a [foo^="bar"] @@ -1115,7 +983,7 @@ myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** @@ -1142,7 +1010,7 @@ myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; value contains the substring; like a [foo*="bar"] @@ -1168,7 +1036,7 @@ myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by attribute value; attribute value is a hyphen-separated list of values beginning; @@ -1193,7 +1061,7 @@ myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /** * Get nodes by tag id in node scope @@ -1209,7 +1077,7 @@ myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, - myhtml_status_t *status); + mystatus_t *status); /** * Get nodes by tag name in node scope @@ -1226,7 +1094,7 @@ myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *co myhtml_collection_t* myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, - myhtml_status_t *status); + mystatus_t *status); /** * Get next sibling node @@ -1378,11 +1246,11 @@ myhtml_node_insert_before(myhtml_tree_node_t *target, myhtml_tree_node_t *node); * @param[in] text length * @param[in] character encoding * - * @return myhtml_string_t* if successful, otherwise a NULL value + * @return mycore_string_t* if successful, otherwise a NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, - myhtml_encoding_t encoding); + myencoding_t encoding); /** * Add text for a node with convert character encoding. @@ -1392,11 +1260,11 @@ myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, * @param[in] text length * @param[in] character encoding * - * @return myhtml_string_t* if successful, otherwise a NULL value + * @return mycore_string_t* if successful, otherwise a NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, - myhtml_encoding_t encoding); + myencoding_t encoding); /** * Get token node @@ -1479,13 +1347,13 @@ const char* myhtml_node_text(myhtml_tree_node_t *node, size_t *length); /** - * Get myhtml_string_t object by Tree node + * Get mycore_string_t object by Tree node * * @param[in] myhtml_tree_node_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_node_string(myhtml_tree_node_t *node); /** @@ -1613,9 +1481,9 @@ myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); * * @param[in] myhtml_tree_attr_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_attribute_key_string(myhtml_tree_attr_t* attr); /** @@ -1623,9 +1491,9 @@ myhtml_attribute_key_string(myhtml_tree_attr_t* attr); * * @param[in] myhtml_tree_attr_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_attribute_value_string(myhtml_tree_attr_t* attr); /** @@ -1649,7 +1517,7 @@ myhtml_attribute_by_key(myhtml_tree_node_t *node, * @param[in] attr key name length * @param[in] attr value name * @param[in] attr value name length - * @param[in] character encoding; Default: MyHTML_ENCODING_UTF_8 or MyHTML_ENCODING_DEFAULT or 0 + * @param[in] character encoding; Default: MyENCODING_UTF_8 or MyENCODING_DEFAULT or 0 * * @return created myhtml_tree_attr_t* if successful, otherwise a NULL value */ @@ -1657,7 +1525,7 @@ myhtml_tree_attr_t* myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, - myhtml_encoding_t encoding); + myencoding_t encoding); /** * Remove attribute reference. Not release the resources @@ -1797,13 +1665,13 @@ const char* myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); /** - * Get myhtml_string_t object by token node + * Get mycore_string_t object by token node * * @param[in] myhtml_token_node_t* * - * @return myhtml_string_t* if exists, otherwise an NULL value + * @return mycore_string_t* if exists, otherwise an NULL value */ -myhtml_string_t* +mycore_string_t* myhtml_token_node_string(myhtml_token_node_t *token_node); /** @@ -1829,10 +1697,11 @@ myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); /** * Wait for process token all parsing stage. Need if you use thread mode * + * @param[in] myhtml_token_t* * @param[in] myhtml_token_node_t* */ void -myhtml_token_node_wait_for_done(myhtml_token_node_t* node); +myhtml_token_node_wait_for_done(myhtml_token_t* token, myhtml_token_node_t* node); /*********************************************************************************** * @@ -1881,7 +1750,7 @@ myhtml_tag_id_by_name(myhtml_tree_t* tree, * @return myhtml_collection_t* if successful, otherwise an NULL value */ myhtml_collection_t* -myhtml_collection_create(size_t size, myhtml_status_t *status); +myhtml_collection_create(size_t size, mystatus_t *status); /** * Clears collection @@ -1911,7 +1780,7 @@ myhtml_collection_destroy(myhtml_collection_t *collection); * * @return NULL if successful, otherwise an myhtml_collection_t* structure */ -myhtml_status_t +mystatus_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); /*********************************************************************************** @@ -1928,16 +1797,16 @@ myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_ * */ void -myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); +myhtml_encoding_set(myhtml_tree_t* tree, myencoding_t encoding); /** * Get character encoding for current stream * * @param[in] myhtml_tree_t* * - * @return myhtml_encoding_t + * @return myencoding_t */ -myhtml_encoding_t +myencoding_t myhtml_encoding_get(myhtml_tree_t* tree); /** @@ -1950,7 +1819,7 @@ myhtml_encoding_get(myhtml_tree_t* tree); * @return size character set */ size_t -myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); +myencoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); /** * Convert Unicode Codepoint to UTF-16LE @@ -1964,7 +1833,7 @@ myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); * @return size character set */ size_t -myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); +myencoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); /** * Detect character encoding @@ -1980,7 +1849,7 @@ myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect(const char *text, size_t length, myencoding_t *encoding); /** * Detect Russian character encoding @@ -1994,7 +1863,7 @@ myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encod * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect_russian(const char *text, size_t length, myencoding_t *encoding); /** * Detect Unicode character encoding @@ -2008,7 +1877,7 @@ myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_ * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect_unicode(const char *text, size_t length, myencoding_t *encoding); /** * Detect Unicode character encoding by BOM @@ -2022,7 +1891,7 @@ myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_ * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); +myencoding_detect_bom(const char *text, size_t length, myencoding_t *encoding); /** * Detect Unicode character encoding by BOM. Cut BOM if will be found @@ -2038,13 +1907,13 @@ myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *e * @return true if encoding found, otherwise false */ bool -myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, +myencoding_detect_and_cut_bom(const char *text, size_t length, myencoding_t *encoding, const char **new_text, size_t *new_size); /** * Detect encoding by name - * Names like: windows-1258 return MyHTML_ENCODING_WINDOWS_1258 - * cp1251 or windows-1251 return MyHTML_ENCODING_WINDOWS_1251 + * Names like: windows-1258 return MyENCODING_WINDOWS_1258 + * cp1251 or windows-1251 return MyENCODING_WINDOWS_1251 * * See https://encoding.spec.whatwg.org/#names-and-labels * @@ -2055,18 +1924,18 @@ myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encod * @return true if encoding found, otherwise false */ bool -myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); +myencoding_by_name(const char *name, size_t length, myencoding_t *encoding); /** - * Get Encoding name by myhtml_encoding_t (by id) + * Get Encoding name by myencoding_t (by id) * - * @param[in] myhtml_encoding_t, encoding id + * @param[in] myencoding_t, encoding id * @param[out] return name length * * @return encoding name, otherwise NULL value */ const char* -myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length); +myencoding_name_by_id(myencoding_t encoding, size_t *length); /** * Detect encoding in meta tag () before start parsing @@ -2076,10 +1945,27 @@ myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length); * @param[in] html data bytes * @param[in] html data length * - * @return detected encoding if encoding found, otherwise MyHTML_ENCODING_NOT_DETERMINED + * @return detected encoding if encoding found, otherwise MyENCODING_NOT_DETERMINED */ -myhtml_encoding_t -myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); +myencoding_t +myencoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); + +/** + * Extracting character encoding from string. Find "charset=" and see encoding. + * For example: "text/html; charset=windows-1251". Return MyENCODING_WINDOWS_1251 + * + * + * See https://html.spec.whatwg.org/multipage/infrastructure.html#algorithm-for-extracting-a-character-encoding-from-a-meta-element + * + * @param[in] data + * @param[in] data length + * @param[out] return encoding + * + * @return true if encoding found + */ +bool +myencoding_extracting_character_encoding_from_charset(const char *data, size_t data_size, + myencoding_t *encoding); /*********************************************************************************** * @@ -2088,7 +1974,7 @@ myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t da ***********************************************************************************/ /** - * Init myhtml_string_t structure + * Init mycore_string_t structure * * @param[in] mchar_async_t*. It can be obtained from myhtml_tree_t object * (see myhtml_tree_get_mchar function) or create manualy @@ -2098,7 +1984,7 @@ myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t da * if created mchar_async_t object manually you know it, if not then take from the Tree * (see myhtml_tree_get_mchar_node_id) * - * @param[in] myhtml_string_t*. It can be obtained from myhtml_tree_node_t object + * @param[in] mycore_string_t*. It can be obtained from myhtml_tree_node_t object * (see myhtml_node_string function) or create manualy * * @param[in] data size. Set the size you want for char* @@ -2106,137 +1992,137 @@ myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t da * @return char* of the size if successful, otherwise a NULL value */ char* -myhtml_string_init(mchar_async_t *mchar, size_t node_id, - myhtml_string_t* str, size_t size); +mycore_string_init(mchar_async_t *mchar, size_t node_id, + mycore_string_t* str, size_t size); /** - * Increase the current size for myhtml_string_t object + * Increase the current size for mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function - * @param[in] data size. Set the new size you want for myhtml_string_t object + * @param[in] mycore_string_t*. See description for mycore_string_init function + * @param[in] data size. Set the new size you want for mycore_string_t object * * @return char* of the size if successful, otherwise a NULL value */ char* -myhtml_string_realloc(myhtml_string_t *str, size_t new_size); +mycore_string_realloc(mycore_string_t *str, size_t new_size); /** - * Clean myhtml_string_t object. In reality, data length set to 0 - * Equivalently: myhtml_string_length_set(str, 0); + * Clean mycore_string_t object. In reality, data length set to 0 + * Equivalently: mycore_string_length_set(str, 0); * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function */ void -myhtml_string_clean(myhtml_string_t* str); +mycore_string_clean(mycore_string_t* str); /** - * Clean myhtml_string_t object. Equivalently: memset(str, 0, sizeof(myhtml_string_t)) + * Clean mycore_string_t object. Equivalently: memset(str, 0, sizeof(mycore_string_t)) * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function */ void -myhtml_string_clean_all(myhtml_string_t* str); +mycore_string_clean_all(mycore_string_t* str); /** - * Release all resources for myhtml_string_t object + * Release all resources for mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] call free function for current object or not * - * @return NULL if destroy_obj set true, otherwise a current myhtml_string_t object + * @return NULL if destroy_obj set true, otherwise a current mycore_string_t object */ -myhtml_string_t* -myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); +mycore_string_t* +mycore_string_destroy(mycore_string_t* str, bool destroy_obj); /** - * Get data (char*) from a myhtml_string_t object + * Get data (char*) from a mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * * @return char* if exists, otherwise a NULL value */ char* -myhtml_string_data(myhtml_string_t *str); +mycore_string_data(mycore_string_t *str); /** - * Get data length from a myhtml_string_t object + * Get data length from a mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * * @return data length */ size_t -myhtml_string_length(myhtml_string_t *str); +mycore_string_length(mycore_string_t *str); /** - * Get data size from a myhtml_string_t object + * Get data size from a mycore_string_t object * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * * @return data size */ size_t -myhtml_string_size(myhtml_string_t *str); +mycore_string_size(mycore_string_t *str); /** - * Set data (char *) for a myhtml_string_t object. + * Set data (char *) for a mycore_string_t object. * * Attention!!! Attention!!! Attention!!! * * You can assign only that it has been allocated from functions: - * myhtml_string_data_alloc - * myhtml_string_data_realloc + * mycore_string_data_alloc + * mycore_string_data_realloc * or obtained manually created from mchar_async_t object * * Attention!!! Do not try set chat* from allocated by malloc or realloc!!! * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] you data to want assign * * @return assigned data if successful, otherwise a NULL value */ char* -myhtml_string_data_set(myhtml_string_t *str, char *data); +mycore_string_data_set(mycore_string_t *str, char *data); /** - * Set data size for a myhtml_string_t object. + * Set data size for a mycore_string_t object. * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] you size to want assign * * @return assigned size */ size_t -myhtml_string_size_set(myhtml_string_t *str, size_t size); +mycore_string_size_set(mycore_string_t *str, size_t size); /** - * Set data length for a myhtml_string_t object. + * Set data length for a mycore_string_t object. * - * @param[in] myhtml_string_t*. See description for myhtml_string_init function + * @param[in] mycore_string_t*. See description for mycore_string_init function * @param[in] you length to want assign * * @return assigned length */ size_t -myhtml_string_length_set(myhtml_string_t *str, size_t length); +mycore_string_length_set(mycore_string_t *str, size_t length); /** * Allocate data (char*) from a mchar_async_t object * - * @param[in] mchar_async_t*. See description for myhtml_string_init function - * @param[in] node id. See description for myhtml_string_init function + * @param[in] mchar_async_t*. See description for mycore_string_init function + * @param[in] node id. See description for mycore_string_init function * @param[in] you size to want assign * * @return data if successful, otherwise a NULL value */ char* -myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); +mycore_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); /** * Allocate data (char*) from a mchar_async_t object * - * @param[in] mchar_async_t*. See description for myhtml_string_init function - * @param[in] node id. See description for myhtml_string_init function + * @param[in] mchar_async_t*. See description for mycore_string_init function + * @param[in] node id. See description for mycore_string_init function * @param[in] old data * @param[in] how much data is copied from the old data to new data * @param[in] new size @@ -2244,28 +2130,28 @@ myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); * @return data if successful, otherwise a NULL value */ char* -myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, +mycore_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); /** * Release allocated data * - * @param[in] mchar_async_t*. See description for myhtml_string_init function - * @param[in] node id. See description for myhtml_string_init function + * @param[in] mchar_async_t*. See description for mycore_string_init function + * @param[in] node id. See description for mycore_string_init function * @param[in] data to release * * @return data if successful, otherwise a NULL value */ void -myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); +mycore_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); /*********************************************************************************** * * MyHTML_STRING_RAW * - * All work with myhtml_string_raw_t object occurs through - * myhtml_malloc (standart malloc), myhtml_realloc (standart realloc), - * myhtml_free (standart free). + * All work with mycore_string_raw_t object occurs through + * mycore_malloc (standart malloc), mycore_realloc (standart realloc), + * mycore_free (standart free). * * You are free to change them on without fear that something will happen * You can call free for str_raw.data, or change str_raw.length = 0 @@ -2273,32 +2159,32 @@ myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); ***********************************************************************************/ /** - * Clean myhtml_string_raw_t object. In reality, data length set to 0 + * Clean mycore_string_raw_t object. In reality, data length set to 0 * - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* */ void -myhtml_string_raw_clean(myhtml_string_raw_t* str_raw); +mycore_string_raw_clean(mycore_string_raw_t* str_raw); /** - * Full clean myhtml_string_raw_t object. - * Equivalently: memset(str_raw, 0, sizeof(myhtml_string_raw_t)) + * Full clean mycore_string_raw_t object. + * Equivalently: memset(str_raw, 0, sizeof(mycore_string_raw_t)) * - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* */ void -myhtml_string_raw_clean_all(myhtml_string_raw_t* str_raw); +mycore_string_raw_clean_all(mycore_string_raw_t* str_raw); /** - * Free resources for myhtml_string_raw_t object + * Free resources for mycore_string_raw_t object * - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* * @param[in] call free function for current object or not * - * @return NULL if destroy_obj set true, otherwise a current myhtml_string_raw_t object + * @return NULL if destroy_obj set true, otherwise a current mycore_string_raw_t object */ -myhtml_string_raw_t* -myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj); +mycore_string_raw_t* +mycore_string_raw_destroy(mycore_string_raw_t* str_raw, bool destroy_obj); /*********************************************************************************** @@ -2316,99 +2202,99 @@ myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj); /** * Get Incoming Buffer by position * - * @param[in] current myhtml_incoming_buffer_t* + * @param[in] current mycore_incoming_buffer_t* * @param[in] begin position * - * @return myhtml_incoming_buffer_t if successful, otherwise a NULL value + * @return mycore_incoming_buffer_t if successful, otherwise a NULL value */ -myhtml_incoming_buffer_t* -myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); +mycore_incoming_buffer_t* +mycore_incoming_buffer_find_by_position(mycore_incoming_buffer_t *inc_buf, size_t begin); /** * Get data of Incoming Buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return const char* if successful, otherwise a NULL value */ const char* -myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_data(mycore_incoming_buffer_t *inc_buf); /** * Get data length of Incoming Buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return size_t */ size_t -myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_length(mycore_incoming_buffer_t *inc_buf); /** * Get data size of Incoming Buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return size_t */ size_t -myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_size(mycore_incoming_buffer_t *inc_buf); /** * Get data offset of Incoming Buffer. Global position of begin Incoming Buffer. * See description for MyHTML_INCOMING title * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * * @return size_t */ size_t -myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_offset(mycore_incoming_buffer_t *inc_buf); /** * Get Relative Position for Incoming Buffer. - * Incoming Buffer should be prepared by myhtml_incoming_buffer_find_by_position + * Incoming Buffer should be prepared by mycore_incoming_buffer_find_by_position * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * @param[in] global begin * * @return size_t */ size_t -myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); +mycore_incoming_buffer_relative_begin(mycore_incoming_buffer_t *inc_buf, size_t begin); /** * This function returns number of available data by Incoming Buffer - * Incoming buffer may be incomplete. See myhtml_incoming_buffer_next + * Incoming buffer may be incomplete. See mycore_incoming_buffer_next * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * @param[in] global begin * * @return size_t */ size_t -myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, +mycore_incoming_buffer_available_length(mycore_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); /** * Get next buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * - * @return myhtml_incoming_buffer_t* + * @return mycore_incoming_buffer_t* */ -myhtml_incoming_buffer_t* -myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_t* +mycore_incoming_buffer_next(mycore_incoming_buffer_t *inc_buf); /** * Get prev buffer * - * @param[in] myhtml_incoming_buffer_t* + * @param[in] mycore_incoming_buffer_t* * - * @return myhtml_incoming_buffer_t* + * @return mycore_incoming_buffer_t* */ -myhtml_incoming_buffer_t* -myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); +mycore_incoming_buffer_t* +mycore_incoming_buffer_prev(mycore_incoming_buffer_t *inc_buf); /*********************************************************************************** * @@ -2564,7 +2450,7 @@ myhtml_callback_tree_node_remove_set(myhtml_tree_t* tree, myhtml_callback_tree_n * @return 0 if match, otherwise index of break position */ size_t -myhtml_strcasecmp(const char* str1, const char* str2); +mycore_strcasecmp(const char* str1, const char* str2); /** * Compare two strings ignoring case of the first n characters @@ -2575,7 +2461,7 @@ myhtml_strcasecmp(const char* str1, const char* str2); * @return 0 if match, otherwise index of break position */ size_t -myhtml_strncasecmp(const char* str1, const char* str2, size_t size); +mycore_strncasecmp(const char* str1, const char* str2, size_t size); /*********************************************************************************** * @@ -2587,39 +2473,39 @@ myhtml_strncasecmp(const char* str1, const char* str2, size_t size); * Tree fragment serialization * The same as myhtml_serialization_tree_buffer function */ -bool -myhtml_serialization(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); /** * Only one tree node serialization * The same as myhtml_serialization_node_buffer function */ -bool -myhtml_serialization_node(myhtml_tree_node_t* node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization_node(myhtml_tree_node_t* node, mycore_string_raw_t* str); /** * Serialize tree to an output string * * @param[in] myhtml_tree_t* * @param[in] scope node - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* * * @return true if successful, otherwise false */ -bool -myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); /** * Serialize node to an output string * * @param[in] myhtml_tree_t* * @param[in] node - * @param[in] myhtml_string_raw_t* + * @param[in] mycore_string_raw_t* * * @return true if successful, otherwise false */ -bool -myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* str); +mystatus_t +myhtml_serialization_node_buffer(myhtml_tree_node_t* node, mycore_string_raw_t* str); /** * The serialize function for an entire tree @@ -2631,9 +2517,9 @@ myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* * * @return true if successful, otherwise false */ -bool +mystatus_t myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, - myhtml_callback_serialize_f callback, void* ptr); + mycore_callback_serialize_f callback, void* ptr); /** * The serialize function for a single node @@ -2645,9 +2531,9 @@ myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, * * @return true if successful, otherwise false */ -bool +mystatus_t myhtml_serialization_node_callback(myhtml_tree_node_t* node, - myhtml_callback_serialize_f callback, void* ptr); + mycore_callback_serialize_f callback, void* ptr); /*********************************************************************************** * diff --git a/source/myhtml/api_encoding.h b/source/myhtml/api_encoding.h deleted file mode 100644 index d32aa4a..0000000 --- a/source/myhtml/api_encoding.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_API_ENCODING_H -#define MyHTML_API_ENCODING_H -#pragma once - -#include "myhtml/api.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum myhtml_encoding_status { - MyHTML_ENCODING_STATUS_OK = 0x00, - MyHTML_ENCODING_STATUS_ERROR = 0x01, - MyHTML_ENCODING_STATUS_CONTINUE = 0x02, - MyHTML_ENCODING_STATUS_DONE = 0x04 -} -typedef myhtml_encoding_status_t; - -struct myhtml_encoding_result { - unsigned long first; - unsigned long second; - unsigned long third; - unsigned long result; - unsigned long result_aux; - unsigned long flag; -} -typedef myhtml_encoding_result_t; - -typedef myhtml_encoding_status_t -(*myhtml_encoding_custom_f)(unsigned const char byte, myhtml_encoding_result_t *res); - -/*********************************************************************************** - * - * MyHTML_ENCODING - * - ***********************************************************************************/ - -/** - * Clean myhtml_encoding_result_t. Use this function before and after text decode - * - * @param[in] myhtml_encoding_result_t* - */ -void -myhtml_encoding_result_clean(myhtml_encoding_result_t *res); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* api_encoding_h */ diff --git a/source/myhtml/callback.c b/source/myhtml/callback.c index b26377e..a5016b3 100644 --- a/source/myhtml/callback.c +++ b/source/myhtml/callback.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/callback.h b/source/myhtml/callback.h index fd6420a..ad2dc59 100644 --- a/source/myhtml/callback.h +++ b/source/myhtml/callback.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/charef.c b/source/myhtml/charef.c index 5947c11..1930f0c 100644 --- a/source/myhtml/charef.c +++ b/source/myhtml/charef.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/charef.h b/source/myhtml/charef.h index 53e3436..09688df 100644 --- a/source/myhtml/charef.h +++ b/source/myhtml/charef.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/charef_resource.h b/source/myhtml/charef_resource.h index 79c2086..59d93db 100644 --- a/source/myhtml/charef_resource.h +++ b/source/myhtml/charef_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/data_process.c b/source/myhtml/data_process.c index a5081db..4b680c5 100644 --- a/source/myhtml/data_process.c +++ b/source/myhtml/data_process.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,13 +19,13 @@ */ #include "myhtml/data_process.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" #define MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() \ tmp_offset += myhtml_string_before_append_any_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), \ proc_entry->tmp_str_pos_proc); \ if(offset != tmp_offset) { \ - if(proc_entry->encoding == MyHTML_ENCODING_UTF_8) \ + if(proc_entry->encoding == MyENCODING_UTF_8) \ proc_entry->tmp_str_pos_proc = myhtml_string_append_with_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), \ proc_entry->emit_null_char); \ else { \ @@ -42,9 +42,9 @@ void myhtml_data_process_entry_clean(myhtml_data_process_entry_t* proc_entry) proc_entry->state = myhtml_data_process_state_data; } -void myhtml_data_process_string_append_char(myhtml_string_t* str, const char sm) +void myhtml_data_process_string_append_char(mycore_string_t* str, const char sm) { - MyHTML_STRING_REALLOC_IF_NEED(str, 2, 0); + MyCORE_STRING_REALLOC_IF_NEED(str, 2, 0); str->data[str->length] = sm; str->length++; @@ -52,7 +52,7 @@ void myhtml_data_process_string_append_char(myhtml_string_t* str, const char sm) str->data[str->length] = '\0'; } -size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size) { size_t tmp_offset = offset; @@ -63,7 +63,7 @@ size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, m tmp_offset += myhtml_string_before_append_any_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), proc_entry->tmp_str_pos_proc); if(offset != tmp_offset) { - if(proc_entry->encoding == MyHTML_ENCODING_UTF_8) + if(proc_entry->encoding == MyENCODING_UTF_8) proc_entry->tmp_str_pos_proc = myhtml_string_append_with_preprocessing(str, &data[tmp_offset], (offset - tmp_offset), proc_entry->emit_null_char); @@ -72,7 +72,7 @@ size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, m myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, &data[tmp_offset], (offset - tmp_offset), proc_entry->encoding, proc_entry->emit_null_char); - myhtml_encoding_result_clean(&proc_entry->res); + myencoding_result_clean(&proc_entry->res); } } @@ -93,7 +93,7 @@ size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, m return offset; } -size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size) { if(data[offset] == '#') { @@ -133,7 +133,7 @@ size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_ent return offset; } -size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size) { size_t tmp_offset = offset; @@ -147,7 +147,7 @@ size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* pro else { /* if current charef is atrribute */ if(proc_entry->is_attributes && - (data[offset] == '=' || myhtml_string_alphanumeric_character[ (unsigned char)data[offset] ] != 0xff)) + (data[offset] == '=' || mycore_string_alphanumeric_character[ (unsigned char)data[offset] ] != 0xff)) { MyHTML_DATA_PROCESS_APPEND_WITH_PREPROCESSING() @@ -157,9 +157,9 @@ size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* pro if(current_entry->codepoints_len) { for (size_t i = 0; i < current_entry->codepoints_len; i++) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 0); - proc_entry->tmp_str_pos += myhtml_encoding_codepoint_to_ascii_utf_8(current_entry->codepoints[i], &str->data[proc_entry->tmp_str_pos]); + proc_entry->tmp_str_pos += myencoding_codepoint_to_ascii_utf_8(current_entry->codepoints[i], &str->data[proc_entry->tmp_str_pos]); } str->length = proc_entry->tmp_str_pos; @@ -178,7 +178,7 @@ size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* pro return offset; } -size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size) { if(data[offset] == 'x' || data[offset] == 'X') { myhtml_data_process_string_append_char(str, data[offset]); @@ -192,14 +192,14 @@ size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* pro return offset; } -size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size) { const unsigned char *u_data = (const unsigned char*)data; size_t tmp_offset = offset; while(offset < size) { - if(myhtml_string_chars_num_map[ u_data[offset] ] == 0xff) + if(mycore_string_chars_num_map[ u_data[offset] ] == 0xff) { proc_entry->state = myhtml_data_process_state_data; @@ -217,7 +217,7 @@ size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t } if(proc_entry->tmp_num <= 0x10FFFF) { - proc_entry->tmp_num = myhtml_string_chars_num_map[ u_data[offset] ] + proc_entry->tmp_num * 10; + proc_entry->tmp_num = mycore_string_chars_num_map[ u_data[offset] ] + proc_entry->tmp_num * 10; } offset++; @@ -228,14 +228,14 @@ size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t return offset; } -size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size) +size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size) { unsigned const char *u_data = (unsigned const char*)data; size_t tmp_offset = offset; while(offset < size) { - if(myhtml_string_chars_hex_map[ u_data[offset] ] == 0xff) + if(mycore_string_chars_hex_map[ u_data[offset] ] == 0xff) { proc_entry->state = myhtml_data_process_state_data; @@ -254,7 +254,7 @@ size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry if(proc_entry->tmp_num <= 0x10FFFF) { proc_entry->tmp_num <<= 4; - proc_entry->tmp_num |= myhtml_string_chars_hex_map[ u_data[offset] ]; + proc_entry->tmp_num |= mycore_string_chars_hex_map[ u_data[offset] ]; } offset++; @@ -265,10 +265,10 @@ size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry return offset; } -void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str) +void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str) { /* 4 is max utf8 byte + \0 */ - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 0); if(proc_entry->tmp_num <= 0x9F) proc_entry->tmp_num = replacement_character[proc_entry->tmp_num]; @@ -278,12 +278,12 @@ void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myht proc_entry->tmp_num = replacement_character[0]; str->length = proc_entry->tmp_str_pos + - myhtml_encoding_codepoint_to_ascii_utf_8(proc_entry->tmp_num, &str->data[proc_entry->tmp_str_pos]); + myencoding_codepoint_to_ascii_utf_8(proc_entry->tmp_num, &str->data[proc_entry->tmp_str_pos]); str->data[str->length] = '\0'; } -void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t size) +void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t size) { size_t offset = 0; @@ -292,16 +292,16 @@ void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_ } } -void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str) +void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str) { if(proc_entry->state == myhtml_data_process_state_ampersand_data && proc_entry->charef_res.last_entry) { const charef_entry_t *entry = proc_entry->charef_res.last_entry; for (size_t i = 0; i < entry->codepoints_len; i++) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 0); - proc_entry->tmp_str_pos += myhtml_encoding_codepoint_to_ascii_utf_8(entry->codepoints[i], &str->data[proc_entry->tmp_str_pos]); + proc_entry->tmp_str_pos += myencoding_codepoint_to_ascii_utf_8(entry->codepoints[i], &str->data[proc_entry->tmp_str_pos]); } str->length = proc_entry->tmp_str_pos; diff --git a/source/myhtml/data_process.h b/source/myhtml/data_process.h index 558a5aa..a461d10 100644 --- a/source/myhtml/data_process.h +++ b/source/myhtml/data_process.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -35,8 +35,8 @@ struct myhtml_data_process_entry { myhtml_data_process_state_f state; /* for encodings */ - myhtml_encoding_t encoding; - myhtml_encoding_result_t res; + myencoding_t encoding; + myencoding_result_t res; /* temp */ size_t tmp_str_pos_proc; @@ -53,16 +53,16 @@ struct myhtml_data_process_entry { void myhtml_data_process_entry_clean(myhtml_data_process_entry_t* proc_entry); -void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t size); -void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); +void myhtml_data_process(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t size); +void myhtml_data_process_end(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str); -size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char *data, size_t offset, size_t size); -size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str, const char* data, size_t offset, size_t size); -void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, myhtml_string_t* str); +size_t myhtml_data_process_state_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char *data, size_t offset, size_t size); +size_t myhtml_data_process_state_ampersand_hash_x_data(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str, const char* data, size_t offset, size_t size); +void myhtml_data_process_state_end(myhtml_data_process_entry_t* proc_entry, mycore_string_t* str); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myhtml/def.h b/source/myhtml/def.h index 389b198..8ec75e6 100644 --- a/source/myhtml/def.h +++ b/source/myhtml/def.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/encoding.c b/source/myhtml/encoding.c deleted file mode 100644 index d7a7807..0000000 --- a/source/myhtml/encoding.c +++ /dev/null @@ -1,1222 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/encoding.h" -#include "myhtml/encoding_resource.h" -#include "myhtml/utils/resources.h" - - - -myhtml_encoding_custom_f myhtml_encoding_get_function_by_id(myhtml_encoding_t idx) -{ - return myhtml_encoding_function_index[idx]; -} - -enum myhtml_encoding_status myhtml_encoding_decode_utf_8(unsigned const char data, myhtml_encoding_result_t *res) -{ - // res->first -- lower boundary - // res->second -- upper boundary - // res->result -- code point - // res->third -- bytes seen - // res->flag -- bytes needed - - if(res->flag == 0) - { - if(data <= 0x7F) { - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - else if(data >= 0xC2 && data <= 0xDF) { - res->flag = 1; - res->result = data - 0xC0; - } - else if(data >= 0xE0 && data <= 0xEF) { - if(data == 0xE0) { - res->first = 0xA0; - } - else if(data == 0xED){ - res->second = 0x9F; - } - - res->flag = 2; - res->result = data - 0xE0; - } - else if(data >= 0xF0 && data <= 0xF4) { - if(data == 0xF0) { - res->first = 0x90; - } - else if(data == 0xF4){ - res->second = 0x8F; - } - - res->flag = 2; - res->result = data - 0xF0; - } - else - return MyHTML_ENCODING_STATUS_ERROR; - - res->result = res->result << (6 * res->flag); - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - if(data < res->first && data > res->second) - { - res->result = 0x00; - res->flag = 0x00; - res->third = 0x00; - res->first = 0x80; - res->second = 0xBF; - - return MyHTML_ENCODING_STATUS_DONE|MyHTML_ENCODING_STATUS_ERROR; - } - - res->first = 0x80; - res->second = 0xBF; - - res->third++; - res->result += (unsigned long)(data - 0x80) << (6 * (res->flag - res->third)); - - if(res->third != res->flag) - return MyHTML_ENCODING_STATUS_CONTINUE; - - res->flag = 0x00; - res->third = 0x00; - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_ibm866(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_ibm866[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_2(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_2[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_3(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_3[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_4(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_4[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_5(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_5[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_6(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_6[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_7(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_7[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_8[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8_i(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_8[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_10(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_10[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_13(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_13[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_14(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_14[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_15(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_15[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_16(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_iso_8859_16[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_koi8_r(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_koi8_r[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_koi8_u(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_koi8_u[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_macintosh(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_macintosh[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_874(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_874[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1250(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1250[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1251(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1251[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1252(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1252[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1253(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1253[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1254(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1254[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1255(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1255[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1256(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1256[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1257(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1257[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_windows_1258(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_windows_1258[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_x_mac_cyrillic(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - (res->result = data); - else - (res->result = myhtml_encoding_map_x_mac_cyrillic[(data - 0x80)]); - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_gbk(unsigned const char data, myhtml_encoding_result_t *res) -{ - return myhtml_encoding_decode_gb18030(data, res); -} - -unsigned long myhtml_encoding_index_gb18030_ranges_code_point(unsigned long pointer) -{ - // step 1 - if((pointer > 39419 && pointer < 189000) || pointer > 1237575) - return 0; - - // step 2 - if(pointer == 7457) - return 0xe7c7; - - // step 3 - unsigned long offset = sizeof(myhtml_encoding_map_gb18030_ranges) / (sizeof(unsigned long) * 2); - - unsigned long code_point_offset = 0; - while (offset) { - offset--; - - if(myhtml_encoding_map_gb18030_ranges[offset][0] == pointer || - myhtml_encoding_map_gb18030_ranges[offset][0] < pointer) - { - code_point_offset = myhtml_encoding_map_gb18030_ranges[offset][1]; - break; - } - } - - // step 4 - return (code_point_offset + pointer - offset); -} - -enum myhtml_encoding_status myhtml_encoding_decode_gb18030(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(res->third) { - if(data >= 0x30 && data <= 0x39) { - res->result = myhtml_encoding_index_gb18030_ranges_code_point((((res->first - 0x81) * 10 + res->second - 0x30) * - 126 + res->third - 0x81) * 10 + data - 0x30); - } - - res->first = 0; - res->second = 0; - res->third = 0; - - if(res->result) - return MyHTML_ENCODING_STATUS_OK; - - return MyHTML_ENCODING_STATUS_ERROR; - } - else if(res->second) { - if(data >= 0x81 && data <= 0xFE) { - res->third = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - res->first = 0; - res->second = 0; - - return MyHTML_ENCODING_STATUS_ERROR; - } - else if(res->first) { - if(data >= 0x30 && data <= 0x39) { - res->second = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - unsigned long lead = res->first, pointer = 0x00; - res->first = 0x00; - - unsigned char offset; - - if(data < 0x7F) - offset = 0x40; - else - offset = 0x41; - - if((data >= 0x40 && data <= 0x7E) || - (data >= 0x80 && data <= 0xFE)) - { - pointer = (lead - 0x81) * 190 + (data - offset); - } - else { - return MyHTML_ENCODING_STATUS_ERROR; - } - - res->result = myhtml_encoding_map_gb18030[pointer]; - return MyHTML_ENCODING_STATUS_OK; - } - - if(data <= 0x7F) { - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - if(data == 0x80) { - res->result = 0x20ac; - return MyHTML_ENCODING_STATUS_OK; - } - - if(data >= 0x81 && data <= 0xFE) { - res->first = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - return MyHTML_ENCODING_STATUS_ERROR; -} - -enum myhtml_encoding_status myhtml_encoding_decode_big5(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(res->first) - { - unsigned long lead = res->first; - unsigned long pointer = 0x00; - unsigned long offset; - - res->first = 0x00; - - if(data < 0x7F) - offset = 0x40; - else - offset = 0x62; - - if((data >= 0x40 && data <= 0x7E) || - (data >= 0xA1 && data <= 0xFE)) - { - pointer = (lead - 0x81) * 157 + (data - offset); - } - - switch (pointer) { - case 1133: - // U+00CA U+0304 - res->result = 0x00ca; - res->result_aux = 0x0304; - return MyHTML_ENCODING_STATUS_OK; - case 1135: - // U+00CA U+030C - res->result = 0x00ca; - res->result_aux = 0x030c; - return MyHTML_ENCODING_STATUS_OK; - case 1164: - // U+00EA U+0304 - res->result = 0x00ea; - res->result_aux = 0x0304; - return MyHTML_ENCODING_STATUS_OK; - case 1166: - // U+00EA U+030C - res->result = 0x00ea; - res->result_aux = 0x030c; - return MyHTML_ENCODING_STATUS_OK; - default: - break; - } - - if(pointer == 0) - return MyHTML_ENCODING_STATUS_ERROR; - - res->result = myhtml_encoding_map_big5[pointer]; - res->result_aux = 0; - - return MyHTML_ENCODING_STATUS_OK; - } - - if(data <= 0x7F) { - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - if(data >= 0x81 && data <= 0xFE) { - res->first = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - return MyHTML_ENCODING_STATUS_ERROR; -} - -enum myhtml_encoding_status myhtml_encoding_decode_euc_jp(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(res->first == 0x8E && (data >= 0xA1 && data <= 0xDF)) { - res->first = 0x00; - res->result = 0xFF61 + data - 0xA1; - - return MyHTML_ENCODING_STATUS_OK; - } - else if(res->first == 0x8F && (data >= 0xA1 && data <= 0xFE)) { - res->flag = 1; - res->first = data; - - return MyHTML_ENCODING_STATUS_CONTINUE; - } - else if(res->first) - { - unsigned long lead = res->first; - res->first = 0x00; - - if((lead >= 0xA1 && lead <= 0xFE) && - (data >= 0xA1 && data <= 0xFE)) - { - unsigned long idx = (lead - 0xA1) * 94 + data - 0xA1; - if(res->flag) { - res->result = myhtml_encoding_map_jis0212[idx]; - } - else { - res->result = myhtml_encoding_map_jis0208[idx]; - } - - res->flag = 0; - - if(res->result == 0) - return MyHTML_ENCODING_STATUS_ERROR; - - return MyHTML_ENCODING_STATUS_OK; - } - } - - if(data <= 0x7F) { - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - if((data >= 0x8E && data <= 0x8F) || - (data >= 0xA1 && data <= 0xFE)) - { - res->first = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - return MyHTML_ENCODING_STATUS_ERROR; -} - -enum myhtml_encoding_status myhtml_encoding_decode_iso_2022_jp(unsigned const char data, myhtml_encoding_result_t *res) -{ - // res->first -- lead - // res->second -- state - // res->third -- output state - // res->flag -- output flag - - switch (res->second) { - case 0: // ASCII - { - if(data == 0x1B) { - res->second = 6; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - else if((data <= 0x7F) && - data != 0x0E && data != 0x0F && data != 0x1B) - { - res->flag = 0; - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - res->flag = 0; - return MyHTML_ENCODING_STATUS_ERROR; - } - - case 1: // Roman - { - if(data == 0x1B) { - res->second = 6; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - else if(data == 0x5C) { - res->flag = 0; - res->result = 0x00A5; - return MyHTML_ENCODING_STATUS_OK; - } - else if(data == 0x7E) { - res->flag = 0; - res->result = 0x203E; - return MyHTML_ENCODING_STATUS_OK; - } - else if((data <= 0x7F) && - data != 0x0E && data != 0x0F && - data != 0x1B && data != 0x5C && - data != 0x7E) - { - res->flag = 0; - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - res->flag = 0; - return MyHTML_ENCODING_STATUS_ERROR; - } - - case 3: // Katakana - { - if(data == 0x1B) { - res->second = 6; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - else if(data >= 0x21 && data <= 0x5F) { - res->flag = 0; - res->result = 0xFF61 + data - 0x21; - - return MyHTML_ENCODING_STATUS_OK; - } - - res->flag = 0; - return MyHTML_ENCODING_STATUS_ERROR; - } - - case 4: // Lead byte - { - if(data == 0x1B) { - res->second = 6; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - else if(data >= 0x21 && data <= 0x7E) { - res->flag = 0; - res->first = data; - res->second = 5; - - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - res->flag = 0; - return MyHTML_ENCODING_STATUS_ERROR; - } - - case 5: // Trail byte - { - if(data == 0x1B) { - res->second = 6; - return MyHTML_ENCODING_STATUS_CONTINUE|MyHTML_ENCODING_STATUS_ERROR; - } - else if(data >= 0x21 && data <= 0x7E) { - res->second = 4; - - unsigned long pointer = (res->first - 0x21) * 94 + data - 0x21; - res->result = myhtml_encoding_map_jis0208[pointer]; - - if(res->result == 0) - return MyHTML_ENCODING_STATUS_ERROR; - - return MyHTML_ENCODING_STATUS_OK; - } - - res->second = 4; - return MyHTML_ENCODING_STATUS_ERROR; - } - - case 6: // Escape start - { - if(data == 0x24 || data == 0x28) { - res->first = data; - res->second = 7; - - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - res->flag = 0; - res->second = res->third; - - return MyHTML_ENCODING_STATUS_ERROR; - } - - case 7: // Escape - { - unsigned long lead = res->first; - res->first = 0x00; - - res->second = 0x00; - - if(lead == 0x28 && data == 0x42) { - res->second = 0; - } - else if(lead == 0x28 && data == 0x4A) { - res->second = 1; - } - else if(lead == 0x28 && data == 0x49) { - res->second = 2; - } - else if(lead == 0x24 && (data == 0x40 || data == 0x42)) { - res->second = 4; - } - - if(res->second) - { - res->third = res->second; - - unsigned long output_flag = res->flag; - res->flag = 1; - - if(output_flag) - return MyHTML_ENCODING_STATUS_ERROR; - - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - res->flag = 0; - res->second = res->third; - - return MyHTML_ENCODING_STATUS_ERROR; - } - - default: - break; - } - - return 0; -} - -enum myhtml_encoding_status myhtml_encoding_decode_shift_jis(unsigned const char data, myhtml_encoding_result_t *res) -{ - // res->first -- lead - - if(res->first) - { - unsigned long offset; - unsigned long lead_offset; - - if(data < 0x7F) - offset = 0x40; - else - offset = 0x41; - - if(res->first < 0xA0) - lead_offset = 0x81; - else - lead_offset = 0xC1; - - unsigned long pointer = 0x00; - if((data >= 0x40 && data <= 0x7E) || - (data >= 0x80 && data <= 0xFC)) - { - pointer = (res->first - lead_offset) * 188 + data - offset; - } - - if(pointer) - res->result = myhtml_encoding_map_jis0208[pointer]; - else - res->result = 0x00; - - if(res->result == 0x00 && (pointer >= 8836 && pointer <= 10528)) { - res->result = 0xE000 + pointer - 8836; - } - - if(res->result) - return MyHTML_ENCODING_STATUS_OK; - - return MyHTML_ENCODING_STATUS_ERROR; - } - - if((data <= 0x7F) || data == 0x80) { - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - if(data >= 0xA1 && data <= 0xDF) { - res->result = 0xFF61 + data - 0xA1; - return MyHTML_ENCODING_STATUS_OK; - } - - if((data >= 0x81 && data <= 0x9F) || - (data >= 0xE0 && data <= 0xFC)) { - res->first = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - return MyHTML_ENCODING_STATUS_ERROR; -} - -enum myhtml_encoding_status myhtml_encoding_decode_euc_kr(unsigned const char data, myhtml_encoding_result_t *res) -{ - // res->first -- lead - - if(res->first) - { - unsigned long lead = res->first, pointer = 0x00; - res->first = 0x00; - - if(data >= 0x41 && data <= 0xFE) { - pointer = (lead - 0x81) * 190 + (data - 0x41); - } - - if(pointer) - res->result = myhtml_encoding_map_euc_kr[pointer]; - - if(res->result) - return MyHTML_ENCODING_STATUS_OK; - - return MyHTML_ENCODING_STATUS_ERROR; - } - - if(data <= 0x7F) { - res->result = data; - return MyHTML_ENCODING_STATUS_OK; - } - - if(data >= 0x81 && data <= 0xFE) { - res->first = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - return MyHTML_ENCODING_STATUS_ERROR; -} - -enum myhtml_encoding_status myhtml_encoding_decode_shared_utf_16(unsigned const char data, myhtml_encoding_result_t *res) -{ - // res->first -- lead - // res->second -- lead surrogate - // res->flag -- flag - - if(res->first == 0x00) { - res->first = data; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - unsigned long code_unit; - if(res->flag) - (code_unit = (res->first << 8) + data); - else - (code_unit = (unsigned long)(data << 8) + res->first); - - res->first = 0x00; - - if(res->second) { - unsigned long lead_surrogate = res->second; - res->second = 0x00; - - if(code_unit >= 0xDC00 && code_unit <= 0xDFFF) { - res->result = 0x10000 + ((lead_surrogate - 0xD800) << 10) + (code_unit - 0xDC00); - return MyHTML_ENCODING_STATUS_OK; - } - - unsigned char byte1 = (unsigned char)(code_unit >> 8); - unsigned char byte2 = (unsigned char)(code_unit & 0x00FF); - - if(res->flag) { - res->result = byte1; - res->result_aux = byte2; - } - else { - res->result = byte2; - res->result_aux = byte1; - } - - return MyHTML_ENCODING_STATUS_DONE|MyHTML_ENCODING_STATUS_ERROR; - } - - if(code_unit >= 0xD800 && code_unit <= 0xDBFF) { - res->second = code_unit; - return MyHTML_ENCODING_STATUS_CONTINUE; - } - - if(code_unit >= 0xDC00 && code_unit <= 0xDFFF) { - return MyHTML_ENCODING_STATUS_ERROR; - } - - res->result = code_unit; - - return MyHTML_ENCODING_STATUS_OK; -} - -enum myhtml_encoding_status myhtml_encoding_decode_utf_16be(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(res->flag == 0) - res->flag = 1; - - return myhtml_encoding_decode_shared_utf_16(data, res); -} - -enum myhtml_encoding_status myhtml_encoding_decode_utf_16le(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(res->flag) - res->flag = 0; - - return myhtml_encoding_decode_shared_utf_16(data, res); -} - -enum myhtml_encoding_status myhtml_encoding_decode_x_user_defined(unsigned const char data, myhtml_encoding_result_t *res) -{ - if(data <= 0x7F) - res->result = data; - else - res->result = 0xF780 + data - 0x80; - - return MyHTML_ENCODING_STATUS_OK; -} - -void myhtml_encoding_result_clean(myhtml_encoding_result_t *res) -{ - memset(res, 0, sizeof(myhtml_encoding_result_t)); -} - -size_t myhtml_encoding_codepoint_ascii_length(size_t codepoint) -{ - if (codepoint <= 0x0000007F) { - return 1; - } - else if (codepoint <= 0x000007FF) { - return 2; - } - else if (codepoint <= 0x0000FFFF) { - return 3; - } - else if (codepoint <= 0x001FFFFF) { - return 4; - } - /* not uses in unicode */ - else if (codepoint <= 0x03FFFFFF) { - return 5; - } - else if (codepoint <= 0x7FFFFFFF) { - return 6; - } - - return 0; -} - -size_t myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data) -{ - /* 0x80 -- 10xxxxxx */ - /* 0xC0 -- 110xxxxx */ - /* 0xE0 -- 1110xxxx */ - /* 0xF0 -- 11110xxx */ - /* 0xF8 -- 111110xx */ - /* 0xFC -- 1111110x */ - - if (codepoint <= 0x0000007F) { - /* 0xxxxxxx */ - data[0] = (char)codepoint; - return 1; - } - else if (codepoint <= 0x000007FF) { - /* 110xxxxx 10xxxxxx */ - data[0] = (char)(0xC0 | (codepoint >> 6 )); - data[1] = (char)(0x80 | (codepoint & 0x3F)); - - return 2; - } - else if (codepoint <= 0x0000FFFF) { - /* 1110xxxx 10xxxxxx 10xxxxxx */ - data[0] = (char)(0xE0 | ((codepoint >> 12))); - data[1] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); - data[2] = (char)(0x80 | ( codepoint & 0x3F)); - - return 3; - } - else if (codepoint <= 0x001FFFFF) { - /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - data[0] = (char)(0xF0 | ( codepoint >> 18)); - data[1] = (char)(0x80 | ((codepoint >> 12) & 0x3F)); - data[2] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); - data[3] = (char)(0x80 | ( codepoint & 0x3F)); - - return 4; - } - /* not uses in unicode */ - // else if (codepoint <= 0x03FFFFFF) { - // /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - // data[0] = 0xF8 | ( codepoint >> 24); - // data[1] = 0x80 | ((codepoint >> 18) & 0x3F); - // data[2] = 0x80 | ((codepoint >> 12) & 0x3F); - // data[3] = 0x80 | ((codepoint >> 6 ) & 0x3F); - // data[4] = 0x80 | ( codepoint & 0x3F); - // - // return 5; - // } - // else if (codepoint <= 0x7FFFFFFF) { - // /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - // data[0] = 0xFC | ( codepoint >> 30); - // data[1] = 0x80 | ((codepoint >> 24) & 0x3F); - // data[2] = 0x80 | ((codepoint >> 18) & 0x3F); - // data[3] = 0x80 | ((codepoint >> 12) & 0x3F); - // data[4] = 0x80 | ((codepoint >> 6 ) & 0x3F); - // data[5] = 0x80 | ( codepoint & 0x3F); - // - // return 6; - // } - - return 0; -} - -size_t myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data) -{ - /* 0x80 -- 10xxxxxx */ - /* 0xC0 -- 110xxxxx */ - /* 0xE0 -- 1110xxxx */ - /* 0xF0 -- 11110xxx */ - /* 0xF8 -- 111110xx */ - /* 0xFC -- 1111110x */ - - if (codepoint <= 0x0000007F) { - /* 0xxxxxxx */ - data[0] = (char)myhtml_string_chars_lowercase_map[ codepoint ]; - return 1; - } - else if (codepoint <= 0x000007FF) { - /* 110xxxxx 10xxxxxx */ - data[0] = (char)(0xC0 | (codepoint >> 6 )); - data[1] = (char)(0x80 | (codepoint & 0x3F)); - - return 2; - } - else if (codepoint <= 0x0000FFFF) { - /* 1110xxxx 10xxxxxx 10xxxxxx */ - data[0] = (char)(0xE0 | ((codepoint >> 12))); - data[1] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); - data[2] = (char)(0x80 | ( codepoint & 0x3F)); - - return 3; - } - else if (codepoint <= 0x001FFFFF) { - /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - data[0] = (char)(0xF0 | ( codepoint >> 18)); - data[1] = (char)(0x80 | ((codepoint >> 12) & 0x3F)); - data[2] = (char)(0x80 | ((codepoint >> 6 ) & 0x3F)); - data[3] = (char)(0x80 | ( codepoint & 0x3F)); - - return 4; - } - /* not uses in unicode */ - // else if (codepoint <= 0x03FFFFFF) { - // /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - // data[0] = 0xF8 | ( codepoint >> 24); - // data[1] = 0x80 | ((codepoint >> 18) & 0x3F); - // data[2] = 0x80 | ((codepoint >> 12) & 0x3F); - // data[3] = 0x80 | ((codepoint >> 6 ) & 0x3F); - // data[4] = 0x80 | ( codepoint & 0x3F); - // - // return 5; - // } - // else if (codepoint <= 0x7FFFFFFF) { - // /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - // data[0] = 0xFC | ( codepoint >> 30); - // data[1] = 0x80 | ((codepoint >> 24) & 0x3F); - // data[2] = 0x80 | ((codepoint >> 18) & 0x3F); - // data[3] = 0x80 | ((codepoint >> 12) & 0x3F); - // data[4] = 0x80 | ((codepoint >> 6 ) & 0x3F); - // data[5] = 0x80 | ( codepoint & 0x3F); - // - // return 6; - // } - - return 0; -} - -size_t myhtml_encoding_ascii_utf_8_to_codepoint(const unsigned char* data, size_t* codepoint) -{ - if (*data < 0x80){ - /* 0xxxxxxx */ - *codepoint = (size_t)*data; - return 1; - } - else if ((*data & 0xe0) == 0xc0) { - /* 110xxxxx 10xxxxxx */ - *codepoint = (data[0] ^ (0xC0 & data[0])) << 6; - *codepoint |= (data[1] ^ (0x80 & data[1])); - - return 2; - } - else if ((*data & 0xf0) == 0xe0) { - /* 1110xxxx 10xxxxxx 10xxxxxx */ - *codepoint = (data[0] ^ (0xE0 & data[0])) << 12; - *codepoint |= (data[1] ^ (0x80 & data[1])) << 6; - *codepoint |= (data[2] ^ (0x80 & data[2])); - - return 3; - } - else if ((*data & 0xf8) == 0xf0) { - /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - *codepoint = (data[0] ^ (0xF0 & data[0])) << 18; - *codepoint |= (data[1] ^ (0x80 & data[1])) << 12; - *codepoint |= (data[2] ^ (0x80 & data[2])) << 6; - *codepoint |= (data[3] ^ (0x80 & data[3])); - - return 4; - } - - return 0; -} - -size_t myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data) -{ - if((codepoint >> 16)) { - codepoint -= 0x10000; - - size_t high = 0xD800 | (codepoint >> 10); - size_t low = 0xDC00 | (codepoint & 0x3FF); - - data[0] = (char)(high >> 8); - data[1] = (char)high; - data[2] = (char)(low >> 8); - data[3] = (char)low; - - return 4; - } - - data[0] = (char)(codepoint >> 8); - data[1] = (char)codepoint; - - return 2; -} - -size_t myhtml_encoding_convert_to_ascii_utf_8(myhtml_string_raw_t* raw_str, const char* buff, size_t length, myhtml_encoding_t encoding) -{ - if(raw_str->data == NULL) { - raw_str->size = length + 1; - raw_str->length = 0; - raw_str->data = myhtml_malloc(sizeof(char) * raw_str->size); - - if(raw_str->data == NULL) - return 0; - } - - myhtml_encoding_result_t res = {0}; - - unsigned const char* u_buff = (unsigned const char*)buff; - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); - - size_t i; - for (i = 0; i < length; i++) - { - if(func(u_buff[i], &res) == MyHTML_ENCODING_STATUS_OK) { - if((raw_str->length + 6) >= raw_str->size) { - size_t new_size = raw_str->length + 6 + (length / 2); - char *new_data = myhtml_realloc(raw_str->data, sizeof(char) * new_size); - - if(new_data == NULL) { - return 0; - } - - raw_str->data = new_data; - raw_str->size = new_size; - } - - raw_str->length += myhtml_encoding_codepoint_to_ascii_utf_8(res.result, &raw_str->data[raw_str->length]); - } - } - - return i; -} - - diff --git a/source/myhtml/encoding.h b/source/myhtml/encoding.h deleted file mode 100644 index e575690..0000000 --- a/source/myhtml/encoding.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_ENCODING_H -#define MyHTML_ENCODING_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" -#include "myhtml/utils.h" -#include "myhtml/mystring.h" - -enum myhtml_encoding_status { - MyHTML_ENCODING_STATUS_OK = 0x00, - MyHTML_ENCODING_STATUS_ERROR = 0x01, - MyHTML_ENCODING_STATUS_CONTINUE = 0x02, - MyHTML_ENCODING_STATUS_DONE = 0x04 -} -typedef myhtml_encoding_status_t; - -struct myhtml_encoding_result { - unsigned long first; - unsigned long second; - unsigned long third; - unsigned long result; - unsigned long result_aux; - unsigned long flag; -}; - -struct myhtml_encoding_trigram { - const unsigned char trigram[3]; - size_t value; -}; - -struct myhtml_encoding_trigram_result { - size_t count; - size_t value; -}; - -struct myhtml_encoding_unicode_result { - size_t count_ascii; - size_t count_good; - size_t count_bad; -}; - -struct myhtml_encoding_detect_name_entry { - const char* name; - size_t name_length; - const char* label; - size_t label_length; - - myhtml_encoding_t encoding; - - size_t next; - size_t curr; -}; - -struct myhtml_encoding_detect_attr { - size_t key_begin; - size_t key_length; - size_t value_begin; - size_t value_length; - - myhtml_encoding_detect_attr_t *next; -}; - -struct myhtml_encoding_entry_name_index { - const char *name; - size_t length; -}; - -typedef myhtml_encoding_status_t (*myhtml_encoding_custom_f)(unsigned const char data, myhtml_encoding_result_t *res); - -myhtml_encoding_custom_f myhtml_encoding_get_function_by_id(myhtml_encoding_t idx); - -enum myhtml_encoding_status myhtml_encoding_decode_utf_8(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_ibm866(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_2(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_3(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_4(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_5(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_6(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_7(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_8_i(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_10(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_13(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_14(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_15(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_8859_16(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_koi8_r(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_koi8_u(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_macintosh(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_874(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1250(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1251(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1252(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1253(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1254(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1255(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1256(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1257(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_windows_1258(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_x_mac_cyrillic(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_gbk(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_gb18030(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_big5(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_euc_jp(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_iso_2022_jp(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_shift_jis(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_euc_kr(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_shared_utf_16(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_utf_16be(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_utf_16le(unsigned const char data, myhtml_encoding_result_t *res); -enum myhtml_encoding_status myhtml_encoding_decode_x_user_defined(unsigned const char data, myhtml_encoding_result_t *res); - -size_t myhtml_encoding_codepoint_ascii_length(size_t codepoint); -size_t myhtml_encoding_codepoint_to_ascii_utf_8(size_t codepoint, char *data); -size_t myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(size_t codepoint, char *data); -size_t myhtml_encoding_codepoint_to_ascii_utf_16(size_t codepoint, char *data); -size_t myhtml_encoding_ascii_utf_8_to_codepoint(const unsigned char* data, size_t* codepoint); - -void myhtml_encoding_result_clean(myhtml_encoding_result_t *res); - -bool myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding); -bool myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, const char **new_text, size_t *new_size); - -size_t myhtml_encoding_convert_to_ascii_utf_8(myhtml_string_raw_t* raw_str, const char* buff, size_t length, myhtml_encoding_t encoding); - -const myhtml_encoding_detect_name_entry_t * myhtml_encoding_name_entry_by_name(const char* name, size_t length); -bool myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding); -const char * myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length); - -myhtml_encoding_t myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* encoding_h */ diff --git a/source/myhtml/encoding_detect.c b/source/myhtml/encoding_detect.c deleted file mode 100644 index 4dc0842..0000000 --- a/source/myhtml/encoding_detect.c +++ /dev/null @@ -1,948 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/encoding.h" -#include "myhtml/encoding_detect_resource.h" -#include "myhtml/utils/resources.h" - -myhtml_encoding_trigram_result_t myhtml_encoding_detect_by_trigram(unsigned const char *u_text, size_t length, - const myhtml_encoding_trigram_t *list, size_t list_length, - size_t max_sum_for_break) -{ - myhtml_encoding_trigram_result_t res = {0, 0}; - - for (size_t i = 0; i < (length - 3); i++) { - if(u_text[i] > 127) - { - for (size_t j = 0; j < list_length; j++) - { - if(memcmp(list[j].trigram, &u_text[i], 3) == 0) { - res.value += list[j].value; - res.count++; - - if(res.value >= max_sum_for_break) - i = length; - - break; - } - } - } - } - - return res; -} - -bool myhtml_encoding_detect_russian_has_end(myhtml_encoding_trigram_result_t *res, size_t min_count, size_t min_value) -{ - if(res->value >= min_value || res->count >= min_count) - return true; - - return false; -} - -bool myhtml_encoding_detect_unicode_has_end(myhtml_encoding_unicode_result_t *res, size_t max_bad_percent) -{ - if(res->count_good == 0) { - if(res->count_bad) - return false; - - return true; - } - else if(res->count_bad == 0) - return true; - - size_t percent_bad = (res->count_bad * 100) / res->count_good; - if(percent_bad < max_bad_percent) - return true; - - return false; -} - -myhtml_encoding_unicode_result_t myhtml_encoding_detect_utf_8(unsigned const char *u_text, size_t length) -{ - size_t i = 0; - myhtml_encoding_unicode_result_t res = {0, 0, 0}; - - while(i < length) - { - if((u_text[i] & 0x80) == 0x00) { - i++; - res.count_ascii++; - } - else if((u_text[i] & 0xE0) == 0xC0) { - i += 2; - - if(i >= length) - break; - - if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0)) - res.count_good++; - else - res.count_bad++; - } - else if((u_text[i] & 0xF0) == 0xE0) { - i += 3; - - if(i >= length) - break; - - if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0) && - ((u_text[i - 2] & 0x80) && (u_text[i - 2] & 0x40) == 0)) { - res.count_good++; - } - else - res.count_bad++; - } - else if((u_text[i] & 0xF8) == 0xF0) { - i += 4; - - if(i >= length) - break; - - if(((u_text[i - 1] & 0x80) && (u_text[i - 1] & 0x40) == 0) && - ((u_text[i - 2] & 0x80) && (u_text[i - 2] & 0x40) == 0) && - ((u_text[i - 3] & 0x80) && (u_text[i - 3] & 0x40) == 0)) { - res.count_good++; - } - else - res.count_bad++; - } - else { - i++; - res.count_bad++; - } - } - - return res; -} - -myhtml_encoding_unicode_result_t myhtml_encoding_detect_utf_16(unsigned const char *u_text, size_t length) -{ - size_t i = 0; - myhtml_encoding_unicode_result_t res = {0, 0, 0}; - - while(i < length) - { - if(u_text[i] == 0x00) { - if((i % 2) == 0) { - i++; - - if(u_text[i] > 0x1F && u_text[i] < 0x7F) - res.count_bad++; - } - else { - if(u_text[(i - 1)] > 0x1F && u_text[(i - 1)] < 0x7F) - res.count_good++; - - i++; - } - } - else - i++; - } - - return res; -} - -bool myhtml_encoding_detect_bom(const char *text, size_t length, myhtml_encoding_t *encoding) -{ - unsigned const char *u_text = (unsigned const char*)text; - - if(length > 2) { - if(u_text[0] == 0xEF && - u_text[1] == 0xBB && - u_text[2] == 0xBF) - { - *encoding = MyHTML_ENCODING_UTF_8; - return true; - } - } - - if(length > 1) { - if(u_text[0] == 0xFE && u_text[1] == 0xFF) { - *encoding = MyHTML_ENCODING_UTF_16BE; - return true; - } - - if(u_text[0] == 0xFF && u_text[1] == 0xFE) { - *encoding = MyHTML_ENCODING_UTF_16LE; - return true; - } - } - -// //for UTF-32 -// if(length > 3) { -// if(u_text[0] == 0x00 && -// u_text[1] == 0x00 && -// u_text[2] == 0xFE && -// u_text[3] == 0xFF) -// { -// *encoding = MyHTML_ENCODING_UTF_32BE; -// return true; -// } -// -// if(u_text[0] == 0xFF && -// u_text[1] == 0xFE && -// u_text[2] == 0x00 && -// u_text[3] == 0x00) -// { -// *encoding = MyHTML_ENCODING_UTF_32LE; -// return true; -// } -// } - - return false; -} - -bool myhtml_encoding_detect_and_cut_bom(const char *text, size_t length, myhtml_encoding_t *encoding, const char **new_text, size_t *new_size) -{ - if(myhtml_encoding_detect_bom(text, length, encoding)) - { - if(*encoding == MyHTML_ENCODING_UTF_8) { - *new_text = &text[3]; - *new_size = length - 3; - } - else { - *new_text = &text[2]; - *new_size = length - 2; - } - - return true; - } - - return false; -} - -bool myhtml_encoding_detect_unicode(const char *text, size_t length, myhtml_encoding_t *encoding) -{ - unsigned const char *u_text = (unsigned const char*)text; - *encoding = MyHTML_ENCODING_DEFAULT; - - myhtml_encoding_unicode_result_t res = myhtml_encoding_detect_utf_16(u_text, length); - - if(res.count_bad == 0 && res.count_good >= 3) { - *encoding = MyHTML_ENCODING_UTF_16LE; - return true; - } - else if(res.count_bad >= 3 && res.count_good == 0) { - *encoding = MyHTML_ENCODING_UTF_16BE; - return true; - } - - res = myhtml_encoding_detect_utf_8(u_text, length); - if(myhtml_encoding_detect_unicode_has_end(&res, 10)) { - *encoding = MyHTML_ENCODING_UTF_8; - return true; - } - - return false; -} - -bool myhtml_encoding_detect_russian(const char *text, size_t length, myhtml_encoding_t *encoding) -{ - unsigned const char *u_text = (unsigned const char*)text; - - size_t min_count = 50; - size_t min_value = 100000; - size_t max_value = 0; - - *encoding = MyHTML_ENCODING_DEFAULT; - - myhtml_encoding_trigram_result_t - res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_windows_1251, 1000, min_value); - if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { - *encoding = MyHTML_ENCODING_WINDOWS_1251; - return true; - } - - max_value = res.value; - if(max_value) { - *encoding = MyHTML_ENCODING_WINDOWS_1251; - } - - res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_koi8_r, 1000, min_value); - if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { - *encoding = MyHTML_ENCODING_KOI8_R; - return true; - } - - if(max_value < res.value) { - *encoding = MyHTML_ENCODING_KOI8_R; - max_value = res.value; - } - - res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_iso_8859_5, 1000, min_value); - if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { - *encoding = MyHTML_ENCODING_ISO_8859_5; - return true; - } - - if(max_value < res.value) { - *encoding = MyHTML_ENCODING_ISO_8859_5; - max_value = res.value; - } - - res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_x_mac_cyrillic, 1000, min_value); - if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { - *encoding = MyHTML_ENCODING_X_MAC_CYRILLIC; - return true; - } - - if(max_value < res.value) { - *encoding = MyHTML_ENCODING_X_MAC_CYRILLIC; - max_value = res.value; - } - - res = myhtml_encoding_detect_by_trigram(u_text, length, myhtml_encoding_detect_trigrams_index_ibm866, 1000, min_value); - if(myhtml_encoding_detect_russian_has_end(&res, min_count, min_value)) { - *encoding = MyHTML_ENCODING_IBM866; - return true; - } - - if(max_value < res.value) { - *encoding = MyHTML_ENCODING_IBM866; - } - - return false; -} - -bool myhtml_encoding_detect(const char *text, size_t length, myhtml_encoding_t *encoding) -{ - *encoding = MyHTML_ENCODING_DEFAULT; - - if(myhtml_encoding_detect_unicode(text, length, encoding)) - return true; - - if(myhtml_encoding_detect_russian(text, length, encoding)) - return true; - - return false; -} - -const myhtml_encoding_detect_name_entry_t * myhtml_encoding_name_entry_by_name(const char* name, size_t length) -{ - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * - length) - % MyHTML_ENCODING_DETECT_NAME_STATIC_SIZE) + 1; - - while (myhtml_encoding_detect_name_entry_static_list_index[idx].label) - { - if(myhtml_encoding_detect_name_entry_static_list_index[idx].label_length == length) { - if(myhtml_strncasecmp(myhtml_encoding_detect_name_entry_static_list_index[idx].label, name, length) == 0) - return &myhtml_encoding_detect_name_entry_static_list_index[idx]; - - if(myhtml_encoding_detect_name_entry_static_list_index[idx].next) - idx = myhtml_encoding_detect_name_entry_static_list_index[idx].next; - else - return NULL; - } - else if(myhtml_encoding_detect_name_entry_static_list_index[idx].label_length > length) { - return NULL; - } - else { - idx = myhtml_encoding_detect_name_entry_static_list_index[idx].next; - } - } - - return NULL; -} - -bool myhtml_encoding_by_name(const char *name, size_t length, myhtml_encoding_t *encoding) -{ - const myhtml_encoding_detect_name_entry_t *entry = myhtml_encoding_name_entry_by_name(name, length); - - if(entry) { - if(encoding) - *encoding = entry->encoding; - - return true; - } - - return false; -} - -const char * myhtml_encoding_name_by_id(myhtml_encoding_t encoding, size_t *length) -{ - if(encoding >= MyHTML_ENCODING_LAST_ENTRY) { - if(length) { - *length = 0; - } - - return NULL; - } - - const myhtml_encoding_entry_name_index_t *entry = &myhtml_encoding_entry_name_index_static_list_index[encoding]; - - if(length) { - *length = entry->length; - } - - return entry->name; -} - -/* - When an algorithm requires a user agent to prescan a byte stream to determine its encoding, - given some defined end condition, then it must run the following steps. - These steps either abort unsuccessfully or return a character encoding. - If at any point during these steps (including during instances of the get an attribute algorithm invoked by this one) - the user agent either runs out of bytes (meaning the position pointer created in the first step below goes beyond the end of the byte stream obtained so far) - or reaches its end condition, then abort the prescan a byte stream to determine its encoding algorithm unsuccessfully. -*/ - -bool myhtml_encoding_algorithm_extracting_character_encoding_from_meta_element(const char *data, size_t data_size, myhtml_encoding_t *encoding) -{ - *encoding = MyHTML_ENCODING_NOT_DETERMINED; - - /* 1 */ - size_t length = 0; - size_t charset_length = strlen("charset"); - - bool is_get_pos = false; - const unsigned char *udata = (const unsigned char *)data; - - /* 2 */ - while((length + charset_length) < data_size) { - if(myhtml_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"charset", &udata[length])) - { - length += charset_length; - - /* 2 */ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20) - { - break; - } - - length++; - } - - /* 4 */ - if(udata[length] == 0x3D) { /* EQUALS SIGN (=) */ - is_get_pos = true; - - length++; - break; - } - } - - length++; - } - - if(is_get_pos == false || length >= data_size) - return false; - - /* 5 */ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20) - { - break; - } - - length++; - } - - if(length >= data_size) - return false; - - /* 6 */ - /* " */ - if(udata[length] == 0x22) - { - length++; - size_t begin = length; - - while(length < data_size) { - if(udata[length] == 0x22) - return myhtml_encoding_by_name(&data[begin], (length - begin), encoding); - - length++; - } - - return false; - } - - /* ' */ - if(udata[length] == 0x27) - { - length++; - size_t begin = length; - - while(length < data_size) { - if(udata[length] == 0x27) - return myhtml_encoding_by_name(&data[begin], (length - begin), encoding); - - length++; - } - - return false; - } - - /* other */ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20) - { - size_t begin = length; - - while(length < data_size) { - /* SEMICOLON character (;) */ - if(udata[length] == 0x3B) { - return myhtml_encoding_by_name(&data[begin], (length - begin), encoding); - } - - length++; - } - - return myhtml_encoding_by_name(&data[begin], (length - begin), encoding); - } - - length++; - } - - return false; -} - -bool myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_spaces(const unsigned char *udata, size_t *data_length, size_t data_size, myhtml_encoding_detect_attr_t *attr) -{ - size_t length = *data_length; - - /* set position */ - attr->key_length = length - attr->key_begin; - - /* 6 */ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20 && udata[length] != 0x2F) - { - break; - } - - length++; - } - - if(length >= data_size) { - *data_length = length; - return false; - } - - /* 7 */ - if(udata[length] != 0x3D) { - *data_length = length; - return false; - } - - /* 8 */ - *data_length = (length + 1); - return true; -} - -size_t myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_value(const unsigned char *udata, size_t length, size_t data_size, myhtml_encoding_detect_attr_t *attr, bool *it_last) -{ - /* 9 */ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20) - { - break; - } - - length++; - } - - if(length >= data_size) { - *it_last = true; - return length; - } - - /* 10 */ - switch (udata[length]) { - case 0x22: /* (ASCII ") */ - length++; - attr->value_begin = length; - - while(length < data_size) { - if(udata[length] == 0x22) - { - attr->value_length = length - attr->value_begin; - return (length + 1); - } - - length++; - } - - break; - - case 0x27: /* (ASCII ') */ - length++; - attr->value_begin = length; - - while(length < data_size) { - if(udata[length] == 0x27) - { - attr->value_length = length - attr->value_begin; - return (length + 1); - } - - length++; - } - - break; - - case 0x3E: /* (ASCII >) */ - *it_last = true; - return (length + 1); - - default: - attr->value_begin = length; - - while(length < data_size) { - if(udata[length] == 0x09 || udata[length] == 0x0A || udata[length] == 0x0C || - udata[length] == 0x0D || udata[length] == 0x20 || udata[length] == 0x3E) - { - attr->value_length = length - attr->value_begin; - return (length + 1); - } - - length++; - } - - break; - } - - attr->value_length = length - attr->value_begin; - return length; -} - -size_t myhtml_encoding_prescan_stream_to_determine_encoding_get_attr(const unsigned char *udata, size_t length, size_t data_size, myhtml_encoding_detect_attr_t *attr, bool *it_last) -{ - memset(attr, 0, sizeof(myhtml_encoding_detect_attr_t)); - - /* - If the byte at position is one of 0x09 (ASCII TAB), 0x0A (ASCII LF), 0x0C (ASCII FF), 0x0D (ASCII CR), - 0x20 (ASCII space), or 0x2F (ASCII /) then advance position to the next byte and redo this step. - */ - /* 1 */ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20 && udata[length] != 0x2F) - { - break; - } - - length++; - } - - if(length >= data_size) { - *it_last = true; - return length; - } - - /* 2 */ - if(udata[length] == 0x3E) { /* (ASCII >) */ - *it_last = true; - return (length + 1); - } - - attr->key_begin = length; - - /* 3, 4 */ - while(length < data_size) { - switch (udata[length]) { - case 0x3D: /* (ASCII =) */ - if(attr->key_begin != (length - 1)) { - attr->key_length = length - attr->key_begin; - - length++; - return myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_value(udata, length, data_size, attr, it_last); - } - - /* fall through */ - - case 0x09: /* (ASCII TAB) */ - case 0x0A: /* (ASCII LF) */ - case 0x0C: /* (ASCII FF) */ - case 0x0D: /* (ASCII CR) */ - case 0x20: /* (ASCII space) */ - length++; - - if(myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_spaces(udata, &length, data_size, attr) == false) { - *it_last = true; - return length; - } - - return myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_value(udata, length, data_size, attr, it_last); - - case 0x2F: /* (ASCII /) */ - case 0x3E: /* (ASCII >) */ - *it_last = true; - attr->key_length = length - attr->key_begin; - - return (length + 1); - - default: - break; - } - - length++; - } - - if(myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_spaces(udata, &length, data_size, attr) == false) { - *it_last = true; - return length; - } - - return myhtml_encoding_prescan_stream_to_determine_encoding_get_attr_value(udata, length, data_size, attr, it_last); -} - -bool myhtml_encoding_prescan_stream_to_determine_encoding_check_meta(const unsigned char *udata, size_t *length, size_t data_size, myhtml_encoding_t *encoding) -{ - myhtml_encoding_detect_attr_t attr; - - bool got_pragma = false; - bool it_last = false; - - unsigned int need_pragma = 0; /* 0 = NULL, 1 = false, 2 = true */ - - /* - http-equiv = 1 - content = 2 - charset = 4 - */ - /* If the attribute's name is already in attribute list, then return to the step labeled attributes. */ - size_t is_exists = 0; - - while(*length < data_size) { - *length = myhtml_encoding_prescan_stream_to_determine_encoding_get_attr(udata, *length, data_size, &attr, &it_last); - - /* 9 */ - if(attr.key_length == strlen("http-equiv") && - myhtml_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"http-equiv", &udata[ attr.key_begin ])) - { - if((is_exists & 1) == 0) { - is_exists |= 1; - - if(attr.value_length == strlen("content-type") && - myhtml_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"content-type", &udata[ attr.value_begin ])) - { - got_pragma = true; - } - } - } - else if(attr.key_length == strlen("content") && - myhtml_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"content", &udata[ attr.key_begin ])) - { - if((is_exists & 2) == 0) { - is_exists |= 2; - - if(myhtml_encoding_algorithm_extracting_character_encoding_from_meta_element((const char*)(&udata[ attr.value_begin ]), attr.value_length, encoding)) { - need_pragma = 2; - } - } - } - else if(attr.key_length == strlen("charset") && - myhtml_ustrcasecmp_without_checks_by_secondary((const unsigned char*)"charset", &udata[ attr.key_begin ])) - { - if((is_exists & 4) == 0) { - is_exists |= 4; - - myhtml_encoding_by_name((const char*)(&udata[ attr.value_begin ]), attr.value_length, encoding); - need_pragma = 1; - } - } - - if(it_last) - break; - } - - /* 11, 12, 13 */ - if(need_pragma == 0 || (need_pragma == 2 && got_pragma == false)) { - *encoding = MyHTML_ENCODING_NOT_DETERMINED; - return false; - } - - /* 14 */ - if(*encoding == MyHTML_ENCODING_UTF_16BE || *encoding == MyHTML_ENCODING_UTF_16LE) { - *encoding = MyHTML_ENCODING_UTF_8; - } - - /* 15 */ - if(*encoding == MyHTML_ENCODING_X_USER_DEFINED) { - *encoding = MyHTML_ENCODING_WINDOWS_1252; - } - - /* 16 */ - return true; -} - -size_t myhtml_encoding_prescan_stream_to_determine_encoding_skip_name(const unsigned char *udata, size_t length, size_t data_size) -{ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && - udata[length] != 0x0D && udata[length] != 0x20) - { - break; - } - - length++; - } - - if(length >= data_size) - return length; - - if(udata[length] == 0x3E) { - return (length + 1); - } - - myhtml_encoding_detect_attr_t attr; - bool it_last = false; - - while(length < data_size) { - length = myhtml_encoding_prescan_stream_to_determine_encoding_get_attr(udata, length, data_size, &attr, &it_last); - - if(it_last) { - return length; - } - } - - return length; -} - -size_t myhtml_encoding_prescan_stream_to_determine_encoding_skip_other(const unsigned char *udata, size_t length, size_t data_size) -{ - if(udata[length] == 0x2F) { /* / */ - length++; - - if(length >= data_size) - return length; - - if(myhtml_tokenizer_chars_map[ udata[length] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) { - return myhtml_encoding_prescan_stream_to_determine_encoding_skip_name(udata, length, data_size); - } - - while(length < data_size) { - if(udata[length] != 0x3E) { - return (length + 1); - } - - length++; - } - - return length; - } - else if(udata[length] == 0x21) { /* ! */ - length++; - - if((length + 2) < data_size && udata[length] == 0x2D && udata[(length+1)] == 0x2D) { - while(length < data_size) { - if(udata[length] != 0x3E) { - if(udata[(length - 1)] == 0x2D && udata[(length - 2)] == 0x2D) - return (length + 1); - - length++; - } - } - - return length; - } - - while(length < data_size) { - if(udata[length] != 0x3E) { - return (length + 1); - } - - length++; - } - - return length; - } - else if(udata[length] == 0x3F) { /* ? */ - length++; - - while(length < data_size) { - if(udata[length] != 0x3E) { - return (length + 1); - } - - length++; - } - - return length; - } - - - return myhtml_encoding_prescan_stream_to_determine_encoding_skip_name(udata, length, data_size); -} - -myhtml_encoding_t myhtml_encoding_prescan_stream_to_determine_encoding(const char *data, size_t data_size) -{ - const unsigned char* udata = (const unsigned char*)data; - myhtml_encoding_t encoding = MyHTML_ENCODING_NOT_DETERMINED; - - size_t i = 0; - while(i < data_size) { - /* 0x3C = '<' */ - if(data[i] == 0x3C) - { - if((i + 5) >= data_size) - return encoding; - - i++; - - switch (data[i]) { - /* - A sequence of bytes starting with: - 0x3C, 0x4D or 0x6D, 0x45 or 0x65, 0x54 or 0x74, 0x41 or 0x61, - and one of 0x09, 0x0A, 0x0C, 0x0D, 0x20, 0x2F - (case-insensitive ASCII 'size = html_size; - inc_buf->length = 0; - inc_buf->data = html; - - if(current) { - inc_buf->offset = current->offset + current->size; - current->next = inc_buf; - } - else { - inc_buf->offset = 0; - } - - inc_buf->prev = current; - inc_buf->next = NULL; - - return inc_buf; -} - -void myhtml_incoming_buffer_clean(myhtml_incoming_buffer_t *current) -{ - memset(current, 0, sizeof(myhtml_incoming_buffer_t)); -} - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_split(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, size_t global_pos) -{ - size_t relative_pos = global_pos - current->offset; - myhtml_incoming_buffer_t *inc_buf = mcobject_malloc(mcobject, NULL); - - inc_buf->size = current->size - relative_pos; - inc_buf->length = inc_buf->size; - inc_buf->data = ¤t->data[relative_pos]; - inc_buf->offset = current->offset + relative_pos; - inc_buf->next = NULL; - inc_buf->prev = current; - - current->next = inc_buf; - current->size = relative_pos; - current->length = relative_pos; - - return inc_buf; -} - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin) -{ - if(inc_buf->offset < begin) { - while(inc_buf && (inc_buf->offset + inc_buf->size) < begin) - inc_buf = inc_buf->next; - } - else { - while(inc_buf && inc_buf->offset > begin) - inc_buf = inc_buf->prev; - } - - return inc_buf; -} - -const char * myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf) -{ - return inc_buf->data; -} - -size_t myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf) -{ - return inc_buf->length; -} - -size_t myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf) -{ - return inc_buf->size; -} - -size_t myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf) -{ - return inc_buf->offset; -} - -size_t myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin) -{ - return (begin - inc_buf->offset); -} - -size_t myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length) -{ - if((relative_begin + length) > inc_buf->size) - return (inc_buf->size - relative_begin); - - return length; -} - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf) -{ - return inc_buf->next; -} - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf) -{ - return inc_buf->prev; -} - -// // // -// convert only one 002345 (\002345) to code point -// -size_t myhtml_incoming_buffer_convert_one_escaped_to_code_point(myhtml_incoming_buffer_t **inc_buf, size_t *relative_pos) -{ - const unsigned char *u_data; - myhtml_incoming_buffer_t *current = *inc_buf; - - if(*relative_pos >= current->size) { - *relative_pos = 0; - current = current->next; - } - - u_data = (const unsigned char*)current->data; - - unsigned int consume = 0; - size_t code_point = 0; - - while(current) - { - if(myhtml_string_chars_num_map[ u_data[*relative_pos] ] != 0xff && consume < 6) { - code_point <<= 4; - code_point |= myhtml_string_chars_hex_map[ u_data[*relative_pos] ]; - - ++consume; - } - else - break; - - *relative_pos += 1; - - if(*relative_pos >= current->size) - { - if(current->next == NULL) - break; - - *relative_pos = 0; - - u_data = (const unsigned char*)current->data; - current = current->next; - } - } - - *inc_buf = current; - - return code_point; -} - -size_t myhtml_incoming_buffer_escaped_case_cmp(myhtml_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos) -{ - myhtml_incoming_buffer_t *current = *inc_buf; - - if(*relative_pos >= current->size) { - if(current->next == 0) - return to_size; - - *relative_pos = 0; - current = current->next; - } - - const unsigned char *u_to = (const unsigned char*)to; - const unsigned char *u_data = (const unsigned char*)current->data; - - size_t i = 0; - - while(i < to_size) - { - if(u_data[*relative_pos] == 0x5C) { - *relative_pos += 1; - - size_t code_point = myhtml_incoming_buffer_convert_one_escaped_to_code_point(¤t, relative_pos); - - if(code_point > 255 || myhtml_string_chars_lowercase_map[code_point] != myhtml_string_chars_lowercase_map[ u_to[i] ]) { - break; - } - - u_data = (const unsigned char*)current->data; - } - else if(myhtml_string_chars_lowercase_map[ u_data[*relative_pos] ] != myhtml_string_chars_lowercase_map[ u_to[i] ]) { - break; - } - else { - ++(*relative_pos); - } - - i++; - - if(*relative_pos >= current->size) - { - if(current->next == NULL) - break; - - current = current->next; - u_data = (const unsigned char*)current->data; - *relative_pos = 0; - } - } - - *inc_buf = current; - return (to_size - i); -} - - - - diff --git a/source/myhtml/incoming.h b/source/myhtml/incoming.h deleted file mode 100644 index 6e35389..0000000 --- a/source/myhtml/incoming.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_INCOMING_H -#define MyHTML_INCOMING_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" -#include "myhtml/tree.h" -#include "myhtml/utils/mcobject.h" - -struct myhtml_incoming_buffer { - const char* data; - size_t length; // use of data - size_t size; // size of data - size_t offset; // begin global offset - - struct myhtml_incoming_buffer* prev; - struct myhtml_incoming_buffer* next; -}; - - -// incoming buffer -myhtml_incoming_buffer_t * myhtml_incoming_buffer_add(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, const char *html, size_t html_size); -void myhtml_incoming_buffer_clean(myhtml_incoming_buffer_t *current); -myhtml_incoming_buffer_t * myhtml_incoming_buffer_split(myhtml_incoming_buffer_t *current, mcobject_t *mcobject, size_t global_pos); - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_find_by_position(myhtml_incoming_buffer_t *inc_buf, size_t begin); - -const char * myhtml_incoming_buffer_data(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_length(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_size(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_offset(myhtml_incoming_buffer_t *inc_buf); -size_t myhtml_incoming_buffer_relative_begin(myhtml_incoming_buffer_t *inc_buf, size_t begin); -size_t myhtml_incoming_buffer_available_length(myhtml_incoming_buffer_t *inc_buf, size_t relative_begin, size_t length); - -myhtml_incoming_buffer_t * myhtml_incoming_buffer_next(myhtml_incoming_buffer_t *inc_buf); -myhtml_incoming_buffer_t * myhtml_incoming_buffer_prev(myhtml_incoming_buffer_t *inc_buf); - -size_t myhtml_incoming_buffer_convert_one_escaped_to_code_point(myhtml_incoming_buffer_t **inc_buf, size_t *relative_pos); -size_t myhtml_incoming_buffer_escaped_case_cmp(myhtml_incoming_buffer_t **inc_buf, const char *to, size_t to_size, size_t *relative_pos); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_INCOMING_H */ diff --git a/source/myhtml/myhtml.c b/source/myhtml/myhtml.c index 767603e..479f33e 100644 --- a/source/myhtml/myhtml.c +++ b/source/myhtml/myhtml.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,7 +22,7 @@ void myhtml_init_marker(myhtml_t* myhtml) { - myhtml->marker = (myhtml_tree_node_t*)myhtml_malloc(sizeof(myhtml_tree_node_t)); + myhtml->marker = (myhtml_tree_node_t*)mycore_malloc(sizeof(myhtml_tree_node_t)); if(myhtml->marker) myhtml_tree_node_clean(myhtml->marker); @@ -31,92 +31,152 @@ void myhtml_init_marker(myhtml_t* myhtml) void myhtml_destroy_marker(myhtml_t* myhtml) { if(myhtml->marker) - myhtml_free(myhtml->marker); + mycore_free(myhtml->marker); } -myhtml_t * myhtml_create(void) +#ifndef MyCORE_BUILD_WITHOUT_THREADS +mystatus_t myhtml_stream_create(myhtml_t* myhtml, mystatus_t* status, size_t count, size_t id_increase) { - return (myhtml_t*)myhtml_malloc(sizeof(myhtml_t)); + if(count == 0) { + myhtml->thread_stream = NULL; + + *status = MyHTML_STATUS_OK; + return *status; + } + + myhtml->thread_stream = mythread_create(); + if(myhtml->thread_stream == NULL) + *status = MyCORE_STATUS_THREAD_ERROR_MEMORY_ALLOCATION; + + *status = mythread_init(myhtml->thread_stream, MyTHREAD_TYPE_STREAM, count, id_increase); + + if(*status) + myhtml->thread_stream = mythread_destroy(myhtml->thread_stream, NULL, NULL, true); + + return *status; } -myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) +mystatus_t myhtml_batch_create(myhtml_t* myhtml, mystatus_t* status, size_t count, size_t id_increase) { - myhtml_status_t status; + if(count == 0) { + myhtml->thread_batch = NULL; + + *status = MyHTML_STATUS_OK; + return *status; + } - myhtml_init_marker(myhtml); + myhtml->thread_batch = mythread_create(); + if(myhtml->thread_stream == NULL) { + myhtml->thread_stream = mythread_destroy(myhtml->thread_stream, NULL, NULL, true); + *status = MyCORE_STATUS_THREAD_ERROR_MEMORY_ALLOCATION; + } - status = myhtml_tokenizer_state_init(myhtml); - if(status) { - myhtml->insertion_func = NULL; - myhtml->thread = NULL; - + *status = mythread_init(myhtml->thread_batch, MyTHREAD_TYPE_BATCH, count, id_increase); + + if(*status) + myhtml->thread_batch = mythread_destroy(myhtml->thread_batch , NULL, NULL, true); + + return *status; +} + +mystatus_t myhtml_create_stream_and_batch(myhtml_t* myhtml, size_t stream_count, size_t batch_count) +{ + mystatus_t status; + + /* stream */ + if(myhtml_stream_create(myhtml, &status, stream_count, 0)) { return status; } - status = myhtml_rules_init(myhtml); - if(status) { - myhtml->thread = NULL; - + /* batch */ + if(myhtml_batch_create(myhtml, &status, batch_count, stream_count)) { + myhtml->thread_stream = mythread_destroy(myhtml->thread_stream, NULL, NULL, true); return status; } + return status; +} +#endif /* if undef MyCORE_BUILD_WITHOUT_THREADS */ + +myhtml_t * myhtml_create(void) +{ + return (myhtml_t*)mycore_calloc(1, sizeof(myhtml_t)); +} + +mystatus_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size) +{ + mystatus_t status; + myhtml->opt = opt; - myhtml->thread = mythread_create(); + myhtml_init_marker(myhtml); - if(myhtml->thread == NULL) - return MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION; + status = myhtml_tokenizer_state_init(myhtml); + if(status) + return status; -#ifdef MyHTML_BUILD_WITHOUT_THREADS + status = myhtml_rules_init(myhtml); + +#ifdef MyCORE_BUILD_WITHOUT_THREADS - status = mythread_init(myhtml->thread, NULL, thread_count); + myhtml->thread_stream = NULL; + myhtml->thread_batch = NULL; + myhtml->thread_total = 0; +#else /* if undef MyCORE_BUILD_WITHOUT_THREADS */ if(status) return status; -#else /* MyHTML_BUILD_WITHOUT_THREADS */ switch (opt) { case MyHTML_OPTIONS_PARSE_MODE_SINGLE: - status = mythread_init(myhtml->thread, "lastmac", 0); - if(status) - return status; - - myhtml->thread->context = mythread_queue_list_create(&status); - if(status) + if((status = myhtml_create_stream_and_batch(myhtml, 0, 0))) return status; break; case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: - status = mythread_init(myhtml->thread, "lastmac", 1); - if(status) + if((status = myhtml_create_stream_and_batch(myhtml, 1, 0))) return status; - myhtml->thread->context = mythread_queue_list_create(&status); - if(status) - return status; + myhtml->thread_stream->context = mythread_queue_list_create(&status); + status = myhread_entry_create(myhtml->thread_stream, mythread_function_queue_stream, myhtml_parser_worker_stream, MyTHREAD_OPT_STOP); - myhread_create_stream(myhtml->thread, mythread_function_queue_stream, myhtml_parser_worker_stream, MyTHREAD_OPT_STOP, &status); break; default: // default MyHTML_OPTIONS_PARSE_MODE_SEPARATELY - if(thread_count == 0) - thread_count = 1; + if(thread_count < 2) + thread_count = 2; - status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1)); - if(status) + if((status = myhtml_create_stream_and_batch(myhtml, 1, (thread_count - 1)))) return status; - myhtml->thread->context = mythread_queue_list_create(&status); + myhtml->thread_stream->context = mythread_queue_list_create(&status); + myhtml->thread_batch->context = myhtml->thread_stream->context; + + status = myhread_entry_create(myhtml->thread_stream, mythread_function_queue_stream, myhtml_parser_stream, MyTHREAD_OPT_STOP); if(status) return status; - myhread_create_stream(myhtml->thread, mythread_function_queue_stream, myhtml_parser_stream, MyTHREAD_OPT_STOP, &status); - myhread_create_batch(myhtml->thread, mythread_function_queue_batch, myhtml_parser_worker, MyTHREAD_OPT_STOP, &status, thread_count); + for(size_t i = 0; i < myhtml->thread_batch->entries_size; i++) { + status = myhread_entry_create(myhtml->thread_batch, mythread_function_queue_batch, myhtml_parser_worker, MyTHREAD_OPT_STOP); + + if(status) + return status; + } + break; } -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + myhtml->thread_total = thread_count; + + myhtml->thread_list[0] = myhtml->thread_stream; + myhtml->thread_list[1] = myhtml->thread_batch; + myhtml->thread_list[2] = NULL; + +#endif /* if undef MyCORE_BUILD_WITHOUT_THREADS */ + + if(status) + return status; myhtml_clean(myhtml); @@ -125,7 +185,7 @@ myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t th void myhtml_clean(myhtml_t* myhtml) { - mythread_clean(myhtml->thread); + /* some code */ } myhtml_t* myhtml_destroy(myhtml_t* myhtml) @@ -135,36 +195,41 @@ myhtml_t* myhtml_destroy(myhtml_t* myhtml) myhtml_destroy_marker(myhtml); - if(myhtml->thread) { -#ifndef MyHTML_BUILD_WITHOUT_THREADS - mythread_queue_list_t* queue_list = myhtml->thread->context; -#endif +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(myhtml->thread_stream) { + mythread_queue_list_t* queue_list = myhtml->thread_stream->context; + + if(queue_list) + mythread_queue_list_wait_for_done(myhtml->thread_stream, queue_list); - myhtml->thread = mythread_destroy(myhtml->thread, mythread_queue_wait_all_for_done, true); + myhtml->thread_stream = mythread_destroy(myhtml->thread_stream, mythread_callback_quit, NULL, true); -#ifndef MyHTML_BUILD_WITHOUT_THREADS - mythread_queue_list_destroy(queue_list); -#endif + if(myhtml->thread_batch) + myhtml->thread_batch = mythread_destroy(myhtml->thread_batch, mythread_callback_quit, NULL, true); + + if(queue_list) + mythread_queue_list_destroy(queue_list); } +#endif /* if undef MyCORE_BUILD_WITHOUT_THREADS */ myhtml_tokenizer_state_destroy(myhtml); if(myhtml->insertion_func) - myhtml_free(myhtml->insertion_func); + mycore_free(myhtml->insertion_func); - myhtml_free(myhtml); + mycore_free(myhtml); return NULL; } -myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size) +mystatus_t myhtml_parse(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size) { if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { myhtml_tree_clean(tree); } myhtml_encoding_set(tree, encoding); - myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + mystatus_t status = myhtml_tokenizer_begin(tree, html, html_size); if(status) return status; @@ -172,7 +237,7 @@ myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, co return myhtml_tokenizer_end(tree); } -myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +mystatus_t myhtml_parse_fragment(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) { if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { myhtml_tree_clean(tree); @@ -188,7 +253,7 @@ myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t enc return MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT; myhtml_encoding_set(tree, encoding); - myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + mystatus_t status = myhtml_tokenizer_begin(tree, html, html_size); if(status) return status; @@ -196,7 +261,7 @@ myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t enc return myhtml_tokenizer_end(tree); } -myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size) +mystatus_t myhtml_parse_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size) { if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { myhtml_tree_clean(tree); @@ -206,7 +271,7 @@ myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encod myhtml_encoding_set(tree, encoding); - myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + mystatus_t status = myhtml_tokenizer_begin(tree, html, html_size); if(status) return status; @@ -214,7 +279,7 @@ myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encod return myhtml_tokenizer_end(tree); } -myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +mystatus_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) { if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { myhtml_tree_clean(tree); @@ -233,7 +298,7 @@ myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encodin myhtml_encoding_set(tree, encoding); - myhtml_status_t status = myhtml_tokenizer_begin(tree, html, html_size); + mystatus_t status = myhtml_tokenizer_begin(tree, html, html_size); if(status) return status; @@ -241,7 +306,7 @@ myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encodin return myhtml_tokenizer_end(tree); } -myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size) +mystatus_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size) { if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { myhtml_tree_clean(tree); @@ -250,7 +315,7 @@ myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t return myhtml_tokenizer_chunk(tree, html, html_size); } -myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +mystatus_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) { if(tree->flags & MyHTML_TREE_FLAGS_PARSE_END) { myhtml_tree_clean(tree); @@ -268,7 +333,7 @@ myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* htm return myhtml_tokenizer_chunk(tree, html, html_size); } -myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size) +mystatus_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size) { if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; @@ -276,7 +341,7 @@ myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, return myhtml_parse_chunk(tree, html, html_size); } -myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) +mystatus_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns) { if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; @@ -284,21 +349,21 @@ myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const ch return myhtml_parse_chunk_fragment(tree, html, html_size, tag_id, ns); } -myhtml_status_t myhtml_parse_chunk_end(myhtml_tree_t* tree) +mystatus_t myhtml_parse_chunk_end(myhtml_tree_t* tree) { return myhtml_tokenizer_end(tree); } -void myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding) +void myhtml_encoding_set(myhtml_tree_t* tree, myencoding_t encoding) { - if(encoding >= MyHTML_ENCODING_LAST_ENTRY) + if(encoding >= MyENCODING_LAST_ENTRY) return; tree->encoding_usereq = encoding; tree->encoding = encoding; } -myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree) +myencoding_t myhtml_encoding_get(myhtml_tree_t* tree) { return tree->encoding; } @@ -307,7 +372,7 @@ myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree) * Nodes */ -myhtml_status_t myhtml_get_nodes_by_tag_id_in_scope_find_recursion(myhtml_tree_node_t *node, myhtml_collection_t *collection, myhtml_tag_id_t tag_id) +mystatus_t myhtml_get_nodes_by_tag_id_in_scope_find_recursion(myhtml_tree_node_t *node, myhtml_collection_t *collection, myhtml_tag_id_t tag_id) { while(node) { if(node->tag_id == tag_id) { @@ -316,7 +381,7 @@ myhtml_status_t myhtml_get_nodes_by_tag_id_in_scope_find_recursion(myhtml_tree_n if(collection->length >= collection->size) { - myhtml_status_t mystatus = myhtml_collection_check_size(collection, 1024, 0); + mystatus_t mystatus = myhtml_collection_check_size(collection, 1024, 0); if(mystatus != MyHTML_STATUS_OK) return mystatus; @@ -332,12 +397,12 @@ myhtml_status_t myhtml_get_nodes_by_tag_id_in_scope_find_recursion(myhtml_tree_n return MyHTML_STATUS_OK; } -myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, myhtml_status_t *status) +myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, mystatus_t *status) { if(node == NULL) return NULL; - myhtml_status_t mystatus = MyHTML_STATUS_OK; + mystatus_t mystatus = MyHTML_STATUS_OK; if(collection == NULL) { collection = myhtml_collection_create(1024, &mystatus); @@ -361,13 +426,13 @@ myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, m return collection; } -myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, myhtml_status_t *status) +myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, mystatus_t *status) { const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_name(tree->tags, html, length); return myhtml_get_nodes_by_tag_id_in_scope(tree, collection, node, tag_ctx->id, status); } -myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status) +myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, mystatus_t *status) { if(collection == NULL) { collection = myhtml_collection_create(1024, NULL); @@ -417,7 +482,7 @@ myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_col return collection; } -myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, myhtml_status_t *status) +myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, mystatus_t *status) { const myhtml_tag_context_t *tag_ctx = myhtml_tag_get_by_name(tree->tags, html, length); @@ -546,12 +611,12 @@ myhtml_tree_node_t * myhtml_node_insert_to_appropriate_place(myhtml_tree_node_t return node; } -myhtml_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) +mycore_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, myencoding_t encoding) { if(node == NULL) return NULL; - if(encoding >= MyHTML_ENCODING_LAST_ENTRY) + if(encoding >= MyENCODING_LAST_ENTRY) return NULL; myhtml_tree_t* tree = node->tree; @@ -564,22 +629,22 @@ myhtml_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* tex } if(node->token->str.data == NULL) { - myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); + mycore_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); } else { if(node->token->str.size < length) { mchar_async_free(tree->mchar, node->token->str.node_idx, node->token->str.data); - myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); + mycore_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); } else node->token->str.length = 0; } - if(encoding != MyHTML_ENCODING_UTF_8) { - myhtml_string_append_with_convert_encoding(&node->token->str, text, length, encoding); + if(encoding != MyENCODING_UTF_8) { + myencoding_string_append(&node->token->str, text, length, encoding); } else { - myhtml_string_append(&node->token->str, text, length); + mycore_string_append(&node->token->str, text, length); } node->token->raw_begin = 0; @@ -588,12 +653,12 @@ myhtml_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* tex return &node->token->str; } -myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding) +mycore_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, myencoding_t encoding) { if(node == NULL) return NULL; - if(encoding >= MyHTML_ENCODING_LAST_ENTRY) + if(encoding >= MyENCODING_LAST_ENTRY) return NULL; myhtml_tree_t* tree = node->tree; @@ -606,12 +671,12 @@ myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, con } if(node->token->str.data == NULL) { - myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); + mycore_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, (length + 2)); } else { if(node->token->str.size < length) { mchar_async_free(tree->mchar, node->token->str.node_idx, node->token->str.data); - myhtml_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); + mycore_string_init(tree->mchar, tree->mchar_node_id, &node->token->str, length); } else node->token->str.length = 0; @@ -621,7 +686,7 @@ myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, con myhtml_data_process_entry_clean(&proc_entry); proc_entry.encoding = encoding; - myhtml_encoding_result_clean(&proc_entry.res); + myencoding_result_clean(&proc_entry.res); myhtml_data_process(&proc_entry, &node->token->str, text, length); myhtml_data_process_end(&proc_entry, &node->token->str); @@ -724,7 +789,7 @@ const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length) return NULL; } -myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node) +mycore_string_t * myhtml_node_string(myhtml_tree_node_t *node) { if(node && node->token) return &node->token->str; @@ -763,7 +828,7 @@ myhtml_tree_t * myhtml_node_tree(myhtml_tree_node_t *node) return node->tree; } -myhtml_status_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_node_t* node, myhtml_collection_t* collection, const char* key, size_t key_len) +mystatus_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_node_t* node, myhtml_collection_t* collection, const char* key, size_t key_len) { while(node) { @@ -771,14 +836,14 @@ myhtml_status_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_node_t* myhtml_tree_attr_t* attr = node->token->attr_first; while(attr) { - myhtml_string_t* str_key = &attr->key; + mycore_string_t* str_key = &attr->key; - if(str_key->length == key_len && myhtml_strncasecmp(str_key->data, key, key_len) == 0) { + if(str_key->length == key_len && mycore_strncasecmp(str_key->data, key, key_len) == 0) { collection->list[ collection->length ] = node; collection->length++; if(collection->length >= collection->size) { - myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); + mystatus_t status = myhtml_collection_check_size(collection, 1024, 0); if(status) return status; @@ -790,7 +855,7 @@ myhtml_status_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_node_t* } if(node->child) { - myhtml_status_t status = myhtml_get_nodes_by_attribute_key_recursion(node->child, collection, key, key_len); + mystatus_t status = myhtml_get_nodes_by_attribute_key_recursion(node->child, collection, key, key_len); if(status) return status; @@ -802,7 +867,7 @@ myhtml_status_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_node_t* return MyHTML_STATUS_OK; } -myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, myhtml_status_t* status) +myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, mystatus_t* status) { if(collection == NULL) { collection = myhtml_collection_create(1024, status); @@ -814,7 +879,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myh if(scope_node == NULL) scope_node = tree->node_html; - myhtml_status_t rec_status = myhtml_get_nodes_by_attribute_key_recursion(scope_node, collection, key, key_len); + mystatus_t rec_status = myhtml_get_nodes_by_attribute_key_recursion(scope_node, collection, key, key_len); if(rec_status && status) *status = rec_status; @@ -823,28 +888,28 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myh } /* find by attribute value; case-sensitivity */ -bool myhtml_get_nodes_by_attribute_value_recursion_eq(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_eq(mycore_string_t* str, const char* value, size_t value_len) { - return str->length == value_len && myhtml_strncmp(str->data, value, value_len) == 0; + return str->length == value_len && mycore_strncmp(str->data, value, value_len) == 0; } -bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; const char *data = str->data; - if(myhtml_strncmp(data, value, value_len) == 0) { - if((str->length > value_len && myhtml_utils_whithspace(data[value_len], ==, ||)) || str->length == value_len) + if(mycore_strncmp(data, value, value_len) == 0) { + if((str->length > value_len && mycore_utils_whithspace(data[value_len], ==, ||)) || str->length == value_len) return true; } for(size_t i = 1; (str->length - i) >= value_len; i++) { - if(myhtml_utils_whithspace(data[(i - 1)], ==, ||)) { - if(myhtml_strncmp(&data[i], value, value_len) == 0) { - if((i > value_len && myhtml_utils_whithspace(data[(i + value_len)], ==, ||)) || (str->length - i) == value_len) + if(mycore_utils_whithspace(data[(i - 1)], ==, ||)) { + if(mycore_strncmp(&data[i], value, value_len) == 0) { + if((i > value_len && mycore_utils_whithspace(data[(i + value_len)], ==, ||)) || (str->length - i) == value_len) return true; } } @@ -853,23 +918,23 @@ bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated(myhtml_s return false; } -bool myhtml_get_nodes_by_attribute_value_recursion_begin(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_begin(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; - return myhtml_strncmp(str->data, value, value_len) == 0; + return mycore_strncmp(str->data, value, value_len) == 0; } -bool myhtml_get_nodes_by_attribute_value_recursion_end(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_end(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; - return myhtml_strncmp(&str->data[ (str->length - (str->length - value_len)) ], value, value_len) == 0; + return mycore_strncmp(&str->data[ (str->length - (str->length - value_len)) ], value, value_len) == 0; } -bool myhtml_get_nodes_by_attribute_value_recursion_contain(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_contain(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; @@ -878,7 +943,7 @@ bool myhtml_get_nodes_by_attribute_value_recursion_contain(myhtml_string_t* str, for(size_t i = 0; (str->length - i) >= value_len; i++) { - if(myhtml_strncmp(&data[i], value, value_len) == 0) { + if(mycore_strncmp(&data[i], value, value_len) == 0) { return true; } } @@ -886,16 +951,16 @@ bool myhtml_get_nodes_by_attribute_value_recursion_contain(myhtml_string_t* str, return false; } -bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated(mycore_string_t* str, const char* value, size_t value_len) { const char *data = str->data; if(str->length < value_len) return false; - else if(str->length == value_len && myhtml_strncmp(data, value, value_len) == 0) { + else if(str->length == value_len && mycore_strncmp(data, value, value_len) == 0) { return true; } - else if(myhtml_strncmp(data, value, value_len) == 0 && data[value_len] == '-') { + else if(mycore_strncmp(data, value, value_len) == 0 && data[value_len] == '-') { return true; } @@ -903,28 +968,28 @@ bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated(myhtml_strin } /* find by attribute value; case-insensitive */ -bool myhtml_get_nodes_by_attribute_value_recursion_eq_i(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_eq_i(mycore_string_t* str, const char* value, size_t value_len) { - return str->length == value_len && myhtml_strncasecmp(str->data, value, value_len) == 0; + return str->length == value_len && mycore_strncasecmp(str->data, value, value_len) == 0; } -bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated_i(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated_i(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; const char *data = str->data; - if(myhtml_strncasecmp(data, value, value_len) == 0) { - if((str->length > value_len && myhtml_utils_whithspace(data[value_len], ==, ||)) || str->length == value_len) + if(mycore_strncasecmp(data, value, value_len) == 0) { + if((str->length > value_len && mycore_utils_whithspace(data[value_len], ==, ||)) || str->length == value_len) return true; } for(size_t i = 1; (str->length - i) >= value_len; i++) { - if(myhtml_utils_whithspace(data[(i - 1)], ==, ||)) { - if(myhtml_strncasecmp(&data[i], value, value_len) == 0) { - if((i > value_len && myhtml_utils_whithspace(data[(i + value_len)], ==, ||)) || (str->length - i) == value_len) + if(mycore_utils_whithspace(data[(i - 1)], ==, ||)) { + if(mycore_strncasecmp(&data[i], value, value_len) == 0) { + if((i > value_len && mycore_utils_whithspace(data[(i + value_len)], ==, ||)) || (str->length - i) == value_len) return true; } } @@ -933,23 +998,23 @@ bool myhtml_get_nodes_by_attribute_value_recursion_whitespace_separated_i(myhtml return false; } -bool myhtml_get_nodes_by_attribute_value_recursion_begin_i(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_begin_i(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; - return myhtml_strncasecmp(str->data, value, value_len) == 0; + return mycore_strncasecmp(str->data, value, value_len) == 0; } -bool myhtml_get_nodes_by_attribute_value_recursion_end_i(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_end_i(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; - return myhtml_strncasecmp(&str->data[ (str->length - (str->length - value_len)) ], value, value_len) == 0; + return mycore_strncasecmp(&str->data[ (str->length - (str->length - value_len)) ], value, value_len) == 0; } -bool myhtml_get_nodes_by_attribute_value_recursion_contain_i(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_contain_i(mycore_string_t* str, const char* value, size_t value_len) { if(str->length < value_len) return false; @@ -958,7 +1023,7 @@ bool myhtml_get_nodes_by_attribute_value_recursion_contain_i(myhtml_string_t* st for(size_t i = 0; (str->length - i) >= value_len; i++) { - if(myhtml_strncasecmp(&data[i], value, value_len) == 0) { + if(mycore_strncasecmp(&data[i], value, value_len) == 0) { return true; } } @@ -966,16 +1031,16 @@ bool myhtml_get_nodes_by_attribute_value_recursion_contain_i(myhtml_string_t* st return false; } -bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated_i(myhtml_string_t* str, const char* value, size_t value_len) +bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated_i(mycore_string_t* str, const char* value, size_t value_len) { const char *data = str->data; if(str->length < value_len) return false; - else if(str->length == value_len && myhtml_strncasecmp(data, value, value_len) == 0) { + else if(str->length == value_len && mycore_strncasecmp(data, value, value_len) == 0) { return true; } - else if(myhtml_strncasecmp(data, value, value_len) == 0 && data[value_len] == '-') { + else if(mycore_strncasecmp(data, value, value_len) == 0 && data[value_len] == '-') { return true; } @@ -983,7 +1048,7 @@ bool myhtml_get_nodes_by_attribute_value_recursion_hyphen_separated_i(myhtml_str } /* find by attribute value; basic functions */ -myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion(myhtml_tree_node_t* node, myhtml_collection_t* collection, +mystatus_t myhtml_get_nodes_by_attribute_value_recursion(myhtml_tree_node_t* node, myhtml_collection_t* collection, myhtml_attribute_value_find_f func_eq, const char* value, size_t value_len) { @@ -993,14 +1058,14 @@ myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion(myhtml_tree_node_t myhtml_tree_attr_t* attr = node->token->attr_first; while(attr) { - myhtml_string_t* str = &attr->value; + mycore_string_t* str = &attr->value; if(func_eq(str, value, value_len)) { collection->list[ collection->length ] = node; collection->length++; if(collection->length >= collection->size) { - myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); + mystatus_t status = myhtml_collection_check_size(collection, 1024, 0); if(status) return status; @@ -1012,7 +1077,7 @@ myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion(myhtml_tree_node_t } if(node->child) { - myhtml_status_t status = myhtml_get_nodes_by_attribute_value_recursion(node->child, collection, func_eq, value, value_len); + mystatus_t status = myhtml_get_nodes_by_attribute_value_recursion(node->child, collection, func_eq, value, value_len); if(status) return status; @@ -1024,7 +1089,7 @@ myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion(myhtml_tree_node_t return MyHTML_STATUS_OK; } -myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion_by_key(myhtml_tree_node_t* node, myhtml_collection_t* collection, +mystatus_t myhtml_get_nodes_by_attribute_value_recursion_by_key(myhtml_tree_node_t* node, myhtml_collection_t* collection, myhtml_attribute_value_find_f func_eq, const char* key, size_t key_len, const char* value, size_t value_len) @@ -1035,17 +1100,17 @@ myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion_by_key(myhtml_tree myhtml_tree_attr_t* attr = node->token->attr_first; while(attr) { - myhtml_string_t* str_key = &attr->key; - myhtml_string_t* str = &attr->value; + mycore_string_t* str_key = &attr->key; + mycore_string_t* str = &attr->value; - if(str_key->length == key_len && myhtml_strncasecmp(str_key->data, key, key_len) == 0) + if(str_key->length == key_len && mycore_strncasecmp(str_key->data, key, key_len) == 0) { if(func_eq(str, value, value_len)) { collection->list[ collection->length ] = node; collection->length++; if(collection->length >= collection->size) { - myhtml_status_t status = myhtml_collection_check_size(collection, 1024, 0); + mystatus_t status = myhtml_collection_check_size(collection, 1024, 0); if(status) return status; @@ -1058,7 +1123,7 @@ myhtml_status_t myhtml_get_nodes_by_attribute_value_recursion_by_key(myhtml_tree } if(node->child) { - myhtml_status_t status = myhtml_get_nodes_by_attribute_value_recursion_by_key(node->child, collection, func_eq, + mystatus_t status = myhtml_get_nodes_by_attribute_value_recursion_by_key(node->child, collection, func_eq, key, key_len, value, value_len); if(status) @@ -1075,7 +1140,7 @@ myhtml_collection_t * _myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_attribute_value_find_f func_eq, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(collection == NULL) { collection = myhtml_collection_create(1024, status); @@ -1087,7 +1152,7 @@ myhtml_collection_t * _myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, if(node == NULL) node = tree->node_html; - myhtml_status_t rec_status; + mystatus_t rec_status; if(key && key_len) rec_status = myhtml_get_nodes_by_attribute_value_recursion_by_key(node, collection, func_eq, key, key_len, value, value_len); @@ -1104,7 +1169,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, m bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(case_insensitive) { return _myhtml_get_nodes_by_attribute_value(tree, collection, node, @@ -1121,7 +1186,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_whitespace_separated(m bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(case_insensitive) { return _myhtml_get_nodes_by_attribute_value(tree, collection, node, @@ -1138,7 +1203,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *t bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(case_insensitive) { return _myhtml_get_nodes_by_attribute_value(tree, collection, node, @@ -1155,7 +1220,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tre bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(case_insensitive) { return _myhtml_get_nodes_by_attribute_value(tree, collection, node, @@ -1172,7 +1237,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(case_insensitive) { return _myhtml_get_nodes_by_attribute_value(tree, collection, node, @@ -1189,7 +1254,7 @@ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtm bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status) + mystatus_t* status) { if(case_insensitive) { return _myhtml_get_nodes_by_attribute_value(tree, collection, node, @@ -1257,7 +1322,7 @@ const char * myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length) return NULL; } -myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr) +mycore_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr) { if(attr) return &attr->key; @@ -1265,7 +1330,7 @@ myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr) return NULL; } -myhtml_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr) +mycore_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr) { if(attr) return &attr->value; @@ -1281,7 +1346,7 @@ myhtml_tree_attr_t * myhtml_attribute_by_key(myhtml_tree_node_t *node, const cha return myhtml_token_attr_by_name(node->token, key, key_len); } -myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding) +myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myencoding_t encoding) { if(node == NULL) return NULL; @@ -1353,9 +1418,9 @@ myhtml_position_t myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr) /* * Collections */ -myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *status) +myhtml_collection_t * myhtml_collection_create(size_t size, mystatus_t *status) { - myhtml_collection_t *collection = (myhtml_collection_t*)myhtml_malloc(sizeof(myhtml_collection_t)); + myhtml_collection_t *collection = (myhtml_collection_t*)mycore_malloc(sizeof(myhtml_collection_t)); if(collection == NULL) { if(status) @@ -1366,10 +1431,10 @@ myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *sta collection->size = size; collection->length = 0; - collection->list = (myhtml_tree_node_t **)myhtml_malloc(sizeof(myhtml_tree_node_t*) * size); + collection->list = (myhtml_tree_node_t **)mycore_malloc(sizeof(myhtml_tree_node_t*) * size); if(collection->list == NULL) { - myhtml_free(collection); + mycore_free(collection); if(status) *status = MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; @@ -1383,12 +1448,12 @@ myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *sta return collection; } -myhtml_status_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length) +mystatus_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length) { if((collection->length + need) >= collection->size) { size_t tmp_size = collection->length + need + upto_length + 1; - myhtml_tree_node_t **tmp = (myhtml_tree_node_t **)myhtml_realloc(collection->list, sizeof(myhtml_tree_node_t*) * tmp_size); + myhtml_tree_node_t **tmp = (myhtml_tree_node_t **)mycore_realloc(collection->list, sizeof(myhtml_tree_node_t*) * tmp_size); if(tmp) { collection->size = tmp_size; @@ -1413,15 +1478,15 @@ myhtml_collection_t * myhtml_collection_destroy(myhtml_collection_t *collection) return NULL; if(collection->list) - myhtml_free(collection->list); + mycore_free(collection->list); - myhtml_free(collection); + mycore_free(collection); return NULL; } /* queue */ -myhtml_status_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token) +mystatus_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token) { // TODO: need refactoring this code // too many conditions @@ -1437,50 +1502,48 @@ myhtml_status_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token } } -#ifndef MyHTML_BUILD_WITHOUT_THREADS +#ifndef MyCORE_BUILD_WITHOUT_THREADS if(tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) { if(qnode && token) { - qnode->token = token; + qnode->args = token; myhtml_parser_worker(0, qnode); myhtml_parser_stream(0, qnode); } - tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread, tree->queue, 4, NULL); + tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread_stream, tree->queue, 4, NULL); } else { if(qnode) - qnode->token = token; + qnode->args = token; - tree->current_qnode = mythread_queue_node_malloc_round(tree->myhtml->thread, tree->queue_entry, NULL); + tree->current_qnode = mythread_queue_node_malloc_round(tree->myhtml->thread_stream, tree->queue_entry, NULL); } #else if(qnode && token) { - qnode->token = token; + qnode->args = token; myhtml_parser_worker(0, qnode); myhtml_parser_stream(0, qnode); } - tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread, tree->queue, 4, NULL); + tree->current_qnode = mythread_queue_node_malloc_limit(tree->myhtml->thread_stream, tree->queue, 4, NULL); -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ +#endif /* MyCORE_BUILD_WITHOUT_THREADS */ - if(tree->current_qnode == NULL) { + if(tree->current_qnode == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; - } - tree->current_qnode->tree = tree; + tree->current_qnode->context = tree; tree->current_qnode->prev = qnode; if(qnode && token) myhtml_tokenizer_calc_current_namespace(tree, token); tree->current_token_node = myhtml_token_node_create(tree->token, tree->token->mcasync_token_id); - if(tree->current_token_node == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; diff --git a/source/myhtml/myhtml.h b/source/myhtml/myhtml.h index 9a049e2..1bc94e1 100644 --- a/source/myhtml/myhtml.h +++ b/source/myhtml/myhtml.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -28,19 +28,19 @@ extern "C" { #include "myhtml/myosi.h" -#include "myhtml/utils/mctree.h" -#include "myhtml/utils/mcobject_async.h" +#include "mycore/utils/mctree.h" +#include "mycore/utils/mcobject_async.h" +#include "mycore/mythread.h" +#include "mycore/incoming.h" +#include "myencoding/encoding.h" #include "myhtml/tree.h" #include "myhtml/tag.h" #include "myhtml/def.h" #include "myhtml/parser.h" #include "myhtml/tokenizer.h" -#include "myhtml/thread.h" #include "myhtml/rules.h" #include "myhtml/token.h" #include "myhtml/charef.h" -#include "myhtml/encoding.h" -#include "myhtml/incoming.h" #include "myhtml/callback.h" #define mh_queue_current() tree->queue @@ -65,8 +65,10 @@ extern "C" { (onechar < 'A' || onechar > 'Z')) struct myhtml { - mythread_t *thread; - //mchar_async_t *mchar; // for all + mythread_t* thread_stream; + mythread_t* thread_batch; + mythread_t* thread_list[3]; + size_t thread_total; myhtml_tokenizer_state_f* parse_state_func; myhtml_insertion_f* insertion_func; @@ -83,68 +85,68 @@ struct myhtml_collection { myhtml_t * myhtml_create(void); -myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); +mystatus_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t thread_count, size_t queue_size); void myhtml_clean(myhtml_t* myhtml); myhtml_t* myhtml_destroy(myhtml_t* myhtml); -myhtml_status_t myhtml_parse(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_fragment(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); +mystatus_t myhtml_parse_fragment(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myhtml_encoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size); +mystatus_t myhtml_parse_fragment_single(myhtml_tree_t* tree, myencoding_t encoding, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); -myhtml_status_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); -myhtml_status_t myhtml_parse_chunk_end(myhtml_tree_t* tree); +mystatus_t myhtml_parse_chunk(myhtml_tree_t* tree, const char* html, size_t html_size); +mystatus_t myhtml_parse_chunk_fragment(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse_chunk_single(myhtml_tree_t* tree, const char* html, size_t html_size); +mystatus_t myhtml_parse_chunk_fragment_single(myhtml_tree_t* tree, const char* html, size_t html_size, myhtml_tag_id_t tag_id, enum myhtml_namespace ns); +mystatus_t myhtml_parse_chunk_end(myhtml_tree_t* tree); // encoding -void myhtml_encoding_set(myhtml_tree_t* tree, myhtml_encoding_t encoding); -myhtml_encoding_t myhtml_encoding_get(myhtml_tree_t* tree); +void myhtml_encoding_set(myhtml_tree_t* tree, myencoding_t encoding); +myencoding_t myhtml_encoding_get(myhtml_tree_t* tree); -myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, myhtml_status_t *status); -myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, myhtml_status_t *status); -myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, myhtml_status_t* status); +myhtml_collection_t * myhtml_get_nodes_by_tag_id(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tag_id_t tag_id, mystatus_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name(myhtml_tree_t* tree, myhtml_collection_t *collection, const char* html, size_t length, mystatus_t *status); +myhtml_collection_t * myhtml_get_nodes_by_attribute_key(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* scope_node, const char* key, size_t key_len, mystatus_t* status); /* like a [some=value] or #id */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some~=value] or .class */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_whitespace_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some^=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_begin(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some$=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_end(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some*=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_contain(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); /* like a [some|=value] */ myhtml_collection_t * myhtml_get_nodes_by_attribute_value_hyphen_separated(myhtml_tree_t *tree, myhtml_collection_t* collection, myhtml_tree_node_t* node, bool case_insensitive, const char* key, size_t key_len, const char* value, size_t value_len, - myhtml_status_t* status); + mystatus_t* status); -myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, myhtml_status_t *status); -myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, myhtml_status_t *status); +myhtml_collection_t * myhtml_get_nodes_by_tag_id_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, myhtml_tag_id_t tag_id, mystatus_t *status); +myhtml_collection_t * myhtml_get_nodes_by_name_in_scope(myhtml_tree_t* tree, myhtml_collection_t *collection, myhtml_tree_node_t *node, const char* html, size_t length, mystatus_t *status); myhtml_tree_node_t * myhtml_node_first(myhtml_tree_t* tree); myhtml_tree_node_t * myhtml_node_next(myhtml_tree_node_t *node); @@ -174,7 +176,7 @@ bool myhtml_node_is_close_self(myhtml_tree_node_t *node); myhtml_tree_attr_t * myhtml_node_attribute_first(myhtml_tree_node_t *node); myhtml_tree_attr_t * myhtml_node_attribute_last(myhtml_tree_node_t *node); const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length); -myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node); +mycore_string_t * myhtml_node_string(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); void myhtml_node_set_data(myhtml_tree_node_t *node, void* data); @@ -188,10 +190,10 @@ void myhtml_attribute_namespace_set(myhtml_tree_attr_t *attr, myhtml_namespace_t const char * myhtml_attribute_key(myhtml_tree_attr_t *attr, size_t *length); const char * myhtml_attribute_value(myhtml_tree_attr_t *attr, size_t *length); -myhtml_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr); -myhtml_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr); +mycore_string_t * myhtml_attribute_key_string(myhtml_tree_attr_t* attr); +mycore_string_t * myhtml_attribute_value_string(myhtml_tree_attr_t* attr); myhtml_tree_attr_t * myhtml_attribute_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); -myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myhtml_encoding_t encoding); +myhtml_tree_attr_t * myhtml_attribute_add(myhtml_tree_node_t *node, const char *key, size_t key_len, const char *value, size_t value_len, myencoding_t encoding); myhtml_tree_attr_t * myhtml_attribute_remove(myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); myhtml_tree_attr_t * myhtml_attribute_remove_by_key(myhtml_tree_node_t *node, const char *key, size_t key_len); void myhtml_attribute_delete(myhtml_tree_t *tree, myhtml_tree_node_t *node, myhtml_tree_attr_t *attr); @@ -200,35 +202,20 @@ myhtml_position_t myhtml_attribute_key_raw_position(myhtml_tree_attr_t *attr); myhtml_position_t myhtml_attribute_value_raw_position(myhtml_tree_attr_t *attr); /* collection */ -myhtml_collection_t * myhtml_collection_create(size_t size, myhtml_status_t *status); +myhtml_collection_t * myhtml_collection_create(size_t size, mystatus_t *status); void myhtml_collection_clean(myhtml_collection_t *collection); myhtml_collection_t * myhtml_collection_destroy(myhtml_collection_t *collection); -myhtml_status_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); +mystatus_t myhtml_collection_check_size(myhtml_collection_t *collection, size_t need, size_t upto_length); // strings -myhtml_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); -myhtml_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, myhtml_encoding_t encoding); +mycore_string_t * myhtml_node_text_set(myhtml_tree_node_t *node, const char* text, size_t length, myencoding_t encoding); +mycore_string_t * myhtml_node_text_set_with_charef(myhtml_tree_node_t *node, const char* text, size_t length, myencoding_t encoding); bool myhtml_utils_strcmp(const char* ab, const char* to_lowercase, size_t size); bool myhtml_is_html_node(myhtml_tree_node_t *node, myhtml_tag_id_t tag_id); // queue -myhtml_status_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token); - -/** - * Platform-specific hdef performance clock queries. - * Implemented in perf.c - */ - -/** Get clock resolution */ -uint64_t myhtml_hperf_res(myhtml_status_t *status); - -/** Get current value in clock ticks */ -uint64_t myhtml_hperf_clock(myhtml_status_t *status); - -/** Print an hperf measure */ -myhtml_status_t myhtml_hperf_print(const char *name, uint64_t x, uint64_t y, FILE *fh); -myhtml_status_t myhtml_hperf_print_by_val(const char *name, uint64_t x, FILE *fh); +mystatus_t myhtml_queue_add(myhtml_tree_t *tree, size_t begin, myhtml_token_node_t* token); /* version */ myhtml_version_t myhtml_version(void); diff --git a/source/myhtml/mynamespace.c b/source/myhtml/mynamespace.c index 596b518..4821c75 100644 --- a/source/myhtml/mynamespace.c +++ b/source/myhtml/mynamespace.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,19 +20,19 @@ #include "myhtml/mynamespace.h" #include "myhtml/mynamespace_resource.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" const myhtml_namespace_detect_name_entry_t * myhtml_namespace_name_entry_by_name(const char* name, size_t length) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyHTML_NAMESPACE_DETECT_NAME_STATIC_SIZE) + 1; while (myhtml_namespace_detect_name_entry_static_list_index[idx].name) { if(myhtml_namespace_detect_name_entry_static_list_index[idx].name_length == length) { - if(myhtml_strncasecmp(myhtml_namespace_detect_name_entry_static_list_index[idx].name, name, length) == 0) + if(mycore_strncasecmp(myhtml_namespace_detect_name_entry_static_list_index[idx].name, name, length) == 0) return &myhtml_namespace_detect_name_entry_static_list_index[idx]; if(myhtml_namespace_detect_name_entry_static_list_index[idx].next) diff --git a/source/myhtml/mynamespace.h b/source/myhtml/mynamespace.h index 0d8d0e9..755cd09 100644 --- a/source/myhtml/mynamespace.h +++ b/source/myhtml/mynamespace.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,7 +31,7 @@ extern "C" { #include #include "myhtml/myosi.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" struct myhtml_namespace_detect_name_entry { const char* name; diff --git a/source/myhtml/mynamespace_resource.h b/source/myhtml/mynamespace_resource.h index e584cb7..be20f0b 100644 --- a/source/myhtml/mynamespace_resource.h +++ b/source/myhtml/mynamespace_resource.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/myosi.c b/source/myhtml/myosi.c deleted file mode 100644 index cd1e683..0000000 --- a/source/myhtml/myosi.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/myosi.h" - -void * myhtml_mem_malloc(size_t size) -{ - return malloc(size); -} - -// see who's call realloc -void * myhtml_mem_realloc(void* dst, size_t size) -{ - return realloc(dst, size); -} - -void * myhtml_mem_calloc(size_t num, size_t size) -{ - return calloc(num, size); -} - -void myhtml_mem_free(void* dst) -{ - free(dst); -} - -void myhtml_print(FILE* out, const char* format, ...) -{ - va_list argptr; - va_start(argptr, format); - vfprintf(out, format, argptr); - va_end(argptr); -} diff --git a/source/myhtml/myosi.h b/source/myhtml/myosi.h index 3901fae..cdc14db 100644 --- a/source/myhtml/myosi.h +++ b/source/myhtml/myosi.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,181 +22,23 @@ #define MyHTML_MYOSI_H #pragma once -#include -#include -#include -#include -#include -#include +#include "mycore/myosi.h" -#define MyHTML_VERSION_MAJOR 3 +#define MyHTML_VERSION_MAJOR 4 #define MyHTML_VERSION_MINOR 0 #define MyHTML_VERSION_PATCH 0 -#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WINPTHREADS_VERSION) -#define IS_OS_WINDOWS -#include -#endif - -#if defined(_MSC_VER) -# define MyHTML_DEPRECATED(func) __declspec(deprecated) func -#elif defined(__GNUC__) || defined(__INTEL_COMPILER) -# define MyHTML_DEPRECATED(func) func __attribute__((deprecated)) -#else -# define MyHTML_DEPRECATED(func) func -#endif +#define MyHTML_VERSION_STRING MyCORE_STR(MyHTML_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyHTML_VERSION_PATCH) #ifdef __cplusplus extern "C" { #endif -/* Mem */ -#ifdef MyHTML_EXTERN_MALLOC - extern void * MyHTML_EXTERN_MALLOC(size_t size); - #define myhtml_malloc MyHTML_EXTERN_MALLOC -#else - #define myhtml_malloc myhtml_mem_malloc -#endif - -#ifdef MyHTML_EXTERN_REALLOC - extern void * MyHTML_EXTERN_REALLOC(void* dst, size_t size); - #define myhtml_realloc MyHTML_EXTERN_REALLOC -#else - #define myhtml_realloc myhtml_mem_realloc -#endif - -#ifdef MyHTML_EXTERN_CALLOC - extern void * MyHTML_EXTERN_CALLOC(size_t num, size_t size); - #define myhtml_calloc MyHTML_EXTERN_CALLOC -#else - #define myhtml_calloc myhtml_mem_calloc -#endif - -#ifdef MyHTML_EXTERN_FREE - extern void MyHTML_EXTERN_FREE(void* dst); - #define myhtml_free MyHTML_EXTERN_FREE -#else - #define myhtml_free myhtml_mem_free -#endif - -/* Debug */ -#ifdef DEBUG_MODE - #define MyHTML_DEBUG(format, ...) \ - myhtml_print(stderr, "DEBUG: "format"\n", ##__VA_ARGS__) -#else - #define MyHTML_DEBUG(format, ...) -#endif - -#ifdef DEBUG_MODE - #define MyHTML_DEBUG_ERROR(format, ...) \ - myhtml_print(stderr, "DEBUG ERROR: "format"\n", ##__VA_ARGS__) -#else - #define MyHTML_DEBUG_ERROR(format, ...) -#endif - -#define myhtml_base_add(myhtml, point, lenn, sizen, strcn, size) \ - myhtml->Lenn++; \ - if(myhtml->lenn == myhtml->sizen) { \ - myhtml->sizen += size; \ - myhtml->point = (strcn*)myhtml_realloc(myhtml->point, \ - sizeof(strcn) * myhtml->sizen); \ - } - #define MyHTML_FAILED(_status_) ((_status_) != MyHTML_STATUS_OK) -// encoding -// https://encoding.spec.whatwg.org/#the-encoding -// https://encoding.spec.whatwg.org/#legacy-single-byte-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(simplified)-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-chinese-(traditional)-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-japanese-encodings -// https://encoding.spec.whatwg.org/#legacy-multi-byte-korean-encodings -// https://encoding.spec.whatwg.org/#legacy-miscellaneous-encodings - -enum myhtml_encoding_list { - MyHTML_ENCODING_DEFAULT = 0x00, -// MyHTML_ENCODING_AUTO = 0x01, // future - MyHTML_ENCODING_NOT_DETERMINED = 0x02, - MyHTML_ENCODING_UTF_8 = 0x00, // default encoding - MyHTML_ENCODING_UTF_16LE = 0x04, - MyHTML_ENCODING_UTF_16BE = 0x05, - MyHTML_ENCODING_X_USER_DEFINED = 0x06, - MyHTML_ENCODING_BIG5 = 0x07, - MyHTML_ENCODING_EUC_JP = 0x08, - MyHTML_ENCODING_EUC_KR = 0x09, - MyHTML_ENCODING_GB18030 = 0x0a, - MyHTML_ENCODING_GBK = 0x0b, - MyHTML_ENCODING_IBM866 = 0x0c, - MyHTML_ENCODING_ISO_2022_JP = 0x0d, - MyHTML_ENCODING_ISO_8859_10 = 0x0e, - MyHTML_ENCODING_ISO_8859_13 = 0x0f, - MyHTML_ENCODING_ISO_8859_14 = 0x10, - MyHTML_ENCODING_ISO_8859_15 = 0x11, - MyHTML_ENCODING_ISO_8859_16 = 0x12, - MyHTML_ENCODING_ISO_8859_2 = 0x13, - MyHTML_ENCODING_ISO_8859_3 = 0x14, - MyHTML_ENCODING_ISO_8859_4 = 0x15, - MyHTML_ENCODING_ISO_8859_5 = 0x16, - MyHTML_ENCODING_ISO_8859_6 = 0x17, - MyHTML_ENCODING_ISO_8859_7 = 0x18, - MyHTML_ENCODING_ISO_8859_8 = 0x19, - MyHTML_ENCODING_ISO_8859_8_I = 0x1a, - MyHTML_ENCODING_KOI8_R = 0x1b, - MyHTML_ENCODING_KOI8_U = 0x1c, - MyHTML_ENCODING_MACINTOSH = 0x1d, - MyHTML_ENCODING_SHIFT_JIS = 0x1e, - MyHTML_ENCODING_WINDOWS_1250 = 0x1f, - MyHTML_ENCODING_WINDOWS_1251 = 0x20, - MyHTML_ENCODING_WINDOWS_1252 = 0x21, - MyHTML_ENCODING_WINDOWS_1253 = 0x22, - MyHTML_ENCODING_WINDOWS_1254 = 0x23, - MyHTML_ENCODING_WINDOWS_1255 = 0x24, - MyHTML_ENCODING_WINDOWS_1256 = 0x25, - MyHTML_ENCODING_WINDOWS_1257 = 0x26, - MyHTML_ENCODING_WINDOWS_1258 = 0x27, - MyHTML_ENCODING_WINDOWS_874 = 0x28, - MyHTML_ENCODING_X_MAC_CYRILLIC = 0x29, - MyHTML_ENCODING_LAST_ENTRY = 0x2a -} -typedef myhtml_encoding_t; - -typedef struct myhtml_encoding_result myhtml_encoding_result_t; -typedef struct myhtml_encoding_trigram myhtml_encoding_trigram_t; -typedef struct myhtml_encoding_trigram_result myhtml_encoding_trigram_result_t; -typedef struct myhtml_encoding_unicode_result myhtml_encoding_unicode_result_t; -typedef struct myhtml_encoding_detect_name_entry myhtml_encoding_detect_name_entry_t; -typedef struct myhtml_encoding_detect_attr myhtml_encoding_detect_attr_t; -typedef struct myhtml_encoding_entry_name_index myhtml_encoding_entry_name_index_t; - // char references typedef struct myhtml_data_process_entry myhtml_data_process_entry_t; -// strings -typedef struct myhtml_string_raw myhtml_string_raw_t; -typedef struct myhtml_string myhtml_string_t; - -// thread -enum mythread_thread_opt { - MyTHREAD_OPT_UNDEF = 0x00, - MyTHREAD_OPT_WAIT = 0x01, - MyTHREAD_OPT_QUIT = 0x02, - MyTHREAD_OPT_STOP = 0x04, - MyTHREAD_OPT_DONE = 0x08 -} -typedef mythread_thread_opt_t; - -typedef struct mythread_queue_list_entry mythread_queue_list_entry_t; -typedef struct mythread_queue_thread_param mythread_queue_thread_param_t; -typedef struct mythread_queue_list mythread_queue_list_t; -typedef struct mythread_queue_node mythread_queue_node_t; -typedef struct mythread_queue mythread_queue_t; - -typedef size_t mythread_id_t; -typedef struct mythread_workers_list mythread_workers_list_t; -typedef struct mythread_context mythread_context_t; -typedef struct mythread_list mythread_list_t; -typedef struct mythread mythread_t; - // tree enum myhtml_tree_flags { MyHTML_TREE_FLAGS_CLEAN = 0x000, @@ -386,68 +228,33 @@ enum myhtml_insertion_mode { // base /* Very important!!! - - for myhtml 0..00ffff; MyHTML_STATUS_OK == 0x000000 - for mycss and modules 010000..01ffff; MyCSS_STATUS_OK == 0x000000 - for modest 020000..02ffff; MODEST_STATUS_OK == 0x000000 - for myrender 030000..03ffff; MyRENDER_STATUS_OK == 0x000000 - for mydom 040000..04ffff; MyDOM_STATUS_OK == 0x000000 - for mynetwork 050000..05ffff; MyNETWORK_STATUS_OK == 0x000000 - for myecma 060000..06ffff; MyECMA_STATUS_OK == 0x000000 - not occupied 070000.. + See mycore/myosi.h:mystatus_t */ enum myhtml_status { MyHTML_STATUS_OK = 0x0000, MyHTML_STATUS_ERROR = 0x0001, MyHTML_STATUS_ERROR_MEMORY_ALLOCATION = 0x0002, - MyHTML_STATUS_THREAD_ERROR_MEMORY_ALLOCATION = 0x0009, - MyHTML_STATUS_THREAD_ERROR_LIST_INIT = 0x000a, - MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC = 0x000b, - MyHTML_STATUS_THREAD_ERROR_ATTR_INIT = 0x000c, - MyHTML_STATUS_THREAD_ERROR_ATTR_SET = 0x000d, - MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY = 0x000e, - MyHTML_STATUS_THREAD_ERROR_NO_SLOTS = 0x000f, - MyHTML_STATUS_THREAD_ERROR_BATCH_INIT = 0x0010, - MyHTML_STATUS_THREAD_ERROR_WORKER_MALLOC = 0x0011, - MyHTML_STATUS_THREAD_ERROR_WORKER_SEM_CREATE = 0x0012, - MyHTML_STATUS_THREAD_ERROR_WORKER_THREAD_CREATE = 0x0013, - MyHTML_STATUS_THREAD_ERROR_MASTER_THREAD_CREATE = 0x0014, - MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC = 0x0032, - MyHTML_STATUS_THREAD_ERROR_SEM_CREATE = 0x0033, - MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC = 0x003c, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC = 0x003d, - MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC = 0x003e, - MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC = 0x0046, - MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT = 0x0047, - MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK = 0x0048, - MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK = 0x0049, - MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x0064, - MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF = 0x00c8, - MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK = 0x00c9, - MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x012c, - MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x012d, - MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x0190, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x0191, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x0192, - MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x0193, - MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x0194, - MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x0195, - MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x01f4, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x01f5, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x01f6, - MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x01f7, - MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x01f8, - MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x0258, - MyHTML_STATUS_ATTR_ERROR_CREATE = 0x0259, - MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x0300, - MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x0301, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x0302, - MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x0303, - MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x0304, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE = 0x0340, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE = 0x0341, - MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT = 0x0342, - MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC = 0x0343 + MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION = 0x9064, + MyHTML_STATUS_TOKENIZER_ERROR_MEMORY_ALLOCATION = 0x912c, + MyHTML_STATUS_TOKENIZER_ERROR_FRAGMENT_INIT = 0x912d, + MyHTML_STATUS_TAGS_ERROR_MEMORY_ALLOCATION = 0x9190, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE = 0x9191, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_MALLOC = 0x9192, + MyHTML_STATUS_TAGS_ERROR_MCOBJECT_CREATE_NODE = 0x9193, + MyHTML_STATUS_TAGS_ERROR_CACHE_MEMORY_ALLOCATION = 0x9194, + MyHTML_STATUS_TAGS_ERROR_INDEX_MEMORY_ALLOCATION = 0x9195, + MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION = 0x91f4, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE = 0x91f5, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT = 0x91f6, + MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE = 0x91f7, + MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE = 0x91f8, + MyHTML_STATUS_ATTR_ERROR_ALLOCATION = 0x9258, + MyHTML_STATUS_ATTR_ERROR_CREATE = 0x9259, + MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE = 0x9300, + MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT = 0x9301, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_CREATE = 0x9302, + MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT = 0x9303, + MyHTML_STATUS_STREAM_BUFFER_ERROR_ADD_ENTRY = 0x9304 } typedef myhtml_status_t; @@ -486,7 +293,6 @@ struct myhtml_version { } typedef myhtml_version_t; -typedef struct myhtml_incoming_buffer myhtml_incoming_buffer_t; typedef myhtml_token_attr_t myhtml_tree_attr_t; typedef struct myhtml_collection myhtml_collection_t; typedef struct myhtml myhtml_t; @@ -498,24 +304,14 @@ typedef size_t (*myhtml_tokenizer_state_f)(myhtml_tree_t* tree, myhtml_token_nod typedef bool (*myhtml_insertion_f)(myhtml_tree_t* tree, myhtml_token_node_t* token); // char references state -typedef size_t (*myhtml_data_process_state_f)(myhtml_data_process_entry_t* charef, myhtml_string_t* str, const char* data, size_t offset, size_t size); +typedef size_t (*myhtml_data_process_state_f)(myhtml_data_process_entry_t* charef, mycore_string_t* str, const char* data, size_t offset, size_t size); // callback functions typedef void* (*myhtml_callback_token_f)(myhtml_tree_t* tree, myhtml_token_node_t* token, void* ctx); typedef void (*myhtml_callback_tree_node_f)(myhtml_tree_t* tree, myhtml_tree_node_t* node, void* ctx); // find attribute value functions -typedef bool (*myhtml_attribute_value_find_f)(myhtml_string_t* str_key, const char* value, size_t value_len); - -// callback to be implemented by the user -typedef void (*myhtml_callback_serialize_f)(const char* buffer, size_t size, void* ctx); - -void * myhtml_mem_malloc(size_t size); -void * myhtml_mem_realloc(void* dst, size_t size); -void * myhtml_mem_calloc(size_t num, size_t size); -void myhtml_mem_free(void* dst); - -void myhtml_print(FILE* out, const char* format, ...); +typedef bool (*myhtml_attribute_value_find_f)(mycore_string_t* str_key, const char* value, size_t value_len); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myhtml/mystring.c b/source/myhtml/mystring.c index a353e60..71888e4 100644 --- a/source/myhtml/mystring.c +++ b/source/myhtml/mystring.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,205 +19,11 @@ */ #include "myhtml/mystring.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" -///////////////////////////////////////////////////////// -//// Init, Clean, Destroy -//// -///////////////////////////////////////////////////////// -char * myhtml_string_init(mchar_async_t *mchar, size_t node_idx, myhtml_string_t* str, size_t size) -{ - str->data = mchar_async_malloc(mchar, node_idx, size); - str->size = size; - str->node_idx = node_idx; - str->mchar = mchar; - - myhtml_string_clean(str); - - return str->data; -} - -void myhtml_string_clean(myhtml_string_t* str) -{ - str->length = 0; -} - -void myhtml_string_clean_all(myhtml_string_t* str) -{ - memset(str, 0, sizeof(myhtml_string_t)); -} - -myhtml_string_t * myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj) -{ - if(str == NULL) - return NULL; - - if(str->data && str->mchar) - mchar_async_free(str->mchar, str->node_idx, str->data); - - if(destroy_obj && str) { - myhtml_free(str); - return NULL; - } - - return str; -} - -void myhtml_string_raw_clean(myhtml_string_raw_t* str_raw) -{ - str_raw->length = 0; -} - -void myhtml_string_raw_clean_all(myhtml_string_raw_t* str_raw) -{ - memset(str_raw, 0, sizeof(myhtml_string_raw_t)); -} - -myhtml_string_raw_t * myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj) -{ - if(str_raw == NULL) - return NULL; - - if(str_raw->data) { - myhtml_free(str_raw->data); - str_raw->data = NULL; - } - - if(destroy_obj && str_raw) { - myhtml_free(str_raw); - return NULL; - } - - return str_raw; -} - -char * myhtml_string_realloc(myhtml_string_t *str, size_t new_size) -{ - if(str == NULL) - return NULL; - - char *tmp = mchar_async_realloc(str->mchar, str->node_idx, str->data, str->length, new_size); - - if(tmp) { - str->size = new_size; - str->data = tmp; - } - else - return NULL; - - return tmp; -} - -///////////////////////////////////////////////////////// -//// Basic API -//// -///////////////////////////////////////////////////////// -char * myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size) -{ - return mchar_async_malloc(mchar, node_id, size); -} - -char * myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size) -{ - return mchar_async_realloc(mchar, node_id, data, len_to_copy, size); -} - -void myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data) +size_t myhtml_string_append_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, bool emit_null_chars) { - mchar_async_free(mchar, node_id, data); -} - -char * myhtml_string_data(myhtml_string_t *str) -{ - if(str == NULL) - return NULL; - - return str->data; -} - -size_t myhtml_string_length(myhtml_string_t *str) -{ - if(str == NULL) - return 0; - - return str->length; -} - -size_t myhtml_string_size(myhtml_string_t *str) -{ - if(str == NULL) - return 0; - - return str->size; -} - -char * myhtml_string_data_set(myhtml_string_t *str, char *data) -{ - if(str == NULL) - return NULL; - - str->data = data; - return str->data; -} - -size_t myhtml_string_size_set(myhtml_string_t *str, size_t size) -{ - if(str == NULL) - return 0; - - str->size = size; - return str->size; -} - -size_t myhtml_string_length_set(myhtml_string_t *str, size_t length) -{ - if(str == NULL) - return 0; - - str->length = length; - return str->length; -} - -///////////////////////////////////////////////////////// -//// Append API -//// -///////////////////////////////////////////////////////// -void myhtml_string_append(myhtml_string_t* str, const char* buff, size_t length) -{ - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); - - memcpy(&str->data[str->length], buff, (sizeof(char) * length)); - - str->length += length; - str->data[str->length] = '\0'; -} - -void myhtml_string_append_one(myhtml_string_t* str, const char data) -{ - MyHTML_STRING_REALLOC_IF_NEED(str, 2, 1); - MyHTML_STRING_APPEND_BYTE_WITHOUT_REALLOC(data, str); - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC('\0', str); -} - -void myhtml_string_append_lowercase(myhtml_string_t* str, const char* data, size_t length) -{ - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); - - unsigned char *ref = (unsigned char*)&str->data[str->length]; - const unsigned char *buf = (const unsigned char*)data; - - size_t i; - for(i = 0; i < length; i++) { - ref[i] = myhtml_string_chars_lowercase_map[ buf[i] ]; - } - - ref[i] = '\0'; - str->length += length; -} - -size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars) -{ - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); unsigned char *data = (unsigned char*)str->data; const unsigned char *u_buff = (const unsigned char*)buff; @@ -236,12 +42,16 @@ size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* } else { str->length++; + + MyCORE_STRING_REALLOC_IF_NEED(str, 0, 2); + str->data[str->length] = '\0'; + return str->length; } } else if(u_buff[i] == 0x00 && emit_null_chars == false) { - myhtml_string_realloc(str, (str->size + 5)); + mycore_string_realloc(str, (str->size + 5)); data = (unsigned char*)str->data; // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) @@ -260,9 +70,9 @@ size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* return 0; } -size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars) +size_t myhtml_string_append_lowercase_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, bool emit_null_chars) { - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); unsigned char *data = (unsigned char*)str->data; const unsigned char *u_buff = (const unsigned char*)buff; @@ -278,12 +88,16 @@ size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, c } else { str->length++; + + MyCORE_STRING_REALLOC_IF_NEED(str, 0, 2); + str->data[str->length] = '\0'; + return str->length; } } else if(u_buff[i] == 0x00 && emit_null_chars == false) { - myhtml_string_realloc(str, (str->size + 5)); + mycore_string_realloc(str, (str->size + 5)); data = (unsigned char*)str->data; // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) @@ -292,7 +106,7 @@ size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, c data[str->length] = 0xBD; } else { - data[str->length] = myhtml_string_chars_lowercase_map[ u_buff[i] ]; + data[str->length] = mycore_string_chars_lowercase_map[ u_buff[i] ]; } str->length++; @@ -303,7 +117,7 @@ size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, c return 0; } -size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const char* buff, size_t length, size_t last_position) +size_t myhtml_string_before_append_any_preprocessing(mycore_string_t* str, const char* buff, size_t length, size_t last_position) { if(last_position == 0 || length == 0) return 0; @@ -318,27 +132,27 @@ size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const //// Append With Convert Encoding and Preprocessing API //// ///////////////////////////////////////////////////////// -size_t myhtml_string_append_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +size_t myhtml_string_append_with_convert_encoding_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars) { - myhtml_encoding_result_t res; - myhtml_encoding_result_clean(&res); + myencoding_result_t res; + myencoding_result_clean(&res); return myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &res, buff, length, encoding, emit_null_chars); } -size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars) { - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); unsigned const char* u_buff = (unsigned const char*)buff; - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + const myencoding_custom_f func = myencoding_get_function_by_id(encoding); for (size_t i = 0; i < length; i++) { - if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 1); + if(func(u_buff[i], res) == MyENCODING_STATUS_OK) { + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 1); - size_t len = myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); + size_t len = myencoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); if(len == 1) { if(str->data[str->length] == '\r') { @@ -350,12 +164,16 @@ size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtm } else { str->length++; + + MyCORE_STRING_REALLOC_IF_NEED(str, 0, 2); + str->data[str->length] = '\0'; + return str->length; } } else if(str->data[str->length] == 0x00 && emit_null_chars == false) { - myhtml_string_realloc(str, (str->size + 5)); + mycore_string_realloc(str, (str->size + 5)); // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) str->data[str->length] = (char)0xEF; str->length++; @@ -368,32 +186,32 @@ size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtm } } - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); return 0; } -size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars) { - myhtml_encoding_result_t res; - myhtml_encoding_result_clean(&res); + myencoding_result_t res; + myencoding_result_clean(&res); return myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &res, buff, length, encoding, emit_null_chars); } -size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars) +size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars) { - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); + MyCORE_STRING_REALLOC_IF_NEED(str, (length + 1), 0); unsigned const char* u_buff = (unsigned const char*)buff; - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); + const myencoding_custom_f func = myencoding_get_function_by_id(encoding); for (size_t i = 0; i < length; i++) { - if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 1); + if(func(u_buff[i], res) == MyENCODING_STATUS_OK) { + MyCORE_STRING_REALLOC_IF_NEED(str, 5, 1); - size_t len = myhtml_encoding_codepoint_to_lowercase_ascii_utf_8(res->result, &str->data[str->length]); + size_t len = myencoding_codepoint_to_lowercase_ascii_utf_8(res->result, &str->data[str->length]); if(len == 1) { if(str->data[str->length] == '\r') { @@ -405,12 +223,16 @@ size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preproces } else { str->length++; + + MyCORE_STRING_REALLOC_IF_NEED(str, 0, 2); + str->data[str->length] = '\0'; + return str->length; } } else if(str->data[str->length] == 0x00 && emit_null_chars == false) { - myhtml_string_realloc(str, (str->size + 5)); + mycore_string_realloc(str, (str->size + 5)); // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) str->data[str->length] = (char)0xEF; str->length++; @@ -423,182 +245,7 @@ size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preproces } } - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); + MyCORE_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); return 0; } - -///////////////////////////////////////////////////////// -//// Append With Convert Encoding without Preprocessing API -//// -///////////////////////////////////////////////////////// -void myhtml_string_append_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding) -{ - myhtml_encoding_result_t res; - myhtml_encoding_result_clean(&res); - - myhtml_string_append_chunk_with_convert_encoding(str, &res, buff, length, encoding); -} - -void myhtml_string_append_chunk_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding) -{ - unsigned const char* u_buff = (unsigned const char*)buff; - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); - - for (size_t i = 0; i < length; i++) - { - if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); - str->length += myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); - } - } - - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); -} - -void myhtml_string_append_one_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char data, myhtml_encoding_t encoding) -{ - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); - - if(func((unsigned const char)data, res) == MyHTML_ENCODING_STATUS_OK) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 0); - str->length += myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); - - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC('\0', str); - } -} - - -void myhtml_string_append_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding) -{ - myhtml_encoding_result_t res; - myhtml_encoding_result_clean(&res); - - myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(str, &res, buff, length, encoding); -} - -void myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding) -{ - unsigned const char* u_buff = (unsigned const char*)buff; - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(encoding); - - for (size_t i = 0; i < length; i++) - { - if(func(u_buff[i], res) == MyHTML_ENCODING_STATUS_OK) { - MyHTML_STRING_REALLOC_IF_NEED(str, 5, 1); - - size_t insert_len = myhtml_encoding_codepoint_to_ascii_utf_8(res->result, &str->data[str->length]); - - if(insert_len == 1) { - str->data[str->length] = (const char)myhtml_string_chars_lowercase_map[ u_buff[i] ]; - } - - str->length += insert_len; - } - } - - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT('\0', str, 1); -} - -void myhtml_string_copy(myhtml_string_t* dest, myhtml_string_t* target) -{ - myhtml_string_append(dest, target->data, target->length); -} - -size_t myhtml_string_raw_copy(char* str1, const char* str2, size_t size) -{ - str1[size] = '\0'; - - while(size) { - size--; - str1[size] = str2[size]; - } - - return size; -} - -size_t myhtml_string_raw_set_replacement_character(myhtml_string_t* target, size_t position) -{ - // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) - target->data[(position)] = (char)0xEF; - target->data[(position + 1)] = (char)0xBF; - target->data[(position + 2)] = (char)0xBD; - - return 3; -} - -void myhtml_string_append_with_replacement_null_characters_only(myhtml_string_t* str, const char* buff, size_t length) -{ - MyHTML_STRING_REALLOC_IF_NEED(str, (length + 1), 0); - - unsigned char *data = (unsigned char*)str->data; - const unsigned char *u_buff = (const unsigned char*)buff; - - for (size_t i = 0; i < length; i++) - { - if(u_buff[i] == 0x00) { - myhtml_string_realloc(str, (str->size + 5)); - data = (unsigned char*)str->data; - - // Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD) - data[str->length] = 0xEF; str->length++; - data[str->length] = 0xBF; str->length++; - data[str->length] = 0xBD; - } - else - data[str->length] = u_buff[i]; - - str->length++; - } - - str->data[str->length] = '\0'; -} - -void myhtml_string_stay_only_whitespace(myhtml_string_t* target) -{ - char *data = target->data; - size_t pos = 0; - - for(size_t i = 0; i < target->length; i++) - { - if(myhtml_mystring_whitespace(data[i], ==, ||)) { - data[pos] = data[i]; - pos++; - } - } - - target->length = pos; -} - -size_t myhtml_string_crop_whitespace_from_begin(myhtml_string_t* target) -{ - char *data = target->data; - size_t i; - - for(i = 0; i < target->length; i++) { - if(myhtml_mystring_whitespace(data[i], !=, &&)) - break; - } - - if(i) - target->data = mchar_async_crop_first_chars_without_cache(target->data, i); - - target->length -= i; - - return i; -} - -size_t myhtml_string_whitespace_from_begin(myhtml_string_t* target) -{ - char *data = target->data; - size_t i; - - for(i = 0; i < target->length; i++) { - if(myhtml_mystring_whitespace(data[i], !=, &&)) - break; - } - - return i; -} - - diff --git a/source/myhtml/mystring.h b/source/myhtml/mystring.h index 0a0c02c..2906d59 100644 --- a/source/myhtml/mystring.h +++ b/source/myhtml/mystring.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -25,129 +25,31 @@ #ifdef __cplusplus extern "C" { #endif - + #include "myhtml/myosi.h" -#include "myhtml/encoding.h" -#include "myhtml/utils/mchar_async.h" + +#include "myencoding/encoding.h" +#include "myencoding/mystring.h" + +#include "mycore/mystring.h" +#include "mycore/utils/mchar_async.h" #define myhtml_string_get(str, attr) str->attr #define myhtml_string_set(str, attr) myhtml_string_get(str, attr) #define myhtml_string_len(str) myhtml_string_get(str, length) -#define MyHTML_STRING_PREPROCESSOR_CHECK_BUFFER_SIZE(str, unsigned_data) \ - if(str->length >= str->size) { \ - myhtml_string_realloc(str, (str->length + 5)); \ - \ - unsigned_data = (unsigned char*)str->data; \ - } - -#define MyHTML_STRING_REALLOC_IF_NEED(str, need_length, upto) \ - if((str->length + need_length) >= str->size) { \ - myhtml_string_realloc(str, (str->length + need_length + upto)); \ - } \ - -#define MyHTML_STRING_APPEND_BYTE_WITHOUT_REALLOC(onechar, str) \ - str->data[str->length] = onechar; \ - str->length++ - -#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto) \ - if(str->length >= str->size) { \ - myhtml_string_realloc(str, (str->length + upto)); \ - } \ - str->data[str->length] = onechar - -#define MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT_REALLOC(onechar, str) \ - str->data[str->length] = onechar - -#define MyHTML_STRING_APPEND_BYTE(onechar, str, upto) \ - MyHTML_STRING_APPEND_BYTE_WITHOUT_INCREMENT(onechar, str, upto); \ - str->length++ - -#define myhtml_mystring_whitespace(onechar, action, logic) \ - (onechar action ' ' logic \ - onechar action '\t' logic \ - onechar action '\n' logic \ - onechar action '\f' logic \ - onechar action '\r') - -struct myhtml_string { - char* data; - size_t size; - size_t length; - - mchar_async_t *mchar; - size_t node_idx; -}; - -struct myhtml_string_raw { - char* data; - size_t size; - size_t length; -}; - -typedef size_t myhtml_string_index_t; - -char * myhtml_string_init(mchar_async_t *mchar, size_t node_idx, myhtml_string_t* str, size_t size); -char * myhtml_string_realloc(myhtml_string_t *str, size_t new_size); - -void myhtml_string_clean(myhtml_string_t* str); -void myhtml_string_clean_all(myhtml_string_t* str); -myhtml_string_t * myhtml_string_destroy(myhtml_string_t* str, bool destroy_obj); - -void myhtml_string_raw_clean(myhtml_string_raw_t* str_raw); -void myhtml_string_raw_clean_all(myhtml_string_raw_t* str_raw); -myhtml_string_raw_t * myhtml_string_raw_destroy(myhtml_string_raw_t* str_raw, bool destroy_obj); - -/* basic api */ -char * myhtml_string_data_alloc(mchar_async_t *mchar, size_t node_id, size_t size); -char * myhtml_string_data_realloc(mchar_async_t *mchar, size_t node_id, char *data, size_t len_to_copy, size_t size); -void myhtml_string_data_free(mchar_async_t *mchar, size_t node_id, char *data); - -char * myhtml_string_data(myhtml_string_t *str); -size_t myhtml_string_length(myhtml_string_t *str); -size_t myhtml_string_size(myhtml_string_t *str); -char * myhtml_string_data_set(myhtml_string_t *str, char *data); -size_t myhtml_string_size_set(myhtml_string_t *str, size_t size); -size_t myhtml_string_length_set(myhtml_string_t *str, size_t length); - -/* append */ -void myhtml_string_append(myhtml_string_t* str, const char* data, size_t length); -void myhtml_string_append_one(myhtml_string_t* str, const char data); -void myhtml_string_append_lowercase(myhtml_string_t* str, const char* data, size_t length); -void myhtml_string_append_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); - -/* append with convert encoding */ -void myhtml_string_append_chunk_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); -void myhtml_string_append_one_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char data, myhtml_encoding_t encoding); - -/* append with convert encoding lowercase */ -void myhtml_string_append_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding); -void myhtml_string_append_chunk_lowercase_ascii_with_convert_encoding(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding); - -/* Oh, long long long name */ - /* append with convert encoding with preprocessing */ -size_t myhtml_string_append_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); -size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_with_convert_encoding_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); /* append with convert encoding lowercase with preprocessing */ -size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); -size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(myhtml_string_t* str, myhtml_encoding_result_t* res, const char* buff, size_t length, myhtml_encoding_t encoding, bool emit_null_chars); - -void myhtml_string_append_with_replacement_null_characters_only(myhtml_string_t* str, const char* buff, size_t length); +size_t myhtml_string_append_lowercase_with_convert_encoding_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); +size_t myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(mycore_string_t* str, myencoding_result_t* res, const char* buff, size_t length, myencoding_t encoding, bool emit_null_chars); /* append with preprocessing */ -size_t myhtml_string_before_append_any_preprocessing(myhtml_string_t* str, const char* buff, size_t length, size_t last_position); -size_t myhtml_string_append_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); -size_t myhtml_string_append_lowercase_with_preprocessing(myhtml_string_t* str, const char* buff, size_t length, bool emit_null_chars); -size_t myhtml_string_raw_set_replacement_character(myhtml_string_t* target, size_t position); - -/* other functions */ -void myhtml_string_copy(myhtml_string_t* dest, myhtml_string_t* target); -size_t myhtml_string_raw_copy(char* str1, const char* str2, size_t size); -void myhtml_string_stay_only_whitespace(myhtml_string_t* target); -size_t myhtml_string_crop_whitespace_from_begin(myhtml_string_t* target); -size_t myhtml_string_whitespace_from_begin(myhtml_string_t* target); +size_t myhtml_string_before_append_any_preprocessing(mycore_string_t* str, const char* buff, size_t length, size_t last_position); +size_t myhtml_string_append_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, bool emit_null_chars); +size_t myhtml_string_append_lowercase_with_preprocessing(mycore_string_t* str, const char* buff, size_t length, bool emit_null_chars); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myhtml/parser.c b/source/myhtml/parser.c index 95cdc1b..95a7764 100644 --- a/source/myhtml/parser.c +++ b/source/myhtml/parser.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,19 +24,19 @@ void myhtml_parser_stream(mythread_id_t thread_id, void* ctx) { mythread_queue_node_t *qnode = (mythread_queue_node_t*)ctx; - if((qnode->tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE) == 0) { - while(myhtml_rules_tree_dispatcher(qnode->tree, qnode->token)){} + if((((myhtml_tree_t*)(qnode->context))->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE) == 0) { + while(myhtml_rules_tree_dispatcher(qnode->context, qnode->args)){} } } -size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) +size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) { - myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + mycore_incoming_buffer_t *buffer = mycore_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); size_t relative_begin = begin - buffer->offset; // if token data length in one buffer then print them all at once if((relative_begin + length) <= buffer->size) { - if(tree->encoding == MyHTML_ENCODING_UTF_8) + if(tree->encoding == MyENCODING_UTF_8) myhtml_string_append_lowercase_with_preprocessing(str, &buffer->data[relative_begin], length, proc_entry->emit_null_char); else myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, @@ -57,7 +57,7 @@ size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_ size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], relative_end, save_position); if(relative_end > 0) { - if(tree->encoding == MyHTML_ENCODING_UTF_8) + if(tree->encoding == MyENCODING_UTF_8) save_position = myhtml_string_append_lowercase_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (relative_end - tmp_offset), proc_entry->emit_null_char); else save_position = myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, @@ -72,7 +72,7 @@ size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_ size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], length, save_position); if(length > 0) { - if(tree->encoding == MyHTML_ENCODING_UTF_8) + if(tree->encoding == MyENCODING_UTF_8) myhtml_string_append_lowercase_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), proc_entry->emit_null_char); else myhtml_string_append_lowercase_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, @@ -87,14 +87,14 @@ size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_ return str->length; } -size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) +size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) { - myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + mycore_incoming_buffer_t *buffer = mycore_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); size_t relative_begin = begin - buffer->offset; // if token data length in one buffer then print them all at once if((relative_begin + length) <= buffer->size) { - if(tree->encoding == MyHTML_ENCODING_UTF_8) + if(tree->encoding == MyENCODING_UTF_8) myhtml_string_append_with_preprocessing(str, &buffer->data[relative_begin], length, proc_entry->emit_null_char); else myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, @@ -115,7 +115,7 @@ size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], relative_end, save_position); if(relative_end > 0) { - if(tree->encoding == MyHTML_ENCODING_UTF_8) + if(tree->encoding == MyENCODING_UTF_8) save_position = myhtml_string_append_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (relative_end - tmp_offset), proc_entry->emit_null_char); else save_position = myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, @@ -131,12 +131,12 @@ size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* size_t tmp_offset = myhtml_string_before_append_any_preprocessing(str, &buffer->data[relative_begin], length, save_position); if(length > 0) { - if(tree->encoding == MyHTML_ENCODING_UTF_8) + if(tree->encoding == MyENCODING_UTF_8) myhtml_string_append_with_preprocessing(str, &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), proc_entry->emit_null_char); else myhtml_string_append_chunk_with_convert_encoding_with_preprocessing(str, &proc_entry->res, - &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), - proc_entry->encoding, proc_entry->emit_null_char); + &buffer->data[(relative_begin + tmp_offset)], (length - tmp_offset), + proc_entry->encoding, proc_entry->emit_null_char); } break; @@ -146,9 +146,9 @@ size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* return str->length; } -size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) +size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length) { - myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + mycore_incoming_buffer_t *buffer = mycore_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); size_t relative_begin = begin - buffer->offset; // if token data length in one buffer then print them all at once @@ -186,8 +186,8 @@ void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) { mythread_queue_node_t *qnode = (mythread_queue_node_t*)ctx; - myhtml_tree_t* tree = qnode->tree; - myhtml_token_node_t* token = qnode->token; + myhtml_tree_t* tree = qnode->context; + myhtml_token_node_t* token = qnode->args; /* * Tree can not be built without tokens @@ -201,8 +201,8 @@ void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) * return true * we need check both, 1 and 2 */ - if((qnode->tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN) && - (qnode->tree->parse_flags & 2)) + if((tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_PROCESS_TOKEN) && + (tree->parse_flags & 2)) { if(tree->callback_before_token) tree->callback_before_token_ctx = tree->callback_before_token(tree, token, tree->callback_before_token_ctx); @@ -215,15 +215,21 @@ void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) return; } + size_t mchar_node_id; +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(tree->myhtml->thread_batch) + mchar_node_id = tree->async_args[(thread_id + tree->myhtml->thread_batch->id_increase)].mchar_node_id; + else +#endif + mchar_node_id = tree->async_args[thread_id].mchar_node_id; + if(tree->callback_before_token) tree->callback_before_token_ctx = tree->callback_before_token(tree, token, tree->callback_before_token_ctx); - size_t mchar_node_id = qnode->tree->async_args[thread_id].mchar_node_id; - if(token->tag_id == MyHTML_TAG__TEXT || token->tag_id == MyHTML_TAG__COMMENT) { - myhtml_string_init(tree->mchar, mchar_node_id, &token->str, (token->raw_length + 1)); + mycore_string_init(tree->mchar, mchar_node_id, &token->str, (token->raw_length + 1)); token->attr_first = NULL; token->attr_last = NULL; @@ -246,7 +252,7 @@ void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) } else if(token->attr_first) { - myhtml_string_clean_all(&token->str); + mycore_string_clean_all(&token->str); myhtml_token_attr_t* attr = token->attr_first; myhtml_data_process_entry_t proc_entry; @@ -257,22 +263,22 @@ void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) myhtml_data_process_entry_clean(&proc_entry); proc_entry.encoding = tree->encoding; - myhtml_string_init(tree->mchar, mchar_node_id, &attr->key, (attr->raw_key_length + 1)); + mycore_string_init(tree->mchar, mchar_node_id, &attr->key, (attr->raw_key_length + 1)); myhtml_parser_token_data_to_string_lowercase(tree, &attr->key, &proc_entry, attr->raw_key_begin, attr->raw_key_length); } else - myhtml_string_clean_all(&attr->key); + mycore_string_clean_all(&attr->key); if(attr->raw_value_length) { myhtml_data_process_entry_clean(&proc_entry); proc_entry.encoding = tree->encoding; proc_entry.is_attributes = true; - myhtml_string_init(tree->mchar, mchar_node_id, &attr->value, (attr->raw_value_length + 1)); + mycore_string_init(tree->mchar, mchar_node_id, &attr->value, (attr->raw_value_length + 1)); myhtml_parser_token_data_to_string_charef(tree, &attr->value, &proc_entry, attr->raw_value_begin, attr->raw_value_length); } else - myhtml_string_clean_all(&attr->value); + mycore_string_clean_all(&attr->value); attr = attr->next; } @@ -281,7 +287,7 @@ void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) token->attr_first = NULL; token->attr_last = NULL; - myhtml_string_clean_all(&token->str); + mycore_string_clean_all(&token->str); } token->type |= MyHTML_TOKEN_TYPE_DONE; diff --git a/source/myhtml/parser.h b/source/myhtml/parser.h index a4d1ab9..d04e043 100644 --- a/source/myhtml/parser.h +++ b/source/myhtml/parser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -37,9 +37,9 @@ void myhtml_parser_stream(mythread_id_t thread_id, void* ctx); void myhtml_parser_worker(mythread_id_t thread_id, void* ctx); void myhtml_parser_worker_stream(mythread_id_t thread_id, void* ctx); -size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); -size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); -size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); +size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, mycore_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myhtml/perf.c b/source/myhtml/perf.c deleted file mode 100644 index f95faab..0000000 --- a/source/myhtml/perf.c +++ /dev/null @@ -1,288 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Authors: insoreiges@gmail.com (Evgeny Yakovlev), lex.borisov@gmail.com (Alexander Borisov) -*/ - -/** - * Platform-specific hdef performance clock value. - */ - -#include "myhtml/myhtml.h" -#include - -#if !defined(IS_OS_WINDOWS) -#include -#endif - -#if !defined(MyHTML_WITH_PERF) - -uint64_t myhtml_hperf_res(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF; - - return 0; -} - -uint64_t myhtml_hperf_clock(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF; - - return 0; -} - -#else - -#if defined(__APPLE__) -#include -#include -#elif defined(IS_OS_WINDOWS) -#endif - -#if defined(MyHTML_FORCE_RDTSC) /* Force using rdtsc, useful for comparison */ - -/** - * Get CPU rdtsc frequency. - * - * TODO: I think using rdtsc for measuring user-space counters is not correct: - * - rdtsc does not have a constant rate. instead ot is scaled to physical core's internal clock which changes due to power saving modes on modern CPUs - * - rdtsc is software-emulated in virtual machines which will introduce an inconsistency in reported ticks - * - user space process can be preempted between consecutive rdtsc measures but the physical clock will still tick while it is executing a different thread. - * also think what would happen if preempted process will be re-scheduled on a different physical core which has a different tsc value. - * - computing rdtsc frequency produces unreliable results (due to all of the above) - * - * Consider using platform-specific monotonic hperf timers (ftrace/dtrace) or even clock(). - */ -uint64_t myhtml_hperf_res(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - -#if defined(__APPLE__) && defined(CTL_HW) && defined(HW_CPU_FREQ) - unsigned long long freq = 0; - - /* OSX kernel: sysctl(CTL_HW | HW_CPU_FREQ) */ - size_t len = sizeof(freq); - int mib[2] = {CTL_HW, HW_CPU_FREQ}; - - int error = sysctl(mib, 2, &freq, &len, NULL, 0); - if (error) { - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; - } - - return freq; - -#elif defined(__linux__) - unsigned long long freq = 0; - - /* Use procfs on linux */ - FILE* fp = NULL; - fp = fopen("/proc/cpuinfo", "r"); - if (fp == NULL) { - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; - } - - /* Find 'CPU MHz :' */ - char buf[1024] = {0}; - double fval = 0.0; - while (fgets(buf, sizeof(buf), fp) != NULL) { - if (sscanf(buf, "cpu MHz : %lf\n", &fval) == 1) { - freq = (unsigned long long)(fval * 1000000ull); - break; - } - } - - fclose(fp); - return freq; - -#else -# warning Cant figure out cpu frequency on this platfrom - - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; -#endif /* defined __APPLE__ || __linux__ ... */ -} - -uint64_t myhtml_hperf_clock(myhtml_status_t *status) -{ - uint64_t x; - - __asm__ volatile ( - "cpuid\n\t" /* cpuid serializes any out-of-order prefetches before executing rdtsc (clobbers ebx, ecx, edx) */ - "rdtsc\n\t" - "shl $32, %%rdx\n\t" - "or %%rdx, %%rax" - : "=a" (x) - : - : "rdx", "ebx", "ecx"); - - return x; -} - -#elif defined(_POSIX_TIMERS) && defined(_POSIX_CPUTIME) \ - && defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 199309L) /* Do we have clock_gettime? */ - -#define NSEC_PER_SECOND 1000000000ull -#define TIMESPEC_TO_USEC(tspec) (((uint64_t)(tspec).tv_sec * NSEC_PER_SECOND) + (tspec).tv_nsec) - -uint64_t myhtml_hperf_res(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - struct timespec tspec; - int error = clock_getres(CLOCK_PROCESS_CPUTIME_ID, &tspec); - if (error) { - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; - } - - unsigned long long ticks_per_sec = (unsigned long long)((double)NSEC_PER_SECOND / TIMESPEC_TO_USEC(tspec)); - return ticks_per_sec; -} - -uint64_t myhtml_hperf_clock(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - struct timespec tspec; - int error = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tspec); - if (error) { - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; - } - - return TIMESPEC_TO_USEC(tspec); -} - -#elif defined(__APPLE__) && defined(__MACH__) - -/* - * TODO: on OSX we can use clock_get_time: http://stackoverflow.com/questions/5167269/clock-gettime-alternative-in-mac-os-x - * Or this: http://web.archive.org/web/20100517095152/http://www.wand.net.nz/~smr26/wordpress/2009/01/19/monotonic-time-in-mac-os-x/comment-page-1/ - */ - -// TODO: this is incorrect plug for mac os x -// look at links before this comment - -#include - -uint64_t myhtml_hperf_res(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - unsigned long long freq = 0; - - size_t len = sizeof(freq); - int mib[2] = {CTL_HW, HW_CPU_FREQ}; - - int error = sysctl(mib, 2, &freq, &len, NULL, 0); - if (error) { - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; - } - - return freq; -} - -uint64_t myhtml_hperf_clock(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - return mach_absolute_time(); -} - -#else - -# warning No hperf implementation for this platform - -uint64_t myhtml_hperf_res(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; -} - -uint64_t myhtml_hperf_clock(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_PERF_ERROR_FIND_CPU_CLOCK; - - return 0; -} - -#endif /* defined(MyHTML_FORCE_RDTSC) ... */ -#endif /* MyHTML_WITH_PERF */ - -#define _MyHTML_CHECK_STATUS_AND_PRINT_ERROR \ - if(status == MyHTML_STATUS_PERF_ERROR_COMPILED_WITHOUT_PERF) { \ - fprintf(fh, "MyHTML: Library compiled without perf source. Please, build library with -DMyHTML_WITH_PERF flag\n"); \ - } \ - else if(status) { \ - fprintf(fh, "MyHTML: Something wrong! Perhaps, your platform does not support the measurement of performance\n"); \ - } \ - else - -myhtml_status_t myhtml_hperf_print(const char *name, uint64_t x, uint64_t y, FILE *fh) { - myhtml_status_t status; - - unsigned long long freq = myhtml_hperf_res(&status); - - if(freq) { - _MyHTML_CHECK_STATUS_AND_PRINT_ERROR { - fprintf(fh, "%s: %0.5f\n", name, (((float)(y - x) / (float)freq))); - } - } - - return status; -} - -myhtml_status_t myhtml_hperf_print_by_val(const char *name, uint64_t x, FILE *fh) { - myhtml_status_t status; - - unsigned long long freq = myhtml_hperf_res(&status); - - if(freq) { - _MyHTML_CHECK_STATUS_AND_PRINT_ERROR { - fprintf(fh, "%s: %0.5f\n", name, ((float)x / (float)freq)); - } - } - - return status; -} - - diff --git a/source/myhtml/rules.c b/source/myhtml/rules.c index 3921952..17e08ce 100644 --- a/source/myhtml/rules.c +++ b/source/myhtml/rules.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -20,16 +20,16 @@ #include "myhtml/rules.h" -void myhtml_insertion_fix_emit_for_text_begin_ws(myhtml_token_node_t* token) +void myhtml_insertion_fix_emit_for_text_begin_ws(myhtml_token_t* token, myhtml_token_node_t* node) { - myhtml_token_node_wait_for_done(token); - myhtml_string_crop_whitespace_from_begin(&token->str); + myhtml_token_node_wait_for_done(token, node); + mycore_string_crop_whitespace_from_begin(&node->str); } myhtml_token_node_t * myhtml_insertion_fix_split_for_text_begin_ws(myhtml_tree_t* tree, myhtml_token_node_t* token) { - myhtml_token_node_wait_for_done(token); - size_t len = myhtml_string_whitespace_from_begin(&token->str); + myhtml_token_node_wait_for_done(tree->token, token); + size_t len = mycore_string_whitespace_from_begin(&token->str); if(len == 0) return NULL; @@ -40,9 +40,9 @@ myhtml_token_node_t * myhtml_insertion_fix_split_for_text_begin_ws(myhtml_tree_t if(new_token == NULL) return NULL; - myhtml_string_init(tree->mchar, tree->mchar_node_id, &new_token->str, (len + 2)); + mycore_string_init(tree->mchar, tree->mchar_node_id, &new_token->str, (len + 2)); - myhtml_string_append(&new_token->str, token->str.data, len); + mycore_string_append(&new_token->str, token->str.data, len); new_token->type |= MyHTML_TOKEN_TYPE_DONE; @@ -55,9 +55,9 @@ myhtml_token_node_t * myhtml_insertion_fix_split_for_text_begin_ws(myhtml_tree_t void myhtml_insertion_fix_for_null_char_drop_all(myhtml_tree_t* tree, myhtml_token_node_t* token) { - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); - myhtml_string_t *str = &token->str; + mycore_string_t *str = &token->str; size_t len = str->length; size_t offset = 0; @@ -93,7 +93,7 @@ bool myhtml_insertion_mode_initial(myhtml_tree_t* tree, myhtml_token_node_t* tok return false; } - myhtml_insertion_fix_emit_for_text_begin_ws(token); + myhtml_insertion_fix_emit_for_text_begin_ws(tree->token, token); // default, other token tree->compat_mode = MyHTML_TREE_COMPAT_MODE_QUIRKS; @@ -109,7 +109,7 @@ bool myhtml_insertion_mode_initial(myhtml_tree_t* tree, myhtml_token_node_t* tok case MyHTML_TAG__DOCTYPE: { - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); myhtml_token_release_and_check_doctype_attributes(tree->token, token, &tree->doctype); @@ -183,7 +183,7 @@ bool myhtml_insertion_mode_before_html(myhtml_tree_t* tree, myhtml_token_node_t* break; } - myhtml_insertion_fix_emit_for_text_begin_ws(token); + myhtml_insertion_fix_emit_for_text_begin_ws(tree->token, token); // default, other token myhtml_tree_node_insert_root(tree, NULL, MyHTML_NAMESPACE_HTML); @@ -246,7 +246,7 @@ bool myhtml_insertion_mode_before_head(myhtml_tree_t* tree, myhtml_token_node_t* break; } - myhtml_insertion_fix_emit_for_text_begin_ws(token); + myhtml_insertion_fix_emit_for_text_begin_ws(tree->token, token); // default, other token tree->node_head = myhtml_tree_node_insert(tree, MyHTML_TAG_HEAD, MyHTML_NAMESPACE_HTML); @@ -1207,8 +1207,8 @@ bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* tok myhtml_tree_node_t* top_node = tree->open_elements->list[0]; if(top_node->token) { - myhtml_token_node_wait_for_done(token); - myhtml_token_node_wait_for_done(top_node->token); + myhtml_token_node_wait_for_done(tree->token, token); + myhtml_token_node_wait_for_done(tree->token, top_node->token); myhtml_token_node_attr_copy_with_check(tree->token, token, top_node->token, tree->mcasync_rules_attr_id); } else { @@ -1259,8 +1259,8 @@ bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* tok myhtml_tree_node_t* top_node = tree->open_elements->list[1]; if(top_node->token) { - myhtml_token_node_wait_for_done(token); - myhtml_token_node_wait_for_done(top_node->token); + myhtml_token_node_wait_for_done(tree->token, token); + myhtml_token_node_wait_for_done(tree->token, top_node->token); myhtml_token_node_attr_copy_with_check(tree->token, token, top_node->token, tree->mcasync_rules_attr_id); } else { @@ -1701,7 +1701,7 @@ bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* tok myhtml_tree_node_insert_html_element(tree, token); myhtml_tree_open_elements_pop(tree); - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); if(myhtml_token_attr_match_case(tree->token, token, "type", 4, "hidden", 6) == NULL) { tree->flags ^= (tree->flags & MyHTML_TREE_FLAGS_FRAMESET_OK); } @@ -1902,7 +1902,7 @@ bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* tok { myhtml_tree_active_formatting_reconstruction(tree); - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); myhtml_token_adjust_mathml_attributes(token); myhtml_token_adjust_foreign_attributes(token); @@ -1920,7 +1920,7 @@ bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* tok { myhtml_tree_active_formatting_reconstruction(tree); - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); myhtml_token_adjust_svg_attributes(token); myhtml_token_adjust_foreign_attributes(token); @@ -2182,7 +2182,8 @@ bool myhtml_insertion_mode_in_table(myhtml_tree_t* tree, myhtml_token_node_t* to case MyHTML_TAG_INPUT: { - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); + if(myhtml_token_attr_match_case(tree->token, token, "type", 4, "hidden", 6) == NULL) { tree->foster_parenting = true; myhtml_insertion_mode_in_body(tree, token); @@ -3301,7 +3302,7 @@ bool myhtml_insertion_mode_after_body(myhtml_tree_t* tree, myhtml_token_node_t* case MyHTML_TAG__COMMENT: { if(tree->open_elements->length == 0) { - MyHTML_DEBUG_ERROR("after body state; open_elements length < 1"); + MyCORE_DEBUG_ERROR("after body state; open_elements length < 1"); break; } @@ -3396,8 +3397,8 @@ bool myhtml_insertion_mode_in_frameset(myhtml_tree_t* tree, myhtml_token_node_t* // parse error /* %EXTERNAL% VALIDATOR:RULES TOKEN STATUS:ELEMENT_UNNECESSARY ACTION:IGNORE LEVEL:ERROR */ - myhtml_token_node_wait_for_done(token); - myhtml_string_stay_only_whitespace(&token->str); + myhtml_token_node_wait_for_done(tree->token, token); + mycore_string_stay_only_whitespace(&token->str); if(token->str.length) myhtml_tree_node_insert_text(tree, token); @@ -3488,8 +3489,8 @@ bool myhtml_insertion_mode_after_frameset(myhtml_tree_t* tree, myhtml_token_node // parse error /* %EXTERNAL% VALIDATOR:RULES TOKEN STATUS:ELEMENT_UNNECESSARY ACTION:IGNORE LEVEL:ERROR */ - myhtml_token_node_wait_for_done(token); - myhtml_string_stay_only_whitespace(&token->str); + myhtml_token_node_wait_for_done(tree->token, token); + mycore_string_stay_only_whitespace(&token->str); if(token->str.length) myhtml_tree_node_insert_text(tree, token); @@ -3684,7 +3685,7 @@ bool myhtml_insertion_mode_in_foreign_content_start_other(myhtml_tree_t* tree, m { myhtml_tree_node_t* adjusted_node = myhtml_tree_adjusted_current_node(tree); - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); if(adjusted_node->ns == MyHTML_NAMESPACE_MATHML) { myhtml_token_adjust_mathml_attributes(token); @@ -3738,7 +3739,7 @@ bool myhtml_insertion_mode_in_foreign_content(myhtml_tree_t* tree, myhtml_token_ // parse error /* %EXTERNAL% VALIDATOR:RULES TOKEN STATUS:NULL_CHAR LEVEL:ERROR */ - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); myhtml_token_set_replacement_character_for_null_token(tree, token); } @@ -3812,12 +3813,14 @@ bool myhtml_insertion_mode_in_foreign_content(myhtml_tree_t* tree, myhtml_token_ if(token->tag_id == MyHTML_TAG_FONT) { - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); if(myhtml_token_attr_by_name(token, "color", 5) == NULL && myhtml_token_attr_by_name(token, "face" , 4) == NULL && myhtml_token_attr_by_name(token, "size" , 4) == NULL) + { return myhtml_insertion_mode_in_foreign_content_start_other(tree, token); + } } if(tree->fragment == NULL) { @@ -3854,7 +3857,7 @@ bool myhtml_rules_check_for_first_newline(myhtml_tree_t* tree, myhtml_token_node if(tree->flags &MyHTML_TREE_FLAGS_PARSE_FLAG_EMIT_NEWLINE) { if(token->tag_id == MyHTML_TAG__TEXT) { - myhtml_token_node_wait_for_done(token); + myhtml_token_node_wait_for_done(tree->token, token); if(token->str.length > 0) { if(token->str.data[0] == '\n') { @@ -3924,9 +3927,9 @@ bool myhtml_rules_tree_dispatcher(myhtml_tree_t* tree, myhtml_token_node_t* toke return reprocess; } -myhtml_status_t myhtml_rules_init(myhtml_t* myhtml) +mystatus_t myhtml_rules_init(myhtml_t* myhtml) { - myhtml->insertion_func = (myhtml_insertion_f*)myhtml_malloc(sizeof(myhtml_insertion_f) * MyHTML_INSERTION_MODE_LAST_ENTRY); + myhtml->insertion_func = (myhtml_insertion_f*)mycore_malloc(sizeof(myhtml_insertion_f) * MyHTML_INSERTION_MODE_LAST_ENTRY); if(myhtml->insertion_func == NULL) return MyHTML_STATUS_RULES_ERROR_MEMORY_ALLOCATION; diff --git a/source/myhtml/rules.h b/source/myhtml/rules.h index 1724e22..7610115 100644 --- a/source/myhtml/rules.h +++ b/source/myhtml/rules.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -30,8 +30,7 @@ extern "C" { #include "myhtml/myhtml.h" #include "myhtml/tree.h" - -myhtml_status_t myhtml_rules_init(myhtml_t* myhtml); +mystatus_t myhtml_rules_init(myhtml_t* myhtml); void myhtml_rules_stop_parsing(myhtml_tree_t* tree); bool myhtml_rules_tree_dispatcher(myhtml_tree_t* tree, myhtml_token_node_t* token); @@ -39,7 +38,6 @@ bool myhtml_insertion_mode_in_body_other_end_tag(myhtml_tree_t* tree, myhtml_tok bool myhtml_insertion_mode_in_body(myhtml_tree_t* tree, myhtml_token_node_t* token); bool myhtml_insertion_mode_in_template(myhtml_tree_t* tree, myhtml_token_node_t* token); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/source/myhtml/serialization.c b/source/myhtml/serialization.c index 75003f3..c142c91 100755 --- a/source/myhtml/serialization.c +++ b/source/myhtml/serialization.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,22 +19,21 @@ Author: https://github.com/EmielBruijntjes (Emiel Bruijntjes) */ -#include #include "myhtml/serialization.h" /** * Forward declaration of all the functions that are used inside this module */ -static void myhtml_serialization_append(const char* str, size_t size, myhtml_callback_serialize_f callback, void *ptr); -static void myhtml_serialization_append_attr(const char* str, size_t length, myhtml_callback_serialize_f callback, void *ptr); -static void myhtml_serialization_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, myhtml_callback_serialize_f callback, void *ptr); -static void myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void *ptr); -static void myhtml_serialization_node_append_close(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void *ptr); +static mystatus_t myhtml_serialization_append(const char* str, size_t size, mycore_callback_serialize_f callback, void *ptr); +static mystatus_t myhtml_serialization_append_attr(const char* str, size_t length, mycore_callback_serialize_f callback, void *ptr); +static mystatus_t myhtml_serialization_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, mycore_callback_serialize_f callback, void *ptr); +static mystatus_t myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void *ptr); +static mystatus_t myhtml_serialization_node_append_close(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void *ptr); /** * See the function myhtml_serialization_tree_buffer */ -bool myhtml_serialization(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str) +mystatus_t myhtml_serialization(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str) { return myhtml_serialization_tree_buffer(scope_node, str); } @@ -42,7 +41,7 @@ bool myhtml_serialization(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* s /** * See the function myhtml_serialization_node_buffer */ -bool myhtml_serialization_node(myhtml_tree_node_t* node, myhtml_string_raw_t* str) +mystatus_t myhtml_serialization_node(myhtml_tree_node_t* node, mycore_string_raw_t* str) { return myhtml_serialization_node_buffer(node, str); } @@ -55,32 +54,41 @@ bool myhtml_serialization_node(myhtml_tree_node_t* node, myhtml_string_raw_t* st * @param ptr user-supplied pointer * @return bool */ -bool myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, myhtml_callback_serialize_f callback, void *ptr) +mystatus_t myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, mycore_callback_serialize_f callback, void *ptr) { myhtml_tree_node_t* node = scope_node; while(node) { - if(!myhtml_serialization_node_callback(node, callback, ptr)) return false; + if(myhtml_serialization_node_callback(node, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; if(node->child) node = node->child; else { while(node != scope_node && node->next == NULL) { - myhtml_serialization_node_append_close(node, callback, ptr); + if(myhtml_serialization_node_append_close(node, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + node = node->parent; } if(node == scope_node) { - if(node != node->tree->document) myhtml_serialization_node_append_close(node, callback, ptr); + if(node != node->tree->document) { + if(myhtml_serialization_node_append_close(node, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + break; } - myhtml_serialization_node_append_close(node, callback, ptr); + if(myhtml_serialization_node_append_close(node, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + node = node->next; } } - return true; + return MyCORE_STATUS_OK; } /** @@ -91,46 +99,73 @@ bool myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, myhtml_c * @param ptr user-supplied pointer * @return bool */ -bool myhtml_serialization_node_callback(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void *ptr) +mystatus_t myhtml_serialization_node_callback(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void *ptr) { switch (node->tag_id) { case MyHTML_TAG__TEXT: { - myhtml_serialization_node_append_text_node(node, callback, ptr); + if(myhtml_serialization_node_append_text_node(node, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + break; } case MyHTML_TAG__COMMENT: { - callback("", 3, ptr); + if(callback("", 3, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + break; } case MyHTML_TAG__DOCTYPE: { - callback("token) { myhtml_tree_attr_t* attr = node->token->attr_first; if(attr->key.data && attr->key.length) { - callback(" ", 1, ptr); - callback(attr->key.data, attr->key.length, ptr); + if(callback(" ", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if(callback(attr->key.data, attr->key.length, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; } } - callback(">", 1, ptr); + + if(callback(">", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + break; } default: { size_t length; const char *tag = myhtml_tag_name_by_id(node->tree, node->tag_id, &length); - callback("<", 1, ptr); - callback(tag, length, ptr); - if(node->token) myhtml_serialization_attributes(node->tree, node->token->attr_first, callback, ptr); - callback(">", 1, ptr); + if(callback("<", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if(callback(tag, length, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + if(node->token) { + if(myhtml_serialization_attributes(node->tree, node->token->attr_first, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback(">", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + break; } } - return true; + return MyCORE_STATUS_OK; } /** @@ -140,28 +175,33 @@ bool myhtml_serialization_node_callback(myhtml_tree_node_t* node, myhtml_callbac * @param callback * @param ptr */ -void myhtml_serialization_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, myhtml_callback_serialize_f callback, void* ptr) +mystatus_t myhtml_serialization_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* attr, mycore_callback_serialize_f callback, void* ptr) { while(attr) { - callback(" ", 1, ptr); + if(callback(" ", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; switch (attr->ns) { case MyHTML_NAMESPACE_XML: - callback("xml:", 4, ptr); + if(callback("xml:", 4, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + break; case MyHTML_NAMESPACE_XMLNS: { /* If the attribute is in the XMLNS namespace and the attribute's local name is not xmlns The attribute's serialized name is the string "xmlns:" followed by the attribute's local name. */ - if(attr->key.data && attr->key.length == 5 && myhtml_strcmp(attr->key.data, "xmlns")) { - callback("xmlns:", 6, ptr); + if(attr->key.data && attr->key.length == 5 && mycore_strcmp(attr->key.data, "xmlns")) { + if(callback("xmlns:", 6, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; } break; } case MyHTML_NAMESPACE_XLINK: { - callback("xlink:", 6, ptr); + if(callback("xlink:", 6, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; break; } @@ -172,14 +212,25 @@ void myhtml_serialization_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* at size_t length; const char *data = myhtml_attribute_key(attr, &length); - if(data) callback(data, length, ptr); - callback("=\"", 2, ptr); + if(data) { + if(callback(data, length, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + if(callback("=\"", 2, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; data = myhtml_attribute_value(attr, &length); - if(data) myhtml_serialization_append_attr(data, length, callback, ptr); - callback("\"", 1, ptr); + if(data) { + if(myhtml_serialization_append_attr(data, length, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + if(callback("\"", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + attr = attr->next; } + + return MyCORE_STATUS_OK; } /** @@ -189,7 +240,7 @@ void myhtml_serialization_attributes(myhtml_tree_t* tree, myhtml_tree_attr_t* at * @param callback * @param ptr */ -void myhtml_serialization_node_append_close(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void* ptr) +mystatus_t myhtml_serialization_node_append_close(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void* ptr) { if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && @@ -198,10 +249,17 @@ void myhtml_serialization_node_append_close(myhtml_tree_node_t* node, myhtml_cal size_t length; const char *tag = myhtml_tag_name_by_id(node->tree, node->tag_id, &length); - callback("", 1, ptr); + if(callback("", 1, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; } + + return MyCORE_STATUS_OK; } /** @@ -211,11 +269,16 @@ void myhtml_serialization_node_append_close(myhtml_tree_node_t* node, myhtml_cal * @param callback * @param ptr */ -void myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void* ptr) +mystatus_t myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void* ptr) { - if(node->token == NULL || node->token->str.data == NULL) return; + if(node->token == NULL || node->token->str.data == NULL) return MyCORE_STATUS_OK; - if(node->parent == NULL) return myhtml_serialization_append(node->token->str.data, node->token->str.length, callback, ptr); + if(node->parent == NULL) { + if(myhtml_serialization_append(node->token->str.data, node->token->str.length, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + return MyCORE_STATUS_OK; + } switch (node->parent->tag_id) { case MyHTML_TAG_STYLE: @@ -225,12 +288,17 @@ void myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, myhtml case MyHTML_TAG_NOEMBED: case MyHTML_TAG_NOFRAMES: case MyHTML_TAG_PLAINTEXT: - callback(node->token->str.data, node->token->str.length, ptr); + if(callback(node->token->str.data, node->token->str.length, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; break; default: - myhtml_serialization_append(node->token->str.data, node->token->str.length, callback, ptr); + if(myhtml_serialization_append(node->token->str.data, node->token->str.length, callback, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + break; } + + return MyCORE_STATUS_OK; } /** @@ -240,7 +308,7 @@ void myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, myhtml * @param callback * @param ptr */ -void myhtml_serialization_append(const char *data, size_t size, myhtml_callback_serialize_f callback, void* ptr) +mystatus_t myhtml_serialization_append(const char *data, size_t size, mycore_callback_serialize_f callback, void* ptr) { // number of chars not yet displayed size_t notwritten = 0; @@ -249,24 +317,48 @@ void myhtml_serialization_append(const char *data, size_t size, myhtml_callback_ for (size_t i = 0; i < size; ++i) { switch ((unsigned char)data[i]) { case '&': - if (notwritten) callback(data + i - notwritten, notwritten, ptr); - callback("&", 5, ptr); + if(notwritten) { + if(callback(data + i - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback("&", 5, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; break; case '<': - if (notwritten) callback(data + i - notwritten, notwritten, ptr); - callback("<", 4, ptr); + if(notwritten) { + if(callback(data + i - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback("<", 4, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; break; case '>': - if (notwritten) callback(data + i - notwritten, notwritten, ptr); - callback(">", 4, ptr); + if(notwritten) { + if(callback(data + i - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback(">", 4, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; break; case 0xA0: if(i > 0 && (unsigned char)(data[(i - 1)]) == 0xC2) { - if (notwritten) callback(data + i - notwritten, (notwritten - 1), ptr); - callback(" ", 6, ptr); + if(notwritten) { + if(callback(data + i - notwritten, (notwritten - 1), ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback(" ", 6, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; } else { @@ -280,7 +372,11 @@ void myhtml_serialization_append(const char *data, size_t size, myhtml_callback_ } } - if (notwritten) callback(data + size - notwritten, notwritten, ptr); + if(notwritten) + if(callback(data + size - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + + return MyCORE_STATUS_OK; } /** @@ -290,7 +386,7 @@ void myhtml_serialization_append(const char *data, size_t size, myhtml_callback_ * @param callback * @param ptr */ -void myhtml_serialization_append_attr(const char* data, size_t size, myhtml_callback_serialize_f callback, void* ptr) +mystatus_t myhtml_serialization_append_attr(const char* data, size_t size, mycore_callback_serialize_f callback, void* ptr) { // number of chars not yet displayed size_t notwritten = 0; @@ -299,19 +395,37 @@ void myhtml_serialization_append_attr(const char* data, size_t size, myhtml_call for (size_t i = 0; i < size; ++i) { switch ((unsigned char)data[i]) { case '&': - if (notwritten) callback(data + i - notwritten, notwritten, ptr); - callback("&", 5, ptr); + if(notwritten) { + if(callback(data + i - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback("&", 5, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; break; case '"': - if (notwritten) callback(data + i - notwritten, notwritten, ptr); - callback(""", 6, ptr); + if(notwritten) { + if(callback(data + i - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback(""", 6, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; break; case 0xA0: if(i > 0 && (unsigned char)(data[(i - 1)]) == 0xC2) { - if (notwritten) callback(data + i - notwritten, (notwritten - 1), ptr); - callback(" ", 6, ptr); + if(notwritten) { + if(callback(data + i - notwritten, (notwritten - 1), ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + if(callback(" ", 6, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + notwritten = 0; } else { @@ -325,57 +439,53 @@ void myhtml_serialization_append_attr(const char* data, size_t size, myhtml_call } } - if (notwritten) callback(data + size - notwritten, notwritten, ptr); + if(notwritten) { + if(callback(data + size - notwritten, notwritten, ptr)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } + + return MyCORE_STATUS_OK; } -/** - * Because we want to leap out of the algorithm if we're halfway through - * serializing, we use a longjmp() call to jump back to the public APP - * @var jmp_buf - */ -static jmp_buf leap; - /** * Reallocate the buffer * @param str the buffer to reallocate * @param size new size */ -void myhtml_serialization_reallocate(myhtml_string_raw_t *str, size_t size) +mystatus_t myhtml_serialization_reallocate(mycore_string_raw_t *str, size_t size) { // construct a buffer - char *data = (char*)myhtml_realloc(str->data, size * sizeof(char)); + char *data = (char*)mycore_realloc(str->data, size * sizeof(char)); // was it ok? - if (data == NULL) { - - // allocation failed, reset the string object - myhtml_free(str->data); - memset(str, 0, sizeof(myhtml_string_raw_t)); - - // leap back to the source of the serialization algorithm - longjmp(leap, 1); + if(data == NULL) { + memset(str, 0, sizeof(mycore_string_raw_t)); + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; } else { - // reallocation succeeded str->data = data; str->size = size; } + + return MyCORE_STATUS_OK; } /** - * Implementation of the myhtml_callback_serialize_f function for internal + * Implementation of the mycore_callback_serialize_f function for internal * use that concatenats everything to a string * @param data * @param size */ -void myhtml_serialization_concatenate(const char* data, size_t length, void *ptr) +mystatus_t myhtml_serialization_concatenate(const char* data, size_t length, void *ptr) { - // get the string back - myhtml_string_raw_t* str = (myhtml_string_raw_t *)ptr; + mycore_string_raw_t *str = (mycore_string_raw_t*)ptr; // do we still have enough size in the output buffer? - if ((length + str->length) >= str->size) myhtml_serialization_reallocate(str, length + str->length + 4096); + if ((length + str->length) >= str->size) { + if(myhtml_serialization_reallocate(str, length + str->length + 4096)) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; + } // copy data strncpy(&str->data[ str->length ], data, length); @@ -383,6 +493,8 @@ void myhtml_serialization_concatenate(const char* data, size_t length, void *ptr // update counters str->length += length; str->data[ str->length ] = '\0'; + + return MyCORE_STATUS_OK; } /** @@ -392,7 +504,7 @@ void myhtml_serialization_concatenate(const char* data, size_t length, void *ptr * @param str * @return bool */ -bool myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str) { +mystatus_t myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str) { // we need an output variable if(str == NULL) return false; @@ -401,25 +513,15 @@ bool myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_str if(str->data == NULL) { str->size = 4098 * 5; str->length = 0; - str->data = (char*)myhtml_malloc(str->size * sizeof(char)); + str->data = (char*)mycore_malloc(str->size * sizeof(char)); if(str->data == NULL) { str->size = 0; - return false; + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; } } - // if allocation halfway the algorithm fails, we want to leap back - if (setjmp(leap) == 0) - { - // serialize the entire tree - return myhtml_serialization_tree_callback(scope_node, myhtml_serialization_concatenate, str); - } - else - { - // the serialization algorithm failed because of a memory-allocation failure - return false; - } + return myhtml_serialization_tree_callback(scope_node, myhtml_serialization_concatenate, str); } /** @@ -429,7 +531,7 @@ bool myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_str * @param str * @return bool */ -bool myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* str) { +mystatus_t myhtml_serialization_node_buffer(myhtml_tree_node_t* node, mycore_string_raw_t* str) { // we need an output variable if(str == NULL) return false; @@ -438,24 +540,14 @@ bool myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_ra if(str->data == NULL) { str->size = 2048; str->length = 0; - str->data = (char*)myhtml_malloc(str->size * sizeof(char)); + str->data = (char*)mycore_malloc(str->size * sizeof(char)); if(str->data == NULL) { str->size = 0; return false; } } - - // if allocation halfway the algorithm fails, we want to leap back - if (setjmp(leap) == 0) - { - // pass on - return myhtml_serialization_node_callback(node, myhtml_serialization_concatenate, str); - } - else - { - // the serialization algorithm failed because of a memory-allocation failure - return false; - } + + return myhtml_serialization_node_callback(node, myhtml_serialization_concatenate, str); } diff --git a/source/myhtml/serialization.h b/source/myhtml/serialization.h index e651769..d21fd70 100644 --- a/source/myhtml/serialization.h +++ b/source/myhtml/serialization.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2016 Alexander Borisov + Copyright (C) 2016-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,15 +31,15 @@ extern "C" { #endif // the serialization functions -bool myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); -bool myhtml_serialization_node_buffer(myhtml_tree_node_t* node, myhtml_string_raw_t* str); -bool myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, myhtml_callback_serialize_f callback, void* ptr); -bool myhtml_serialization_node_callback(myhtml_tree_node_t* node, myhtml_callback_serialize_f callback, void* ptr); +mystatus_t myhtml_serialization_tree_buffer(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); +mystatus_t myhtml_serialization_node_buffer(myhtml_tree_node_t* node, mycore_string_raw_t* str); +mystatus_t myhtml_serialization_tree_callback(myhtml_tree_node_t* scope_node, mycore_callback_serialize_f callback, void* ptr); +mystatus_t myhtml_serialization_node_callback(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void* ptr); // in versuon 1.0.3 this is in public api. // Need to set deprecated? -bool myhtml_serialization(myhtml_tree_node_t* scope_node, myhtml_string_raw_t* str); -bool myhtml_serialization_node(myhtml_tree_node_t* node, myhtml_string_raw_t* str); +mystatus_t myhtml_serialization(myhtml_tree_node_t* scope_node, mycore_string_raw_t* str); +mystatus_t myhtml_serialization_node(myhtml_tree_node_t* node, mycore_string_raw_t* str); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/myhtml/stream.c b/source/myhtml/stream.c index b0779df..0090301 100644 --- a/source/myhtml/stream.c +++ b/source/myhtml/stream.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,14 +22,14 @@ myhtml_stream_buffer_t * myhtml_stream_buffer_create(void) { - return myhtml_calloc(1, sizeof(myhtml_stream_buffer_t)); + return mycore_calloc(1, sizeof(myhtml_stream_buffer_t)); } -myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size) +mystatus_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size) { stream_buffer->length = 0; stream_buffer->size = entries_size; - stream_buffer->entries = myhtml_calloc(entries_size, sizeof(myhtml_stream_buffer_entry_t)); + stream_buffer->entries = mycore_calloc(entries_size, sizeof(myhtml_stream_buffer_entry_t)); if(stream_buffer->entries == NULL) return MyHTML_STATUS_STREAM_BUFFER_ERROR_INIT; @@ -37,18 +37,18 @@ myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, return MyHTML_STATUS_OK; } -myhtml_status_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size) +mystatus_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size) { if(stream_buffer_entry->data) { if(size <= stream_buffer_entry->size) return MyHTML_STATUS_OK; else - myhtml_free(stream_buffer_entry->data); + mycore_free(stream_buffer_entry->data); } stream_buffer_entry->length = 0; stream_buffer_entry->size = size; - stream_buffer_entry->data = myhtml_malloc(size * sizeof(char)); + stream_buffer_entry->data = mycore_malloc(size * sizeof(char)); if(stream_buffer_entry->data == NULL) return MyHTML_STATUS_STREAM_BUFFER_ENTRY_ERROR_INIT; @@ -68,10 +68,10 @@ myhtml_stream_buffer_entry_t * myhtml_stream_buffer_entry_destroy(myhtml_stream_ return NULL; if(stream_buffer_entry->data) - myhtml_free(stream_buffer_entry->data); + mycore_free(stream_buffer_entry->data); if(self_destroy) { - myhtml_free(stream_buffer_entry); + mycore_free(stream_buffer_entry); return NULL; } @@ -93,11 +93,11 @@ myhtml_stream_buffer_t * myhtml_stream_buffer_destroy(myhtml_stream_buffer_t* st for(size_t i = 0; i < stream_buffer->length; i++) myhtml_stream_buffer_entry_destroy(&stream_buffer->entries[i], false); - myhtml_free(stream_buffer->entries); + mycore_free(stream_buffer->entries); } if(self_destroy) { - myhtml_free(stream_buffer); + mycore_free(stream_buffer); return NULL; } @@ -109,7 +109,7 @@ myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buff if(stream_buffer->length >= stream_buffer->size) { size_t new_size = stream_buffer->size << 1; - myhtml_stream_buffer_entry_t *entries = myhtml_realloc(stream_buffer, sizeof(myhtml_stream_buffer_entry_t) * new_size); + myhtml_stream_buffer_entry_t *entries = mycore_realloc(stream_buffer, sizeof(myhtml_stream_buffer_entry_t) * new_size); if(entries) { memset(&entries[stream_buffer->size], 0, (new_size - stream_buffer->size)); @@ -122,7 +122,7 @@ myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buff } myhtml_stream_buffer_entry_t *entry = &stream_buffer->entries[ stream_buffer->length ]; - myhtml_status_t status = myhtml_stream_buffer_entry_init(entry, entry_data_size); + mystatus_t status = myhtml_stream_buffer_entry_init(entry, entry_data_size); if(status != MyHTML_STATUS_OK) return NULL; diff --git a/source/myhtml/stream.h b/source/myhtml/stream.h index e015438..94c4fc2 100644 --- a/source/myhtml/stream.h +++ b/source/myhtml/stream.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -41,17 +41,17 @@ struct myhtml_stream_buffer { size_t length; size_t size; - myhtml_encoding_result_t res; + myencoding_result_t res; }; myhtml_stream_buffer_t * myhtml_stream_buffer_create(void); -myhtml_status_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size); +mystatus_t myhtml_stream_buffer_init(myhtml_stream_buffer_t* stream_buffer, size_t entries_size); void myhtml_stream_buffer_clean(myhtml_stream_buffer_t* stream_buffer); myhtml_stream_buffer_t * myhtml_stream_buffer_destroy(myhtml_stream_buffer_t* stream_buffer, bool self_destroy); myhtml_stream_buffer_entry_t * myhtml_stream_buffer_add_entry(myhtml_stream_buffer_t* stream_buffer, size_t entry_data_size); myhtml_stream_buffer_entry_t * myhtml_stream_buffer_current_entry(myhtml_stream_buffer_t* stream_buffer); -myhtml_status_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size); +mystatus_t myhtml_stream_buffer_entry_init(myhtml_stream_buffer_entry_t* stream_buffer_entry, size_t size); void myhtml_stream_buffer_entry_clean(myhtml_stream_buffer_entry_t* stream_buffer_entry); myhtml_stream_buffer_entry_t * myhtml_stream_buffer_entry_destroy(myhtml_stream_buffer_entry_t* stream_buffer_entry, bool self_destroy); diff --git a/source/myhtml/tag.c b/source/myhtml/tag.c index 65a8f56..4664bb1 100755 --- a/source/myhtml/tag.c +++ b/source/myhtml/tag.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -23,11 +23,13 @@ myhtml_tag_t * myhtml_tag_create(void) { - return (myhtml_tag_t*)myhtml_malloc(sizeof(myhtml_tag_t)); + return (myhtml_tag_t*)mycore_malloc(sizeof(myhtml_tag_t)); } -myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags) +mystatus_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags) { + mystatus_t status; + tags->mcsimple_context = mcsimple_create(); if(tags->mcsimple_context == NULL) @@ -35,10 +37,16 @@ myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags) mcsimple_init(tags->mcsimple_context, 128, 1024, sizeof(myhtml_tag_context_t)); - tags->mchar_node = mchar_async_node_add(tree->mchar); - tags->tree = mctree_create(2); - tags->mchar = tree->mchar; - tags->tags_count = MyHTML_TAG_LAST_ENTRY; + tags->mchar_node = mchar_async_node_add(tree->mchar, &status); + tags->tree = mctree_create(2); + tags->mchar = tree->mchar; + tags->tags_count = MyHTML_TAG_LAST_ENTRY; + + if(status) + return status; + + if(tags->tree == NULL) + return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION; myhtml_tag_clean(tags); @@ -64,7 +72,7 @@ myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags) mchar_async_node_delete(tags->mchar, tags->mchar_node); - myhtml_free(tags); + mycore_free(tags); return NULL; } @@ -134,24 +142,3 @@ const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const ch return (myhtml_tag_context_t*)tags->tree->nodes[idx].value; } - -void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh) -{ - size_t i; - for(i = MyHTML_TAG_FIRST_ENTRY; i < MyHTML_TAG_LAST_ENTRY; i++) - { - const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tags, i); - - fprintf(fh, "<%s id=\"%zu\">\n", ctx->name, i); - } - - for(i = (MyHTML_TAG_LAST_ENTRY + 1); i < tags->tags_count; i++) - { - const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tags, i); - - fprintf(fh, "<%s id=\"%zu\">\n", ctx->name, i); - } -} - - - diff --git a/source/myhtml/tag.h b/source/myhtml/tag.h index 3814ef9..945b65a 100644 --- a/source/myhtml/tag.h +++ b/source/myhtml/tag.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,12 +31,12 @@ extern "C" { #include "myhtml/tag_const.h" #include "myhtml/tokenizer.h" #include "myhtml/tree.h" -#include "myhtml/utils.h" -#include "myhtml/utils/mctree.h" -#include "myhtml/utils/mchar_async.h" -#include "myhtml/utils/mcobject.h" -#include "myhtml/utils/mcobject_async.h" -#include "myhtml/utils/mcsimple.h" +#include "mycore/utils.h" +#include "mycore/utils/mctree.h" +#include "mycore/utils/mchar_async.h" +#include "mycore/utils/mcobject.h" +#include "mycore/utils/mcobject_async.h" +#include "mycore/utils/mcsimple.h" #define myhtml_tag_get(tags, idx, attr) tags->context[idx].attr @@ -52,7 +52,7 @@ extern "C" { tags->context_length++; \ if(tags->context_length == tags->context_size) { \ tags->context_size += 4096; \ - tags->context = (myhtml_tag_context_t*)myhtml_realloc(tags->context, \ + tags->context = (myhtml_tag_context_t*)mycore_realloc(tags->context, \ sizeof(myhtml_tag_context_t) * tags->context_size); \ } \ myhtml_tag_context_clean(tags, tags->context_length) @@ -89,7 +89,7 @@ struct myhtml_tag { }; myhtml_tag_t * myhtml_tag_create(void); -myhtml_status_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags); +mystatus_t myhtml_tag_init(myhtml_tree_t *tree, myhtml_tag_t *tags); void myhtml_tag_clean(myhtml_tag_t* tags); myhtml_tag_t * myhtml_tag_destroy(myhtml_tag_t* tags); @@ -105,8 +105,6 @@ const myhtml_tag_context_t * myhtml_tag_get_by_name(myhtml_tag_t* tags, const ch const myhtml_tag_context_t * myhtml_tag_static_get_by_id(size_t idx); const myhtml_tag_context_t * myhtml_tag_static_search(const char* name, size_t length); -void myhtml_tag_print(myhtml_tag_t* tags, FILE* fh); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/source/myhtml/tag_const.h b/source/myhtml/tag_const.h index 0f5b389..1b29934 100644 --- a/source/myhtml/tag_const.h +++ b/source/myhtml/tag_const.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/tag_init.c b/source/myhtml/tag_init.c index c66c266..d96e62f 100755 --- a/source/myhtml/tag_init.c +++ b/source/myhtml/tag_init.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,8 +18,8 @@ Author: lex.borisov@gmail.com (Alexander Borisov) */ -#include "myhtml/utils/resources.h" -#include "tag.h" +#include "mycore/utils/resources.h" +#include "myhtml/tag.h" static const myhtml_tag_context_t myhtml_tag_base_list[MyHTML_TAG_LAST_ENTRY] = { @@ -2591,15 +2591,15 @@ static const myhtml_tag_static_list_t myhtml_tag_static_list_index[] = const myhtml_tag_context_t * myhtml_tag_static_search(const char* name, size_t length) { - size_t idx = ((myhtml_string_chars_lowercase_map[ (const unsigned char)name[0] ] * - myhtml_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * length) % MyHTML_BASE_STATIC_SIZE) + 1; while (myhtml_tag_static_list_index[idx].ctx) { if(myhtml_tag_static_list_index[idx].ctx->name_length == length) { - if(myhtml_strncasecmp(myhtml_tag_static_list_index[idx].ctx->name, name, length) == 0) + if(mycore_strncasecmp(myhtml_tag_static_list_index[idx].ctx->name, name, length) == 0) return myhtml_tag_static_list_index[idx].ctx; if(myhtml_tag_static_list_index[idx].next) diff --git a/source/myhtml/thread.c b/source/myhtml/thread.c deleted file mode 100644 index 94e277a..0000000 --- a/source/myhtml/thread.c +++ /dev/null @@ -1,1185 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/thread.h" - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -#if defined(IS_OS_WINDOWS) -/*********************************************************************************** - * - * For Windows - * - ***********************************************************************************/ -myhtml_status_t myhtml_thread_create(mythread_t *mythread, mythread_list_t *thr, void *work_func) -{ - thr->pth = CreateThread(NULL, // default security attributes - 0, // use default stack size - work_func, // thread function name - &thr->data, // argument to thread function - 0, // use default creation flags - NULL); // returns the thread identifier - - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_join(mythread_t *mythread, mythread_list_t *thr) -{ - WaitForSingleObject(thr->pth, INFINITE); - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_cancel(mythread_t *mythread, mythread_list_t *thr) -{ - TerminateThread(thr->pth, 0); - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_attr_init(mythread_t *mythread) -{ - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_attr_clean(mythread_t *mythread) -{ - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_attr_destroy(mythread_t *mythread) -{ - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_create(mythread_t *mythread, mythread_context_t *ctx, size_t prefix_id) -{ - ctx->mutex = CreateSemaphore(NULL, 0, 1, NULL); - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_post(mythread_t *mythread, mythread_context_t *ctx) -{ - ReleaseSemaphore(ctx->mutex, 1, NULL); - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_wait(mythread_t *mythread, mythread_context_t *ctx) -{ - WaitForSingleObject(ctx->mutex, INFINITE); - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_try_wait(mythread_t *mythread, mythread_context_t *ctx) -{ - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_close(mythread_t *mythread, mythread_context_t *ctx) -{ - CloseHandle(ctx->mutex); - - return MyHTML_STATUS_OK; -} - -void myhtml_thread_nanosleep(const struct timespec *tomeout) -{ - Sleep(0); -} - -#else /* defined(IS_OS_WINDOWS) */ -/*********************************************************************************** - * - * For all unix system. POSIX pthread - * - ***********************************************************************************/ - -myhtml_status_t myhtml_thread_create(mythread_t *mythread, mythread_list_t *thr, void *work_func) -{ - pthread_create(&thr->pth, mythread->attr, - work_func, - (void*)(&thr->data)); - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_join(mythread_t *mythread, mythread_list_t *thr) -{ - pthread_join(thr->pth, NULL); - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_cancel(mythread_t *mythread, mythread_list_t *thr) -{ - pthread_cancel(thr->pth); - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_attr_init(mythread_t *mythread) -{ - mythread->attr = (pthread_attr_t*)myhtml_calloc(1, sizeof(pthread_attr_t)); - - if(mythread->attr == NULL) - return MyHTML_STATUS_THREAD_ERROR_ATTR_MALLOC; - - mythread->sys_last_error = pthread_attr_init(mythread->attr); - if(mythread->sys_last_error) - return MyHTML_STATUS_THREAD_ERROR_ATTR_INIT; - - mythread->sys_last_error = pthread_attr_setdetachstate(mythread->attr, PTHREAD_CREATE_JOINABLE); - if(mythread->sys_last_error) - return MyHTML_STATUS_THREAD_ERROR_ATTR_SET; - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_attr_clean(mythread_t *mythread) -{ - mythread->attr = NULL; - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_thread_attr_destroy(mythread_t *mythread) -{ - if(mythread->attr) { - mythread->sys_last_error = pthread_attr_destroy(mythread->attr); - - myhtml_free(mythread->attr); - mythread->attr = NULL; - - if(mythread->sys_last_error) - return MyHTML_STATUS_THREAD_ERROR_ATTR_DESTROY; - } - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_create(mythread_t *mythread, mythread_context_t *ctx, size_t prefix_id) -{ - ctx->mutex = (pthread_mutex_t*)myhtml_calloc(1, sizeof(pthread_mutex_t)); - - if(ctx->mutex == NULL) - return MyHTML_STATUS_THREAD_ERROR_MUTEX_MALLOC; - - if(pthread_mutex_init(ctx->mutex, NULL)) { - mythread->sys_last_error = errno; - return MyHTML_STATUS_THREAD_ERROR_MUTEX_INIT; - } - - if(pthread_mutex_lock(ctx->mutex)) { - mythread->sys_last_error = errno; - return MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK; - } - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_post(mythread_t *mythread, mythread_context_t *ctx) -{ - if(pthread_mutex_unlock(ctx->mutex)) { - mythread->sys_last_error = errno; - return MyHTML_STATUS_THREAD_ERROR_MUTEX_UNLOCK; - } - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_wait(mythread_t *mythread, mythread_context_t *ctx) -{ - if(pthread_mutex_lock(ctx->mutex)) { - mythread->sys_last_error = errno; - return MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK; - } - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_try_wait(mythread_t *mythread, mythread_context_t *ctx) -{ - if(pthread_mutex_trylock(ctx->mutex)) { - mythread->sys_last_error = errno; - return MyHTML_STATUS_THREAD_ERROR_MUTEX_LOCK; - } - - return MyHTML_STATUS_OK; -} - -myhtml_status_t myhtml_hread_mutex_close(mythread_t *mythread, mythread_context_t *ctx) -{ - if(ctx->mutex) { - pthread_mutex_destroy(ctx->mutex); - myhtml_free(ctx->mutex); - - ctx->mutex = NULL; - } - - return MyHTML_STATUS_OK; -} - -void myhtml_thread_nanosleep(const struct timespec *tomeout) -{ - nanosleep(tomeout, NULL); -} - -#endif /* !defined(IS_OS_WINDOWS) */ -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -/* - * - * MyTHREAD logic - * - */ - -mythread_t * mythread_create(void) -{ - return myhtml_calloc(1, sizeof(mythread_t)); -} - -#ifdef MyHTML_BUILD_WITHOUT_THREADS - -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count) -{ - return MyHTML_STATUS_OK; -} - -#else /* MyHTML_BUILD_WITHOUT_THREADS */ - -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count) -{ - mythread->batch_count = 0; - mythread->batch_first_id = 0; - mythread->stream_opt = MyTHREAD_OPT_STOP; - mythread->batch_opt = MyTHREAD_OPT_STOP; - - if(thread_count) - { - myhtml_status_t status = myhtml_thread_attr_init(mythread); - if(status) - return status; - - mythread->pth_list_root = 1; - mythread->pth_list_length = 1; - mythread->pth_list_size = thread_count + 1; - mythread->pth_list = (mythread_list_t*)myhtml_calloc(mythread->pth_list_size, sizeof(mythread_list_t)); - - if(mythread->pth_list == NULL) - return MyHTML_STATUS_THREAD_ERROR_LIST_INIT; - } - else { - myhtml_thread_attr_clean(mythread); - - mythread->sys_last_error = 0; - mythread->pth_list_root = 1; - mythread->pth_list_length = 1; - mythread->pth_list_size = 0; - mythread->pth_list = NULL; - } - - if(sem_prefix) - { - mythread->sem_prefix_length = strlen(sem_prefix); - - if(mythread->sem_prefix_length) { - mythread->sem_prefix = myhtml_calloc((mythread->sem_prefix_length + 1), sizeof(char)); - - if(mythread->sem_prefix == NULL) { - mythread->sem_prefix_length = 0; - return MyHTML_STATUS_THREAD_ERROR_SEM_PREFIX_MALLOC; - } - - myhtml_string_raw_copy(mythread->sem_prefix, sem_prefix, mythread->sem_prefix_length); - } - } - - return MyHTML_STATUS_OK; -} - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -void mythread_clean(mythread_t *mythread) -{ - mythread->sys_last_error = 0; -} - -mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_join_f before_join, bool self_destroy) -{ - if(mythread == NULL) - return NULL; - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - - myhtml_thread_attr_destroy(mythread); - - if(mythread->pth_list) { - mythread_resume_all(mythread); - mythread_stream_quit_all(mythread); - mythread_batch_quit_all(mythread); - - if(before_join) - before_join(mythread); - - for (size_t i = mythread->pth_list_root; i < mythread->pth_list_length; i++) - { - myhtml_thread_join(mythread, &mythread->pth_list[i]); - } - - myhtml_free(mythread->pth_list); - mythread->pth_list = NULL; - } - - if(mythread->sem_prefix) { - myhtml_free(mythread->sem_prefix); - - mythread->sem_prefix = NULL; - mythread->sem_prefix_length = 0; - } - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - - if(self_destroy) { - myhtml_free(mythread); - return NULL; - } - - return mythread; -} - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_work_f work_func, void *process_func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t total_count) -{ - mythread->sys_last_error = 0; - - if(status) - *status = MyHTML_STATUS_OK; - - if(mythread->pth_list_length >= mythread->pth_list_size) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_NO_SLOTS; - - return 0; - } - - mythread_list_t *thr = &mythread->pth_list[mythread->pth_list_length]; - - thr->data.mythread = mythread; - thr->data.func = work_func; - thr->data.id = mythread->pth_list_length; - thr->data.t_count = total_count; - thr->data.opt = opt; - thr->data.status = 0; - - myhtml_status_t m_status = myhtml_hread_mutex_create(mythread, &thr->data, 0); - - if(m_status != MyHTML_STATUS_OK && status) { - *status = m_status; - return 0; - } - - m_status = myhtml_thread_create(mythread, thr, process_func); - if(m_status != MyHTML_STATUS_OK) - return 0; - - mythread->pth_list_length++; - return thr->data.id; -} - -mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_process_f process_func, mythread_work_f work_func, mythread_thread_opt_t opt, myhtml_status_t *status) -{ - return _myhread_create_stream_raw(mythread, work_func, process_func, opt, status, 0); -} - -mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_process_f process_func, mythread_work_f work_func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t count) -{ - if(mythread->batch_count) { - *status = MyHTML_STATUS_THREAD_ERROR_BATCH_INIT; - return 0; - } - else if((mythread->pth_list_length + count) > mythread->pth_list_size) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_NO_SLOTS; - - return 0; - } - - if(count == 0) - count = 1; - - mythread->batch_first_id = 0; - mythread->batch_count = count; - - size_t start = mythread->pth_list_length; - *status = MyHTML_STATUS_OK; - - bool init_first = false; - - for (size_t i = 0; i < count; i++) - { - mythread_id_t curr_id = _myhread_create_stream_raw(mythread, work_func, process_func, opt, status, i); - - if(init_first == false) { - mythread->batch_first_id = curr_id; - init_first = true; - } - - if(*status) - { - for (size_t n = start; n < (start + i); n++) - { - mythread_list_t *thr = &mythread->pth_list[n]; - - myhtml_thread_cancel(mythread, thr); - - myhtml_hread_mutex_post(mythread, &thr->data); - myhtml_hread_mutex_close(mythread, &thr->data); - } - - mythread->batch_first_id = 0; - mythread->batch_count = 0; - - break; - } - } - - return mythread->batch_first_id; -} - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -// mythread queue functions -#ifndef MyHTML_BUILD_WITHOUT_THREADS -mythread_queue_list_t * mythread_queue_list_create(myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - mythread_queue_list_t* queue_list = (mythread_queue_list_t*)myhtml_calloc(1, sizeof(mythread_queue_list_t)); - - if(queue_list == NULL) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; - return NULL; - } - - return queue_list; -} - -void mythread_queue_list_destroy(mythread_queue_list_t* queue_list) -{ - if(queue_list == NULL) - return; - - myhtml_free(queue_list); -} - -size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list) -{ - return queue_list->count; -} - -mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status) -{ - mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; - - if(status) - *status = MyHTML_STATUS_OK; - - mythread_queue_list_entry_t* entry = (mythread_queue_list_entry_t*)myhtml_calloc(1, sizeof(mythread_queue_list_entry_t)); - - if(entry == NULL) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; - return NULL; - } - - entry->thread_param = (mythread_queue_thread_param_t*)myhtml_calloc(mythread->pth_list_size, sizeof(mythread_queue_thread_param_t)); - - if(entry->thread_param == NULL) { - myhtml_free(entry); - - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; - return NULL; - } - - size_t idx; - for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { - entry->thread_param[idx].use = mythread->pth_list[idx].data.t_count; - } - - entry->queue = queue; - - if(mythread->stream_opt == MyTHREAD_OPT_UNDEF) { - mythread_suspend_all(mythread); - } - else if(mythread->stream_opt == MyTHREAD_OPT_STOP) { - mythread_stop_all(mythread); - } - - if(queue_list->first) { - queue_list->last->next = entry; - entry->prev = queue_list->last; - - queue_list->last = entry; - } - else { - queue_list->first = entry; - queue_list->last = entry; - } - - queue_list->count++; - - if(mythread->stream_opt != MyTHREAD_OPT_STOP) - mythread_resume_all(mythread); - - return entry; -} - -mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue) -{ - mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; - - mythread_queue_list_entry_t *next = entry->next; - mythread_queue_list_entry_t *prev = entry->prev; - - if(mythread->stream_opt == MyTHREAD_OPT_UNDEF) { - mythread_suspend_all(mythread); - } - else if(mythread->stream_opt == MyTHREAD_OPT_STOP) { - mythread_stop_all(mythread); - } - - if(prev) - prev->next = next; - - if(next) - next->prev = prev; - - if(queue_list->first == entry) - queue_list->first = next; - - if(queue_list->last == entry) - queue_list->last = prev; - - if(mythread->stream_opt != MyTHREAD_OPT_STOP) - mythread_resume_all(mythread); - - if(destroy_queue && entry->queue) - mythread_queue_destroy(entry->queue); - - if(entry->thread_param) - myhtml_free(entry->thread_param); - - myhtml_free(entry); - - queue_list->count--; - - return NULL; -} - -void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry) -{ - if(entry == NULL) - return; - - mythread_queue_clean(entry->queue); - - size_t idx; - for (idx = mythread->pth_list_root; idx < mythread->batch_first_id; idx++) { - entry->thread_param[idx].use = 0; - } - - for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { - entry->thread_param[idx].use = mythread->pth_list[idx].data.t_count; - } -} - -void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry) -{ - if(entry == NULL) - return; - - size_t idx; - const struct timespec tomeout = {0, 0}; - - for (idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { - mythread_queue_thread_param_t *thread_param = &entry->thread_param[ idx ]; - while(thread_param->use < entry->queue->nodes_uses) { - myhtml_thread_nanosleep(&tomeout); - } - } -} - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -mythread_queue_t * mythread_queue_create(size_t size, myhtml_status_t *status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - if(size < 4096) - size = 4096; - - mythread_queue_t* queue = (mythread_queue_t*)myhtml_malloc(sizeof(mythread_queue_t)); - - if(queue == NULL) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_MALLOC; - return NULL; - } - - queue->nodes_pos_size = 512; - queue->nodes_size = size; - queue->nodes = (mythread_queue_node_t**)myhtml_calloc(queue->nodes_pos_size, sizeof(mythread_queue_node_t*)); - - if(queue->nodes == NULL) { - myhtml_free(queue); - - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; - return NULL; - } - - mythread_queue_clean(queue); - - queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); - - if(queue->nodes[queue->nodes_pos] == NULL) { - myhtml_free(queue->nodes); - myhtml_free(queue); - - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; - return NULL; - } - - return queue; -} - -void mythread_queue_clean(mythread_queue_t* queue) -{ - queue->nodes_length = 0; - queue->nodes_pos = 0; - queue->nodes_root = 0; - queue->nodes_uses = 0; - - if(queue->nodes[queue->nodes_pos]) - mythread_queue_node_clean(&queue->nodes[queue->nodes_pos][queue->nodes_length]); -} - -mythread_queue_t * mythread_queue_destroy(mythread_queue_t* queue) -{ - if(queue == NULL) - return NULL; - - if(queue->nodes) { - for (size_t i = 0; i <= queue->nodes_pos; i++) { - myhtml_free(queue->nodes[i]); - } - - myhtml_free(queue->nodes); - } - - myhtml_free(queue); - - return NULL; -} - -void mythread_queue_node_clean(mythread_queue_node_t* qnode) -{ - memset(qnode, 0, sizeof(mythread_queue_node_t)); -} - -mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode) -{ - return qnode->prev; -} - -mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue) -{ - return &queue->nodes[queue->nodes_pos][queue->nodes_length]; -} - -mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue) -{ - return &queue->nodes[0][0]; -} - -size_t mythread_queue_count_used_node(mythread_queue_t* queue) -{ - return queue->nodes_uses; -} - -mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status) -{ - queue->nodes_length++; - - if(queue->nodes_length >= queue->nodes_size) - { - queue->nodes_pos++; - - if(queue->nodes_pos >= queue->nodes_pos_size) - { - mythread_queue_wait_all_for_done(mythread); - - queue->nodes_pos_size <<= 1; - mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); - - if(tmp) { - memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (queue->nodes_pos_size - queue->nodes_pos)); - - queue->nodes = tmp; - } - else { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; - - return NULL; - } - } - - if(queue->nodes[queue->nodes_pos] == NULL) { - queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); - - if(queue->nodes[queue->nodes_pos] == NULL) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; - - return NULL; - } - } - - queue->nodes_length = 0; - } - - queue->nodes_uses++; - - return &queue->nodes[queue->nodes_pos][queue->nodes_length]; -} - -mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, myhtml_status_t *status) -{ - queue->nodes_length++; - - if(queue->nodes_uses >= limit) { - queue->nodes_uses++; - mythread_queue_wait_all_for_done(mythread); - - queue->nodes_length = 0; - queue->nodes_pos = 0; - queue->nodes_root = 0; - queue->nodes_uses = 0; - } - else if(queue->nodes_length >= queue->nodes_size) - { - queue->nodes_pos++; - - if(queue->nodes_pos >= queue->nodes_pos_size) - { - mythread_queue_wait_all_for_done(mythread); - - queue->nodes_pos_size <<= 1; - mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); - - if(tmp) { - memset(&tmp[queue->nodes_pos], 0, sizeof(mythread_queue_node_t*) * (queue->nodes_pos_size - queue->nodes_pos)); - - queue->nodes = tmp; - } - else { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODES_MALLOC; - - return NULL; - } - } - - if(queue->nodes[queue->nodes_pos] == NULL) { - queue->nodes[queue->nodes_pos] = (mythread_queue_node_t*)myhtml_malloc(sizeof(mythread_queue_node_t) * queue->nodes_size); - - if(queue->nodes[queue->nodes_pos] == NULL) { - if(status) - *status = MyHTML_STATUS_THREAD_ERROR_QUEUE_NODE_MALLOC; - - return NULL; - } - } - - queue->nodes_length = 0; - } - - queue->nodes_uses++; - - return &queue->nodes[queue->nodes_pos][queue->nodes_length]; -} - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, myhtml_status_t *status) -{ - mythread_queue_t* queue = entry->queue; - - queue->nodes_length++; - - if(queue->nodes_length >= queue->nodes_size) { - queue->nodes_uses++; - - mythread_queue_list_entry_wait_for_done(mythread, entry); - mythread_queue_list_entry_clean(mythread, entry); - } - else - queue->nodes_uses++; - - return &queue->nodes[queue->nodes_pos][queue->nodes_length]; -} - -void mythread_queue_wait_all_for_done(mythread_t *mythread) -{ - const struct timespec tomeout = {0, 0}; - - mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; - mythread_queue_list_entry_t *entry = queue_list->first; - - while(entry) - { - for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { - while(entry->thread_param[idx].use < entry->queue->nodes_uses) { - myhtml_thread_nanosleep(&tomeout); - } - } - - entry = entry->next; - } -} - -#else - -void mythread_queue_wait_all_for_done(mythread_t *mythread) {} - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -#ifdef MyHTML_BUILD_WITHOUT_THREADS - -void mythread_stream_quit_all(mythread_t *mythread) {} -void mythread_batch_quit_all(mythread_t *mythread) {} -void mythread_stream_stop_all(mythread_t *mythread) {} -void mythread_batch_stop_all(mythread_t *mythread) {} -void mythread_stop_all(mythread_t *mythread) {} -void mythread_resume_all(mythread_t *mythread) {} -void mythread_suspend_all(mythread_t *mythread) {} - -#else /* MyHTML_BUILD_WITHOUT_THREADS */ - -// mythread functions -void mythread_stream_quit_all(mythread_t *mythread) -{ - mythread->stream_opt = MyTHREAD_OPT_QUIT; -} - -void mythread_batch_quit_all(mythread_t *mythread) -{ - mythread->batch_opt = MyTHREAD_OPT_QUIT; -} - -void mythread_stream_stop_all(mythread_t *mythread) -{ - if(mythread->stream_opt != MyTHREAD_OPT_STOP) - mythread->stream_opt = MyTHREAD_OPT_STOP; - - size_t idx; - const struct timespec tomeout = {0, 0}; - - for (idx = mythread->pth_list_root; idx < mythread->batch_first_id; idx++) { - while(mythread->pth_list[idx].data.opt != MyTHREAD_OPT_STOP) { - myhtml_thread_nanosleep(&tomeout); - } - } -} - -void mythread_batch_stop_all(mythread_t *mythread) -{ - if(mythread->batch_opt != MyTHREAD_OPT_STOP) - mythread->batch_opt = MyTHREAD_OPT_STOP; - - size_t idx; - const struct timespec tomeout = {0, 0}; - - for (idx = mythread->batch_first_id; idx < (mythread->batch_first_id + mythread->batch_count); idx++) { - while(mythread->pth_list[idx].data.opt != MyTHREAD_OPT_STOP) { - myhtml_thread_nanosleep(&tomeout); - } - } -} - -void mythread_stop_all(mythread_t *mythread) -{ - mythread_stream_stop_all(mythread); - mythread_batch_stop_all(mythread); -} - -void mythread_resume_all(mythread_t *mythread) -{ - if(mythread->stream_opt == MyTHREAD_OPT_UNDEF && - mythread->batch_opt == MyTHREAD_OPT_UNDEF) - return; - - if(mythread->stream_opt == MyTHREAD_OPT_WAIT || - mythread->batch_opt == MyTHREAD_OPT_WAIT) - { - mythread->stream_opt = MyTHREAD_OPT_UNDEF; - mythread->batch_opt = MyTHREAD_OPT_UNDEF; - } - else { - mythread->stream_opt = MyTHREAD_OPT_UNDEF; - mythread->batch_opt = MyTHREAD_OPT_UNDEF; - - for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { - myhtml_hread_mutex_post(mythread, &mythread->pth_list[idx].data); - } - } -} - -void mythread_suspend_all(mythread_t *mythread) -{ - if(mythread->stream_opt != MyTHREAD_OPT_WAIT) - mythread->stream_opt = MyTHREAD_OPT_WAIT; - - if(mythread->batch_opt != MyTHREAD_OPT_WAIT) - mythread->batch_opt = MyTHREAD_OPT_WAIT; - - const struct timespec tomeout = {0, 0}; - - for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { - myhtml_hread_mutex_try_wait(mythread, &mythread->pth_list[idx].data); - - while(mythread->pth_list[idx].data.opt != MyTHREAD_OPT_WAIT) { - myhtml_thread_nanosleep(&tomeout); - } - } -} - -unsigned int mythread_check_status(mythread_t *mythread) -{ - for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { - if(mythread->pth_list[idx].data.status) { - return mythread->pth_list[idx].data.status; - } - } - - return MyHTML_STATUS_OK; -} - -bool mythread_function_see_for_all_done(mythread_queue_list_t *queue_list, size_t thread_id) -{ - size_t done_count = 0; - - mythread_queue_list_entry_t *entry = queue_list->first; - while(entry) - { - if(entry->thread_param[ thread_id ].use >= entry->queue->nodes_uses) { - done_count++; - entry = entry->next; - } - else - break; - } - - return done_count == queue_list->count; -} - -bool mythread_function_see_opt(mythread_context_t *ctx, volatile mythread_thread_opt_t opt, size_t done_count, const struct timespec *timeout) -{ - mythread_t * mythread = ctx->mythread; - mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; - - if(done_count != queue_list->count) - return false; - - if(opt & MyTHREAD_OPT_STOP) - { - if(mythread_function_see_for_all_done(queue_list, ctx->id)) - { - ctx->opt = MyTHREAD_OPT_STOP; - myhtml_hread_mutex_wait(mythread, ctx); - ctx->opt = MyTHREAD_OPT_UNDEF; - - return false; - } - } - else if(opt & MyTHREAD_OPT_QUIT) - { - if(mythread_function_see_for_all_done(queue_list, ctx->id)) - { - myhtml_hread_mutex_close(mythread, ctx); - ctx->opt = MyTHREAD_OPT_QUIT; - return true; - } - } - - myhtml_thread_nanosleep(timeout); - - return false; -} - -void mythread_function_queue_batch(void *arg) -{ - mythread_context_t *ctx = (mythread_context_t*)arg; - mythread_t * mythread = ctx->mythread; - mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; - - const struct timespec timeout = {0, 0}; - myhtml_hread_mutex_wait(mythread, ctx); - - do { - if(mythread->batch_opt & MyTHREAD_OPT_WAIT) { - ctx->opt = MyTHREAD_OPT_WAIT; - - while (mythread->batch_opt & MyTHREAD_OPT_WAIT) { - myhtml_thread_nanosleep(&timeout); - } - - ctx->opt = MyTHREAD_OPT_UNDEF; - } - - mythread_queue_list_entry_t *entry = queue_list->first; - size_t done_count = 0; - - while(entry) - { - mythread_queue_thread_param_t *thread_param = &entry->thread_param[ ctx->id ]; - - if(thread_param->use < entry->queue->nodes_uses) - { - size_t pos = thread_param->use / entry->queue->nodes_size; - size_t len = thread_param->use % entry->queue->nodes_size; - - mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; - - if((qnode->tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) - ctx->func(ctx->id, (void*)qnode); - - thread_param->use += mythread->batch_count; - } - else - done_count++; - - entry = entry->next; - } - - if(done_count == queue_list->count && - mythread_function_see_opt(ctx, mythread->batch_opt, done_count, &timeout)) - break; - } - while (1); -} - -void mythread_function_queue_stream(void *arg) -{ - mythread_context_t *ctx = (mythread_context_t*)arg; - mythread_t * mythread = ctx->mythread; - mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; - - const struct timespec timeout = {0, 0}; - myhtml_hread_mutex_wait(mythread, ctx); - - do { - if(mythread->stream_opt & MyTHREAD_OPT_WAIT) { - ctx->opt = MyTHREAD_OPT_WAIT; - - while (mythread->stream_opt & MyTHREAD_OPT_WAIT) { - myhtml_thread_nanosleep(&timeout); - } - - ctx->opt = MyTHREAD_OPT_UNDEF; - } - - mythread_queue_list_entry_t *entry = queue_list->first; - size_t done_count = 0; - - while(entry) - { - mythread_queue_thread_param_t *thread_param = &entry->thread_param[ ctx->id ]; - - if(thread_param->use < entry->queue->nodes_uses) - { - size_t pos = thread_param->use / entry->queue->nodes_size; - size_t len = thread_param->use % entry->queue->nodes_size; - - mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; - - if((qnode->tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) - ctx->func(ctx->id, (void*)qnode); - - thread_param->use++; - } - else - done_count++; - - entry = entry->next; - } - - if(done_count == queue_list->count && - mythread_function_see_opt(ctx, mythread->stream_opt, done_count, &timeout)) - break; - } - while (1); -} - -void mythread_function(void *arg) -{ - mythread_context_t *ctx = (mythread_context_t*)arg; - mythread_t * mythread = ctx->mythread; - - myhtml_hread_mutex_wait(mythread, ctx); - - do { - if(mythread->stream_opt & MyTHREAD_OPT_STOP || ctx->opt & MyTHREAD_OPT_STOP) - { - ctx->opt |= MyTHREAD_OPT_DONE; - myhtml_hread_mutex_wait(mythread, ctx); - - if(mythread->stream_opt & MyTHREAD_OPT_QUIT || ctx->opt & MyTHREAD_OPT_QUIT) - { - myhtml_hread_mutex_close(mythread, ctx); - ctx->opt = MyTHREAD_OPT_QUIT; - break; - } - - ctx->opt = MyTHREAD_OPT_UNDEF; - } - else if(mythread->stream_opt & MyTHREAD_OPT_QUIT || ctx->opt & MyTHREAD_OPT_QUIT) - { - myhtml_hread_mutex_close(mythread, ctx); - ctx->opt = MyTHREAD_OPT_QUIT; - break; - } - - ctx->func(ctx->id, ctx); - } - while (1); -} - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - - diff --git a/source/myhtml/thread.h b/source/myhtml/thread.h deleted file mode 100644 index 208f6df..0000000 --- a/source/myhtml/thread.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_THREAD_H -#define MyHTML_THREAD_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -#if !defined(IS_OS_WINDOWS) -# include -# include -#endif - -#include -#include - -#include -#include - -#include "myhtml/myhtml.h" -#include "myhtml/tree.h" -#include "myhtml/mystring.h" - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -#define MyTHREAD_SEM_NAME "myhtml" - -/* functions */ -typedef void (*mythread_callback_before_join_f)(mythread_t* mythread); -typedef void (*mythread_process_f)(void* arg); -typedef void (*mythread_work_f)(mythread_id_t thread_id, void* arg); - -#ifdef MyHTML_BUILD_WITHOUT_THREADS - -struct mythread { - int sys_last_error; -}; - -#else /* MyHTML_BUILD_WITHOUT_THREADS */ - -void mythread_function_queue_stream(void *arg); -void mythread_function_queue_batch(void *arg); -void mythread_function(void *arg); - -// thread -struct mythread_context { - mythread_id_t id; - -#if defined(IS_OS_WINDOWS) - HANDLE mutex; -#else - pthread_mutex_t *mutex; -#endif - - size_t sem_name_size; - - mythread_work_f func; - - volatile size_t t_count; - volatile mythread_thread_opt_t opt; - - mythread_t *mythread; - unsigned int status; -}; - -struct mythread_list { -#if defined(IS_OS_WINDOWS) - HANDLE pth; -#else - pthread_t pth; -#endif - mythread_context_t data; - mythread_process_f process_func; -}; - -struct mythread_workers_list { - mythread_list_t *list; - size_t count; -}; - -struct mythread { - mythread_list_t *pth_list; - size_t pth_list_length; - size_t pth_list_size; - size_t pth_list_root; - - void *context; - - char *sem_prefix; - size_t sem_prefix_length; - -#if !defined(IS_OS_WINDOWS) - pthread_attr_t *attr; -#endif - - int sys_last_error; - - mythread_id_t batch_first_id; - mythread_id_t batch_count; - - volatile mythread_thread_opt_t stream_opt; - volatile mythread_thread_opt_t batch_opt; -}; - -mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status); -mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t count); - -void myhtml_thread_nanosleep(const struct timespec *tomeout); - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -mythread_t * mythread_create(void); -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count); -void mythread_clean(mythread_t *mythread); -mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_join_f before_join, bool self_destroy); - -void mythread_stream_quit_all(mythread_t *mythread); -void mythread_batch_quit_all(mythread_t *mythread); - -void mythread_stream_stop_all(mythread_t *mythread); -void mythread_batch_stop_all(mythread_t *mythread); - -void mythread_stop_all(mythread_t *mythread); -void mythread_queue_wait_all_for_done(mythread_t *mythread); -void mythread_resume_all(mythread_t *mythread); -void mythread_suspend_all(mythread_t *mythread); -unsigned int mythread_check_status(mythread_t *mythread); - -// queue -struct mythread_queue_node { - mythread_queue_node_t *prev; - myhtml_token_node_t *token; - myhtml_tree_t *tree; -}; - -struct mythread_queue_thread_param { - volatile size_t use; -}; - -struct mythread_queue_list_entry { - mythread_queue_list_entry_t *next; - mythread_queue_list_entry_t *prev; - mythread_queue_t *queue; - mythread_queue_thread_param_t *thread_param; -}; - -struct mythread_queue_list { - mythread_queue_list_entry_t *first; - mythread_queue_list_entry_t *last; - - volatile size_t count; -}; - -struct mythread_queue { - mythread_queue_node_t **nodes; - - size_t nodes_pos; - size_t nodes_pos_size; - size_t nodes_length; - - volatile size_t nodes_uses; - volatile size_t nodes_size; - volatile size_t nodes_root; -}; - -mythread_queue_t * mythread_queue_create(size_t size, myhtml_status_t *status); -void mythread_queue_clean(mythread_queue_t* queue); -mythread_queue_t * mythread_queue_destroy(mythread_queue_t* token); - -void mythread_queue_node_clean(mythread_queue_node_t* qnode); - -size_t mythread_queue_count_used_node(mythread_queue_t* queue); -mythread_queue_node_t * mythread_queue_get_first_node(mythread_queue_t* queue); -mythread_queue_node_t * mythread_queue_get_prev_node(mythread_queue_node_t* qnode); -mythread_queue_node_t * mythread_queue_get_current_node(mythread_queue_t* queue); -mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythread_queue_t* queue, myhtml_status_t *status); -mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, mythread_queue_t* queue, size_t limit, myhtml_status_t *status); - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - -mythread_queue_list_t * mythread_queue_list_create(myhtml_status_t *status); -void mythread_queue_list_destroy(mythread_queue_list_t* queue_list); - -size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list); - -mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status); -mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue); -void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry); -void mythread_queue_list_entry_wait_for_done(mythread_t *mythread, mythread_queue_list_entry_t *entry); - -mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, mythread_queue_list_entry_t *entry, myhtml_status_t *status); - -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined(__myhtml__myhtml_thread__) */ - diff --git a/source/myhtml/token.c b/source/myhtml/token.c index 1536764..0828dfc 100644 --- a/source/myhtml/token.c +++ b/source/myhtml/token.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -102,7 +102,7 @@ myhtml_token_t * myhtml_token_create(myhtml_tree_t* tree, size_t size) if(size == 0) size = 4096; - myhtml_token_t* token = (myhtml_token_t*)myhtml_malloc(sizeof(myhtml_token_t)); + myhtml_token_t* token = (myhtml_token_t*)mycore_malloc(sizeof(myhtml_token_t)); if(token == NULL) return NULL; @@ -110,15 +110,15 @@ myhtml_token_t * myhtml_token_create(myhtml_tree_t* tree, size_t size) token->nodes_obj = mcobject_async_create(); if(token->nodes_obj == NULL) { - free(token); + mycore_free(token); return NULL; } token->attr_obj = mcobject_async_create(); if(token->attr_obj == NULL) { - free(token->nodes_obj); - free(token); + mycore_free(token->nodes_obj); + mycore_free(token); return NULL; } @@ -157,7 +157,7 @@ myhtml_token_t * myhtml_token_destroy(myhtml_token_t* token) if(token->attr_obj) token->attr_obj = mcobject_async_destroy(token->attr_obj, 1); - myhtml_free(token); + mycore_free(token); return NULL; } @@ -177,7 +177,7 @@ void myhtml_token_node_clean(myhtml_token_node_t* node) memset(node, 0, sizeof(myhtml_token_node_t)); node->type = MyHTML_TOKEN_TYPE_OPEN|MyHTML_TOKEN_TYPE_WHITESPACE; - myhtml_string_clean_all(&node->str); + mycore_string_clean_all(&node->str); } myhtml_token_attr_t * myhtml_token_attr_create(myhtml_token_t* token, size_t async_node_id) @@ -195,8 +195,8 @@ void myhtml_token_attr_clean(myhtml_token_attr_t* attr) memset(attr, 0, sizeof(myhtml_token_attr_t)); attr->ns = MyHTML_NAMESPACE_HTML; - myhtml_string_clean_all(&attr->key); - myhtml_string_clean_all(&attr->value); + mycore_string_clean_all(&attr->key); + mycore_string_clean_all(&attr->value); } myhtml_tag_id_t myhtml_token_node_tag_id(myhtml_token_node_t *token_node) @@ -238,7 +238,7 @@ const char * myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *len return token_node->str.data; } -myhtml_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node) +mycore_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node) { return &token_node->str; } @@ -253,16 +253,18 @@ bool myhtml_token_node_is_close_self(myhtml_token_node_t *token_node) return (token_node->type & MyHTML_TOKEN_TYPE_CLOSE_SELF); } -void myhtml_token_node_wait_for_done(myhtml_token_node_t* node) +void myhtml_token_node_wait_for_done(myhtml_token_t* token, myhtml_token_node_t* node) { -#ifndef MyHTML_BUILD_WITHOUT_THREADS - - const struct timespec timeout = {0, 0}; - while((node->type & MyHTML_TOKEN_TYPE_DONE) == 0) {myhtml_thread_nanosleep(&timeout);} - +#ifndef MyCORE_BUILD_WITHOUT_THREADS + while((node->type & MyHTML_TOKEN_TYPE_DONE) == 0) {mythread_nanosleep_sleep(token->tree->myhtml->thread_stream->timespec);} #endif } +void myhtml_token_set_done(myhtml_token_node_t* node) +{ + node->type |= MyHTML_TOKEN_TYPE_DONE; +} + myhtml_token_node_t * myhtml_token_node_clone(myhtml_token_t* token, myhtml_token_node_t* node, size_t token_thread_idx, size_t attr_thread_idx) { if(node == NULL) @@ -283,7 +285,7 @@ myhtml_token_node_t * myhtml_token_node_clone(myhtml_token_t* token, myhtml_toke new_node->element_begin = node->element_begin; new_node->element_length = node->element_length; - myhtml_string_init(tree->mchar, tree->mchar_node_id, &new_node->str, node->str.size); + mycore_string_init(tree->mchar, tree->mchar_node_id, &new_node->str, node->str.size); myhtml_token_node_attr_copy(token, node, new_node, attr_thread_idx); return new_node; @@ -291,10 +293,10 @@ myhtml_token_node_t * myhtml_token_node_clone(myhtml_token_t* token, myhtml_toke void myhtml_token_node_text_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* text, size_t text_len) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &dest->str, (text_len + 2)); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &dest->str, (text_len + 2)); - myhtml_string_t* string = &dest->str; - myhtml_string_append(string, text, text_len); + mycore_string_t* string = &dest->str; + mycore_string_append(string, text, text_len); } myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtml_token_node_t* dest, @@ -305,18 +307,18 @@ myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtm new_attr->next = 0; if(key_len) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (key_len + 1)); - myhtml_string_append_lowercase(&new_attr->key, key, key_len); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (key_len + 1)); + mycore_string_append_lowercase(&new_attr->key, key, key_len); } else - myhtml_string_clean_all(&new_attr->key); + mycore_string_clean_all(&new_attr->key); if(value_len) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (value_len + 1)); - myhtml_string_append(&new_attr->value, value, value_len); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (value_len + 1)); + mycore_string_append(&new_attr->value, value, value_len); } else - myhtml_string_clean_all(&new_attr->value); + mycore_string_clean_all(&new_attr->value); if(dest->attr_first == NULL) { new_attr->prev = 0; @@ -339,32 +341,32 @@ myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtm myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, - size_t thread_idx, myhtml_encoding_t encoding) + size_t thread_idx, myencoding_t encoding) { myhtml_token_attr_t* new_attr = mcobject_async_malloc(token->attr_obj, thread_idx, NULL); new_attr->next = 0; if(key_len) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (key_len + 1)); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (key_len + 1)); - if(encoding == MyHTML_ENCODING_UTF_8) - myhtml_string_append_lowercase(&new_attr->key, key, key_len); + if(encoding == MyENCODING_UTF_8) + mycore_string_append_lowercase(&new_attr->key, key, key_len); else - myhtml_string_append_lowercase_ascii_with_convert_encoding(&new_attr->key, key, key_len, encoding); + myencoding_string_append_lowercase_ascii(&new_attr->key, key, key_len, encoding); } else - myhtml_string_clean_all(&new_attr->key); + mycore_string_clean_all(&new_attr->key); if(value_len) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (value_len + 1)); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (value_len + 1)); - if(encoding == MyHTML_ENCODING_UTF_8) - myhtml_string_append(&new_attr->value, value, value_len); + if(encoding == MyENCODING_UTF_8) + mycore_string_append(&new_attr->value, value, value_len); else - myhtml_string_append_with_convert_encoding(&new_attr->value, value, value_len, encoding); + myencoding_string_append(&new_attr->value, value, value_len, encoding); } else - myhtml_string_clean_all(&new_attr->value); + mycore_string_clean_all(&new_attr->value); if(dest->attr_first == NULL) { new_attr->prev = 0; @@ -415,18 +417,18 @@ bool myhtml_token_attr_copy(myhtml_token_t* token, myhtml_token_attr_t* attr, my new_attr->next = 0; if(attr->key.length) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (attr->key.length + 1)); - myhtml_string_append_lowercase(&new_attr->key, attr->key.data, attr->key.length); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->key, (attr->key.length + 1)); + mycore_string_append_lowercase(&new_attr->key, attr->key.data, attr->key.length); } else - myhtml_string_clean_all(&new_attr->key); + mycore_string_clean_all(&new_attr->key); if(attr->value.length) { - myhtml_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (attr->value.length + 1)); - myhtml_string_append(&new_attr->value, attr->value.data, attr->value.length); + mycore_string_init(token->tree->mchar, token->tree->mchar_node_id, &new_attr->value, (attr->value.length + 1)); + mycore_string_append(&new_attr->value, attr->value.data, attr->value.length); } else - myhtml_string_clean_all(&new_attr->value); + mycore_string_clean_all(&new_attr->value); if(dest->attr_first == NULL) { new_attr->prev = 0; @@ -455,8 +457,8 @@ myhtml_token_attr_t * myhtml_token_attr_match(myhtml_token_t* token, myhtml_toke { if(attr->key.length == key_size && attr->value.length == value_size) { - if((myhtml_strcmp(attr->key.data, key) == 0)) { - if((myhtml_strcmp(attr->value.data, value) == 0)) + if((mycore_strcmp(attr->key.data, key) == 0)) { + if((mycore_strcmp(attr->value.data, value) == 0)) return attr; else return NULL; @@ -478,8 +480,8 @@ myhtml_token_attr_t * myhtml_token_attr_match_case(myhtml_token_t* token, myhtml { if(attr->key.length == key_size && attr->value.length == value_size) { - if((myhtml_strcmp(attr->key.data, key) == 0)) { - if((myhtml_strcasecmp(attr->value.data, value) == 0)) + if((mycore_strcmp(attr->key.data, key) == 0)) { + if((mycore_strcasecmp(attr->value.data, value) == 0)) return attr; else return NULL; @@ -504,7 +506,7 @@ void myhtml_token_adjust_mathml_attributes(myhtml_token_node_t* target) void _myhtml_token_create_copy_srt(myhtml_token_t* token, const char* from, size_t from_size, char** to) { *to = mchar_async_malloc(token->tree->mchar, token->tree->mchar_node_id, (from_size + 2)); - myhtml_string_raw_copy(*to, from, from_size); + mycore_string_raw_copy(*to, from, from_size); } void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_tree_doctype_t* return_doctype) @@ -514,7 +516,7 @@ void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_no if(attr && attr->key.length) { _myhtml_token_create_copy_srt(token, attr->key.data, attr->key.length, &return_doctype->attr_name); - if(myhtml_strcmp("html", return_doctype->attr_name)) + if(mycore_strcmp("html", return_doctype->attr_name)) return_doctype->is_html = false; else return_doctype->is_html = true; @@ -525,11 +527,11 @@ void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_no _myhtml_token_create_copy_srt(token, "\0", 1, &return_doctype->attr_name); if(return_doctype->attr_public) - myhtml_free(return_doctype->attr_public); + mycore_free(return_doctype->attr_public); return_doctype->attr_public = NULL; if(return_doctype->attr_system) - myhtml_free(return_doctype->attr_system); + mycore_free(return_doctype->attr_system); return_doctype->attr_system = NULL; return; @@ -539,7 +541,7 @@ void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_no if(attr && attr->value.length) { - if(myhtml_strcasecmp(attr->value.data, "PUBLIC") == 0) + if(mycore_strcasecmp(attr->value.data, "PUBLIC") == 0) { // try see public attr = attr->next; @@ -554,22 +556,22 @@ void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_no _myhtml_token_create_copy_srt(token, attr->value.data, attr->value.length, &return_doctype->attr_system); else { if(return_doctype->attr_system) - myhtml_free(return_doctype->attr_system); + mycore_free(return_doctype->attr_system); _myhtml_token_create_copy_srt(token, "\0", 1, &return_doctype->attr_system); } } else { if(return_doctype->attr_public) - myhtml_free(return_doctype->attr_public); + mycore_free(return_doctype->attr_public); return_doctype->attr_public = NULL; if(return_doctype->attr_system) - myhtml_free(return_doctype->attr_system); + mycore_free(return_doctype->attr_system); return_doctype->attr_system = NULL; } } - else if(myhtml_strncasecmp(attr->value.data, "SYSTEM", attr->value.length) == 0) + else if(mycore_strncasecmp(attr->value.data, "SYSTEM", attr->value.length) == 0) { attr = attr->next; @@ -579,21 +581,21 @@ void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_no } else { if(return_doctype->attr_public) - myhtml_free(return_doctype->attr_public); + mycore_free(return_doctype->attr_public); return_doctype->attr_public = NULL; if(return_doctype->attr_system) - myhtml_free(return_doctype->attr_system); + mycore_free(return_doctype->attr_system); return_doctype->attr_system = NULL; } } else { if(return_doctype->attr_public) - myhtml_free(return_doctype->attr_public); + mycore_free(return_doctype->attr_public); return_doctype->attr_public = NULL; if(return_doctype->attr_system) - myhtml_free(return_doctype->attr_system); + mycore_free(return_doctype->attr_system); return_doctype->attr_system = NULL; } } @@ -601,14 +603,14 @@ void myhtml_token_strict_doctype_by_token(myhtml_token_t* token, myhtml_token_no bool myhtml_token_doctype_check_html_4_0(myhtml_tree_doctype_t* return_doctype) { - return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD HTML 4.0//EN") && - (return_doctype->attr_system == NULL || myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/REC-html40/strict.dtd")); + return mycore_strcmp(return_doctype->attr_public, "-//W3C//DTD HTML 4.0//EN") && + (return_doctype->attr_system == NULL || mycore_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/REC-html40/strict.dtd")); } bool myhtml_token_doctype_check_html_4_01(myhtml_tree_doctype_t* return_doctype) { - return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD HTML 4.01//EN") && - (return_doctype->attr_system == NULL || myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/html4/strict.dtd")); + return mycore_strcmp(return_doctype->attr_public, "-//W3C//DTD HTML 4.01//EN") && + (return_doctype->attr_system == NULL || mycore_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/html4/strict.dtd")); } bool myhtml_token_doctype_check_xhtml_1_0(myhtml_tree_doctype_t* return_doctype) @@ -616,8 +618,8 @@ bool myhtml_token_doctype_check_xhtml_1_0(myhtml_tree_doctype_t* return_doctype) if(return_doctype->attr_system == NULL) return true; - return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD XHTML 1.0 Strict//EN") && - myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); + return mycore_strcmp(return_doctype->attr_public, "-//W3C//DTD XHTML 1.0 Strict//EN") && + mycore_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"); } bool myhtml_token_doctype_check_xhtml_1_1(myhtml_tree_doctype_t* return_doctype) @@ -625,8 +627,8 @@ bool myhtml_token_doctype_check_xhtml_1_1(myhtml_tree_doctype_t* return_doctype) if(return_doctype->attr_system == NULL) return true; - return myhtml_strcmp(return_doctype->attr_public, "-//W3C//DTD XHTML 1.1//EN") && - myhtml_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"); + return mycore_strcmp(return_doctype->attr_public, "-//W3C//DTD XHTML 1.1//EN") && + mycore_strcmp(return_doctype->attr_system, "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"); } bool myhtml_token_release_and_check_doctype_attributes(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_tree_doctype_t* return_doctype) @@ -641,7 +643,7 @@ bool myhtml_token_release_and_check_doctype_attributes(myhtml_token_t* token, my if((return_doctype->is_html || return_doctype->attr_public || - (return_doctype->attr_system && myhtml_strcmp(return_doctype->attr_system, "about:legacy-compat")))) + (return_doctype->attr_system && mycore_strcmp(return_doctype->attr_system, "about:legacy-compat")))) { if(return_doctype->attr_public == NULL) return false; @@ -669,8 +671,8 @@ void myhtml_token_adjust_svg_attributes(myhtml_token_node_t* target) myhtml_token_attr_svg_replacement[i].from_size); if(attr) { - myhtml_string_clean(&attr->key); - myhtml_string_append(&attr->key, myhtml_token_attr_svg_replacement[i].to, + mycore_string_clean(&attr->key); + mycore_string_append(&attr->key, myhtml_token_attr_svg_replacement[i].to, myhtml_token_attr_svg_replacement[i].to_size); } } @@ -686,8 +688,8 @@ void myhtml_token_adjust_foreign_attributes(myhtml_token_node_t* target) myhtml_token_attr_namespace_replacement[i].from_size); if(attr) { - myhtml_string_clean(&attr->key); - myhtml_string_append(&attr->key, myhtml_token_attr_namespace_replacement[i].to, + mycore_string_clean(&attr->key); + mycore_string_append(&attr->key, myhtml_token_attr_namespace_replacement[i].to, myhtml_token_attr_namespace_replacement[i].to_size); attr->ns = myhtml_token_attr_namespace_replacement[i].ns; @@ -708,10 +710,10 @@ bool myhtml_token_attr_compare(myhtml_token_node_t* target, myhtml_token_node_t* if(target_attr->key.length == dest_attr->key.length && target_attr->value.length == dest_attr->value.length) { - if(myhtml_strcmp(target_attr->key.data, dest_attr->key.data) != 0) + if(mycore_strcmp(target_attr->key.data, dest_attr->key.data) != 0) break; - if(myhtml_strcasecmp(target_attr->value.data, dest_attr->value.data) != 0) + if(mycore_strcasecmp(target_attr->value.data, dest_attr->value.data) != 0) break; } else @@ -734,7 +736,7 @@ myhtml_token_attr_t * myhtml_token_attr_by_name(myhtml_token_node_t* node, const while (attr) { if(name_length == attr->key.length) { - if(myhtml_strcmp(attr->key.data, name) == 0) + if(mycore_strcmp(attr->key.data, name) == 0) break; } @@ -803,11 +805,11 @@ myhtml_token_attr_t * myhtml_token_attr_remove_by_name(myhtml_token_node_t* node myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, myhtml_token_node_t* token_to, myhtml_token_node_t* token_from, bool cp_reverse) { - myhtml_token_node_wait_for_done(token_to); - myhtml_token_node_wait_for_done(token_from); + myhtml_token_node_wait_for_done(tree->token, token_to); + myhtml_token_node_wait_for_done(tree->token, token_from); - myhtml_string_t *string1 = &token_to->str; - myhtml_string_t *string2 = &token_from->str; + mycore_string_t *string1 = &token_to->str; + mycore_string_t *string2 = &token_from->str; token_to->raw_begin = 0; token_to->raw_length = 0; @@ -815,10 +817,10 @@ myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, if(token_to->str.node_idx == tree->mchar_node_id) { if(cp_reverse) { - //myhtml_string_copy(string2, &string_base); + //mycore_string_copy(string2, &string_base); } else { - myhtml_string_copy(string1, string2); + mycore_string_copy(string1, string2); } return token_to; @@ -826,25 +828,25 @@ myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, if(token_from->str.node_idx == tree->mchar_node_id) { if(cp_reverse) { - myhtml_string_copy(string2, string1); + mycore_string_copy(string2, string1); } else { - myhtml_string_copy(string1, string2); + mycore_string_copy(string1, string2); } return token_from; } else { - myhtml_string_t string_base; - myhtml_string_init(tree->mchar, tree->mchar_node_id, &string_base, (string1->length + string2->length + 2)); + mycore_string_t string_base; + mycore_string_init(tree->mchar, tree->mchar_node_id, &string_base, (string1->length + string2->length + 2)); if(cp_reverse) { - myhtml_string_copy(&string_base, string2); - myhtml_string_copy(&string_base, string1); + mycore_string_copy(&string_base, string2); + mycore_string_copy(&string_base, string1); } else { - myhtml_string_copy(&string_base, string1); - myhtml_string_copy(&string_base, string2); + mycore_string_copy(&string_base, string1); + mycore_string_copy(&string_base, string2); } token_to->str = string_base; @@ -855,117 +857,13 @@ myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, void myhtml_token_set_replacement_character_for_null_token(myhtml_tree_t* tree, myhtml_token_node_t* node) { - myhtml_token_node_wait_for_done(node); + myhtml_token_node_wait_for_done(tree->token, node); - myhtml_string_t new_str; - myhtml_string_init(tree->mchar, tree->mchar_node_id, &new_str, (node->str.length + 2)); + mycore_string_t new_str; + mycore_string_init(tree->mchar, tree->mchar_node_id, &new_str, (node->str.length + 2)); - myhtml_string_append_with_replacement_null_characters_only(&new_str, node->str.data, node->str.length); + mycore_string_append_with_replacement_null_characters(&new_str, node->str.data, node->str.length); node->str = new_str; } -void myhtml_token_set_done(myhtml_token_node_t* node) -{ - node->type |= MyHTML_TOKEN_TYPE_DONE; -} - -void myhtml_token_print_param_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out) -{ - if(node->type & MyHTML_TOKEN_TYPE_CLOSE) { - fprintf(out, "tag_id, node->raw_begin, node->raw_length, - (size_t)node->attr_first, (size_t)node->attr_last); - - if(node->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) { - fprintf(out, " />\n"); - } - else { - fprintf(out, ">\n"); - } -} - -void myhtml_token_print_by_idx(myhtml_tree_t* tree, myhtml_token_node_t* node, FILE* out) -{ - const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tree->tags, node->tag_id); - - if(node->tag_id == MyHTML_TAG__TEXT || - node->tag_id == MyHTML_TAG__COMMENT) - { - if(node->str.length) { - fprintf(out, "%.*s: %.*s\n", (int)ctx->name_length, ctx->name, - (int)node->str.length, node->str.data); - } - else { - fprintf(out, "%.*s is empty\n", (int)ctx->name_length, ctx->name); - } - } - else - { - if(node->type & MyHTML_TOKEN_TYPE_CLOSE) { - fprintf(out, "name_length, ctx->name, node->tag_id); - - myhtml_token_print_attr(tree, node, out); - - if(node->type & MyHTML_TOKEN_TYPE_CLOSE_SELF) { - fprintf(out, " />\n"); - } - else { - fprintf(out, ">\n"); - } - } -} - -void myhtml_token_print_attr(myhtml_tree_t* tree, myhtml_token_node_t* node, FILE* out) -{ - myhtml_token_attr_t* attr = node->attr_first; - - while(attr) - { - fprintf(out, " %s", attr->key.data); - - if(attr->ns != MyHTML_NAMESPACE_HTML) - { - switch (attr->ns) { - case MyHTML_NAMESPACE_SVG: - fprintf(out, ":svg"); - break; - case MyHTML_NAMESPACE_MATHML: - fprintf(out, ":math"); - break; - case MyHTML_NAMESPACE_XLINK: - fprintf(out, ":xlink"); - break; - case MyHTML_NAMESPACE_XML: - fprintf(out, ":xml"); - break; - case MyHTML_NAMESPACE_XMLNS: - fprintf(out, ":xmlns"); - break; - default: - fprintf(out, ":UNDEF"); - break; - } - } - - if(attr->value.length) { - fprintf(out, "=\"%s\"", attr->value.data); - } - - attr = attr->next; - } -} - - diff --git a/source/myhtml/token.h b/source/myhtml/token.h index 0f3de04..3936f4a 100644 --- a/source/myhtml/token.h +++ b/source/myhtml/token.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -29,13 +29,13 @@ extern "C" { #include #include "myhtml/myosi.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #include "myhtml/tag.h" #include "myhtml/myhtml.h" #include "myhtml/mystring.h" -#include "myhtml/utils/mcobject_async.h" -#include "myhtml/utils/mchar_async.h" -#include "myhtml/utils/mcsync.h" +#include "mycore/utils/mcobject_async.h" +#include "mycore/utils/mchar_async.h" +#include "mycore/utils/mcsync.h" #define myhtml_token_node_set_done(token_node) token_node->type |= MyHTML_TOKEN_TYPE_DONE @@ -61,8 +61,8 @@ struct myhtml_token_attr { myhtml_token_attr_t* next; myhtml_token_attr_t* prev; - myhtml_string_t key; - myhtml_string_t value; + mycore_string_t key; + mycore_string_t value; size_t raw_key_begin; size_t raw_key_length; @@ -75,7 +75,7 @@ struct myhtml_token_attr { struct myhtml_token_node { myhtml_tag_id_t tag_id; - myhtml_string_t str; + mycore_string_t str; size_t raw_begin; size_t raw_length; @@ -115,7 +115,7 @@ myhtml_tree_attr_t * myhtml_token_node_attribute_first(myhtml_token_node_t *toke myhtml_tree_attr_t * myhtml_token_node_attribute_last(myhtml_token_node_t *token_node); const char * myhtml_token_node_text(myhtml_token_node_t *token_node, size_t *length); -myhtml_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node); +mycore_string_t * myhtml_token_node_string(myhtml_token_node_t *token_node); bool myhtml_token_node_is_close(myhtml_token_node_t *token_node); bool myhtml_token_node_is_close_self(myhtml_token_node_t *token_node); @@ -130,7 +130,7 @@ myhtml_token_attr_t * myhtml_token_attr_remove_by_name(myhtml_token_node_t* node void myhtml_token_attr_delete_all(myhtml_token_t* token, myhtml_token_node_t* node); void myhtml_token_delete(myhtml_token_t* token, myhtml_token_node_t* node); -void myhtml_token_node_wait_for_done(myhtml_token_node_t* node); +void myhtml_token_node_wait_for_done(myhtml_token_t* token, myhtml_token_node_t* node); void myhtml_token_set_done(myhtml_token_node_t* node); myhtml_token_attr_t * myhtml_token_attr_match(myhtml_token_t* token, myhtml_token_node_t* target, const char* key, size_t key_size, const char* value, size_t value_size); @@ -143,7 +143,7 @@ void myhtml_token_adjust_svg_attributes(myhtml_token_node_t* target); void myhtml_token_adjust_foreign_attributes(myhtml_token_node_t* target); myhtml_token_attr_t * myhtml_token_node_attr_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx); -myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx, myhtml_encoding_t encoding); +myhtml_token_attr_t * myhtml_token_node_attr_append_with_convert_encoding(myhtml_token_t* token, myhtml_token_node_t* dest, const char* key, size_t key_len, const char* value, size_t value_len, size_t thread_idx, myencoding_t encoding); void myhtml_token_node_text_append(myhtml_token_t* token, myhtml_token_node_t* dest, const char* text, size_t text_len); void myhtml_token_node_attr_copy(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); void myhtml_token_node_attr_copy_with_check(myhtml_token_t* token, myhtml_token_node_t* target, myhtml_token_node_t* dest, size_t thread_idx); @@ -154,10 +154,6 @@ bool myhtml_token_attr_compare(myhtml_token_node_t* target, myhtml_token_node_t* myhtml_token_node_t * myhtml_token_merged_two_token_string(myhtml_tree_t* tree, myhtml_token_node_t* token_to, myhtml_token_node_t* token_from, bool cp_reverse); void myhtml_token_set_replacement_character_for_null_token(myhtml_tree_t* tree, myhtml_token_node_t* node); -void myhtml_token_print_param_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); -void myhtml_token_print_by_idx(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); -void myhtml_token_print_attr(myhtml_tree_t* myhtml_tree, myhtml_token_node_t* node, FILE* out); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/source/myhtml/tokenizer.c b/source/myhtml/tokenizer.c index 1740a71..1dca519 100644 --- a/source/myhtml/tokenizer.c +++ b/source/myhtml/tokenizer.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -19,14 +19,14 @@ */ #include "myhtml/tokenizer.h" -#include "myhtml/utils/resources.h" +#include "mycore/utils/resources.h" -myhtml_status_t myhtml_tokenizer_set_first_settings(myhtml_tree_t* tree, const char* html, size_t html_length) +mystatus_t myhtml_tokenizer_set_first_settings(myhtml_tree_t* tree, const char* html, size_t html_length) { tree->current_qnode = mythread_queue_get_current_node(tree->queue); mythread_queue_node_clean(tree->current_qnode); - tree->current_qnode->tree = tree; + tree->current_qnode->context = tree; tree->current_token_node = myhtml_token_node_create(tree->token, tree->token->mcasync_token_id); if(tree->current_token_node == NULL) @@ -37,20 +37,20 @@ myhtml_status_t myhtml_tokenizer_set_first_settings(myhtml_tree_t* tree, const c return MyHTML_STATUS_OK; } -myhtml_status_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length) +mystatus_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length) { return myhtml_tokenizer_chunk(tree, html, html_length); } -myhtml_status_t myhtml_tokenizer_chunk_process(myhtml_tree_t* tree, const char* html, size_t html_length) +mystatus_t myhtml_tokenizer_chunk_process(myhtml_tree_t* tree, const char* html, size_t html_length) { myhtml_t* myhtml = tree->myhtml; myhtml_tokenizer_state_f* state_f = myhtml->parse_state_func; // add for a chunk - tree->incoming_buf = myhtml_incoming_buffer_add(tree->incoming_buf, tree->mcobject_incoming_buf, html, html_length); + tree->incoming_buf = mycore_incoming_buffer_add(tree->incoming_buf, tree->mcobject_incoming_buf, html, html_length); -#ifndef MyHTML_BUILD_WITHOUT_THREADS +#ifndef MyCORE_BUILD_WITHOUT_THREADS if(myhtml->opt & MyHTML_OPTIONS_PARSE_MODE_SINGLE) tree->flags |= MyHTML_TREE_FLAGS_SINGLE_MODE; @@ -58,8 +58,10 @@ myhtml_status_t myhtml_tokenizer_chunk_process(myhtml_tree_t* tree, const char* if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) { if(tree->queue_entry == NULL) { - myhtml_status_t status = MyHTML_STATUS_OK; - tree->queue_entry = mythread_queue_list_entry_push(myhtml->thread, tree->queue, &status); + mystatus_t status = MyHTML_STATUS_OK; + tree->queue_entry = mythread_queue_list_entry_push(myhtml->thread_list, 2, + myhtml->thread_stream->context, tree->queue, + myhtml->thread_total, &status); if(status) return status; @@ -89,10 +91,10 @@ myhtml_status_t myhtml_tokenizer_chunk_process(myhtml_tree_t* tree, const char* return MyHTML_STATUS_OK; } -myhtml_status_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length) +mystatus_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length) { - if(tree->encoding_usereq == MyHTML_ENCODING_UTF_16LE || - tree->encoding_usereq == MyHTML_ENCODING_UTF_16BE) + if(tree->encoding_usereq == MyENCODING_UTF_16LE || + tree->encoding_usereq == MyENCODING_UTF_16BE) { return myhtml_tokenizer_chunk_with_stream_buffer(tree, html, html_length); } @@ -100,10 +102,10 @@ myhtml_status_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, si return myhtml_tokenizer_chunk_process(tree, html, html_length); } -myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length) +mystatus_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length) { unsigned const char* u_html = (unsigned const char*)html; - const myhtml_encoding_custom_f func = myhtml_encoding_get_function_by_id(tree->encoding); + const myencoding_custom_f func = myencoding_get_function_by_id(tree->encoding); if(tree->stream_buffer == NULL) { tree->stream_buffer = myhtml_stream_buffer_create(); @@ -111,7 +113,7 @@ myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, c if(tree->stream_buffer == NULL) return MyHTML_STATUS_STREAM_BUFFER_ERROR_CREATE; - myhtml_status_t status = myhtml_stream_buffer_init(tree->stream_buffer, 1024); + mystatus_t status = myhtml_stream_buffer_init(tree->stream_buffer, 1024); if(status) return status; @@ -127,11 +129,11 @@ myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, c for (size_t i = 0; i < html_length; i++) { - if(func(u_html[i], &stream_buffer->res) == MyHTML_ENCODING_STATUS_OK) + if(func(u_html[i], &stream_buffer->res) == MyENCODING_STATUS_OK) { if((stream_entry->length + 4) >= stream_entry->size) { - tree->encoding = MyHTML_ENCODING_UTF_8; + tree->encoding = MyENCODING_UTF_8; myhtml_tokenizer_chunk_process(tree, &stream_entry->data[temp_curr_pos], (stream_entry->length - temp_curr_pos)); stream_entry = myhtml_stream_buffer_add_entry(stream_buffer, (4096 * 4)); @@ -142,19 +144,19 @@ myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, c temp_curr_pos = stream_entry->length; } - stream_entry->length += myhtml_encoding_codepoint_to_ascii_utf_8(stream_buffer->res.result, &stream_entry->data[ stream_entry->length ]); + stream_entry->length += myencoding_codepoint_to_ascii_utf_8(stream_buffer->res.result, &stream_entry->data[ stream_entry->length ]); } } if((stream_entry->length - temp_curr_pos)) { - tree->encoding = MyHTML_ENCODING_UTF_8; + tree->encoding = MyENCODING_UTF_8; myhtml_tokenizer_chunk_process(tree, &stream_entry->data[temp_curr_pos], (stream_entry->length - temp_curr_pos)); } return MyHTML_STATUS_OK; } -myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree) +mystatus_t myhtml_tokenizer_end(myhtml_tree_t* tree) { if(tree->incoming_buf) { @@ -170,21 +172,24 @@ myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree) tree->tokenizer_status = MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; } - myhtml_status_t status = tree->tokenizer_status; + mystatus_t status = tree->tokenizer_status; -#ifndef MyHTML_BUILD_WITHOUT_THREADS +#ifndef MyCORE_BUILD_WITHOUT_THREADS if((tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) { - mythread_queue_list_entry_wait_for_done(tree->myhtml->thread, tree->queue_entry); - tree->queue_entry = mythread_queue_list_entry_delete(tree->myhtml->thread, tree->queue_entry, false); + mythread_queue_list_entry_wait_for_done(tree->myhtml->thread_stream, tree->queue_entry); - if(mythread_queue_list_get_count(tree->myhtml->thread->context) == 0) { + tree->queue_entry = mythread_queue_list_entry_delete(tree->myhtml->thread_list, 2, + tree->myhtml->thread_stream->context, + tree->queue_entry, false); + + /* Further, any work with tree... */ + if(mythread_queue_list_get_count(tree->myhtml->thread_stream->context) == 0) myhtml_tokenizer_pause(tree); - } if(status == MyHTML_STATUS_OK) - status = mythread_check_status(tree->myhtml->thread); + status = mythread_check_status(tree->myhtml->thread_stream); } #endif @@ -238,17 +243,32 @@ myhtml_tree_node_t * myhtml_tokenizer_fragment_init(myhtml_tree_t* tree, myhtml_ void myhtml_tokenizer_wait(myhtml_tree_t* tree) { - mythread_queue_wait_all_for_done(tree->myhtml->thread); +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(tree->myhtml->thread_stream) + mythread_queue_list_entry_wait_for_done(tree->myhtml->thread_stream, tree->queue_entry); +#endif } void myhtml_tokenizer_post(myhtml_tree_t* tree) { - mythread_resume_all(tree->myhtml->thread); +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(tree->myhtml->thread_stream) + mythread_resume(tree->myhtml->thread_stream, MyTHREAD_OPT_UNDEF); + + if(tree->myhtml->thread_batch) + mythread_resume(tree->myhtml->thread_batch, MyTHREAD_OPT_UNDEF); +#endif } void myhtml_tokenizer_pause(myhtml_tree_t* tree) { - mythread_stop_all(tree->myhtml->thread); +#ifndef MyCORE_BUILD_WITHOUT_THREADS + if(tree->myhtml->thread_stream) + mythread_stop(tree->myhtml->thread_stream); + + if(tree->myhtml->thread_batch) + mythread_stop(tree->myhtml->thread_batch); +#endif } void myhtml_tokenizer_calc_current_namespace(myhtml_tree_t* tree, myhtml_token_node_t* token_node) @@ -362,8 +382,8 @@ size_t myhtml_tokenizer_state_rcdata(myhtml_tree_t* tree, myhtml_token_node_t* t mythread_queue_node_t* prev_qnode = mythread_queue_get_prev_node(tree->current_qnode); - if(prev_qnode && prev_qnode->token) { - tree->tmp_tag_id = prev_qnode->token->tag_id; + if(prev_qnode && prev_qnode->args) { + tree->tmp_tag_id = ((myhtml_token_node_t*)(prev_qnode->args))->tag_id; } else if(tree->fragment) { tree->tmp_tag_id = tree->fragment->tag_id; @@ -404,7 +424,7 @@ size_t myhtml_tokenizer_state_rcdata_less_than_sign(myhtml_tree_t* tree, myhtml_ size_t myhtml_tokenizer_state_rcdata_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_A_Z_a_z) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA_END_TAG_NAME; } @@ -467,7 +487,7 @@ size_t myhtml_tokenizer_state_rcdata_end_tag_name(myhtml_tree_t* tree, myhtml_to while(html_offset < html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_WHITESPACE) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_WHITESPACE) { if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RCDATA)) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; @@ -515,7 +535,7 @@ size_t myhtml_tokenizer_state_rcdata_end_tag_name(myhtml_tree_t* tree, myhtml_to break; } - else if (myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyHTML_TOKENIZER_CHAR_A_Z_a_z) { + else if (mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyCORE_STRING_MAP_CHAR_A_Z_a_z) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RCDATA; break; } @@ -538,8 +558,8 @@ size_t myhtml_tokenizer_state_rawtext(myhtml_tree_t* tree, myhtml_token_node_t* mythread_queue_node_t* prev_qnode = mythread_queue_get_prev_node(tree->current_qnode); - if(prev_qnode && prev_qnode->token) { - tree->tmp_tag_id = prev_qnode->token->tag_id; + if(prev_qnode && prev_qnode->args) { + tree->tmp_tag_id = ((myhtml_token_node_t*)prev_qnode->args)->tag_id; } else if(tree->fragment) { tree->tmp_tag_id = tree->fragment->tag_id; @@ -581,7 +601,7 @@ size_t myhtml_tokenizer_state_rawtext_less_than_sign(myhtml_tree_t* tree, myhtml size_t myhtml_tokenizer_state_rawtext_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_A_Z_a_z) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT_END_TAG_NAME; } @@ -599,7 +619,7 @@ size_t myhtml_tokenizer_state_rawtext_end_tag_name(myhtml_tree_t* tree, myhtml_t while(html_offset < html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_WHITESPACE) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_WHITESPACE) { if(_myhtml_tokenizer_state_andata_end_tag_name(tree, token_node, html, &html_offset, tmp_begin, MyHTML_TOKEN_TYPE_RAWTEXT)) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_BEFORE_ATTRIBUTE_NAME; @@ -641,7 +661,7 @@ size_t myhtml_tokenizer_state_rawtext_end_tag_name(myhtml_tree_t* tree, myhtml_t return html_offset; } - else if (myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyHTML_TOKENIZER_CHAR_A_Z_a_z) { + else if (mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyCORE_STRING_MAP_CHAR_A_Z_a_z) { token_node->raw_begin = tmp_begin; myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_RAWTEXT; @@ -751,7 +771,7 @@ size_t myhtml_tokenizer_state_data(myhtml_tree_t* tree, myhtml_token_node_t* tok token_node->type |= MyHTML_TOKEN_TYPE_NULL; } else if(token_node->type & MyHTML_TOKEN_TYPE_WHITESPACE && - myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyHTML_TOKENIZER_CHAR_WHITESPACE) { + mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] != MyCORE_STRING_MAP_CHAR_WHITESPACE) { token_node->type ^= (token_node->type & MyHTML_TOKEN_TYPE_WHITESPACE); token_node->type |= MyHTML_TOKEN_TYPE_DATA; } @@ -768,7 +788,7 @@ size_t myhtml_tokenizer_state_data(myhtml_tree_t* tree, myhtml_token_node_t* tok ///////////////////////////////////////////////////////// size_t myhtml_tokenizer_state_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_A_Z_a_z) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((tree->global_offset + html_offset) - 1), MyHTML_TOKEN_TYPE_DATA); if(token_node == NULL) { @@ -830,7 +850,7 @@ size_t myhtml_tokenizer_state_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* ///////////////////////////////////////////////////////// size_t myhtml_tokenizer_state_end_tag_open(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_A_Z_a_z) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_A_Z_a_z) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((tree->global_offset + html_offset) - 2), MyHTML_TOKEN_TYPE_DATA); if(token_node == NULL) { @@ -902,7 +922,7 @@ size_t myhtml_tokenizer_state_markup_declaration_open(myhtml_tree_t* tree, myhtm tagname = myhtml_tree_incomming_buffer_make_data(tree, token_node->raw_begin, 7); - if(myhtml_strncasecmp(tagname, "DOCTYPE", 7) == 0) + if(mycore_strncasecmp(tagname, "DOCTYPE", 7) == 0) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_DOCTYPE; @@ -916,9 +936,9 @@ size_t myhtml_tokenizer_state_markup_declaration_open(myhtml_tree_t* tree, myhtm // CDATA sections can only be used in foreign content (MathML or SVG) if(strncmp(tagname, "[CDATA[", 7) == 0) { - if(tree->current_qnode->prev && tree->current_qnode->prev->token) + if(tree->current_qnode->prev && tree->current_qnode->prev->args) { - myhtml_tree_wait_for_last_done_token(tree, tree->current_qnode->prev->token); + myhtml_tree_wait_for_last_done_token(tree, tree->current_qnode->prev->args); myhtml_tree_node_t *adjusted_current_node = myhtml_tree_adjusted_current_node(tree); if(adjusted_current_node && @@ -952,7 +972,7 @@ size_t myhtml_tokenizer_state_tag_name(myhtml_tree_t* tree, myhtml_token_node_t* { while(html_offset < html_size) { - if(myhtml_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyHTML_TOKENIZER_CHAR_WHITESPACE) + if(mycore_tokenizer_chars_map[ (unsigned char)html[html_offset] ] == MyCORE_STRING_MAP_CHAR_WHITESPACE) { token_node->raw_length = (tree->global_offset + html_offset) - token_node->raw_begin; myhtml_check_tag_parser(tree, token_node, html, html_offset); @@ -1655,9 +1675,9 @@ size_t myhtml_tokenizer_state_parse_error_stop(myhtml_tree_t* tree, myhtml_token return html_size; } -myhtml_status_t myhtml_tokenizer_state_init(myhtml_t* myhtml) +mystatus_t myhtml_tokenizer_state_init(myhtml_t* myhtml) { - myhtml->parse_state_func = (myhtml_tokenizer_state_f*)myhtml_malloc(sizeof(myhtml_tokenizer_state_f) * + myhtml->parse_state_func = (myhtml_tokenizer_state_f*)mycore_malloc(sizeof(myhtml_tokenizer_state_f) * ((MyHTML_TOKENIZER_STATE_LAST_ENTRY * MyHTML_TOKENIZER_STATE_LAST_ENTRY) + 1)); @@ -1896,7 +1916,7 @@ myhtml_status_t myhtml_tokenizer_state_init(myhtml_t* myhtml) void myhtml_tokenizer_state_destroy(myhtml_t* myhtml) { if(myhtml->parse_state_func) - myhtml_free(myhtml->parse_state_func); + mycore_free(myhtml->parse_state_func); } diff --git a/source/myhtml/tokenizer.h b/source/myhtml/tokenizer.h index be1e15f..84cc823 100644 --- a/source/myhtml/tokenizer.h +++ b/source/myhtml/tokenizer.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,23 +27,23 @@ extern "C" { #endif #include "myhtml/myosi.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" +#include "mycore/mythread.h" #include "myhtml/myhtml.h" #include "myhtml/tag.h" -#include "myhtml/thread.h" #include "myhtml/tokenizer_doctype.h" #include "myhtml/tokenizer_script.h" #include "myhtml/tokenizer_end.h" - + #define myhtml_tokenizer_inc_html_offset(offset, size) \ offset++; \ if(offset >= size) \ return offset -myhtml_status_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length); -myhtml_status_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length); -myhtml_status_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length); -myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree); +mystatus_t myhtml_tokenizer_begin(myhtml_tree_t* tree, const char* html, size_t html_length); +mystatus_t myhtml_tokenizer_chunk(myhtml_tree_t* tree, const char* html, size_t html_length); +mystatus_t myhtml_tokenizer_chunk_with_stream_buffer(myhtml_tree_t* tree, const char* html, size_t html_length); +mystatus_t myhtml_tokenizer_end(myhtml_tree_t* tree); void myhtml_tokenizer_set_state(myhtml_tree_t* tree, myhtml_token_node_t* token_node); void myhtml_tokenizer_calc_current_namespace(myhtml_tree_t* tree, myhtml_token_node_t* token_node); @@ -54,7 +54,7 @@ void myhtml_tokenizer_wait(myhtml_tree_t* tree); void myhtml_tokenizer_post(myhtml_tree_t* tree); void myhtml_tokenizer_pause(myhtml_tree_t* tree); -myhtml_status_t myhtml_tokenizer_state_init(myhtml_t* myhtml); +mystatus_t myhtml_tokenizer_state_init(myhtml_t* myhtml); void myhtml_tokenizer_state_destroy(myhtml_t* myhtml); myhtml_token_node_t * myhtml_tokenizer_queue_create_text_node_if_need(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t absolute_html_offset, enum myhtml_token_type type); diff --git a/source/myhtml/tokenizer_doctype.c b/source/myhtml/tokenizer_doctype.c index d63036f..cb649a1 100644 --- a/source/myhtml/tokenizer_doctype.c +++ b/source/myhtml/tokenizer_doctype.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -169,7 +169,7 @@ size_t myhtml_tokenizer_state_custom_after_doctype_name_a_z(myhtml_tree_t* tree, const char *param = myhtml_tree_incomming_buffer_make_data(tree, token_node->str.length, 6); - if(myhtml_strncasecmp(param, "PUBLIC", 6) == 0) { + if(mycore_strncasecmp(param, "PUBLIC", 6) == 0) { myhtml_parser_queue_set_attr(tree, token_node); tree->attr_current->raw_value_begin = token_node->str.length; @@ -185,7 +185,7 @@ size_t myhtml_tokenizer_state_custom_after_doctype_name_a_z(myhtml_tree_t* tree, html_offset = (token_node->str.length + 6) - tree->incoming_buf->offset; } - else if(myhtml_strncasecmp(param, "SYSTEM", 6) == 0) { + else if(mycore_strncasecmp(param, "SYSTEM", 6) == 0) { myhtml_parser_queue_set_attr(tree, token_node); tree->attr_current->raw_value_begin = token_node->str.length; diff --git a/source/myhtml/tokenizer_doctype.h b/source/myhtml/tokenizer_doctype.h index a773d10..aedec57 100644 --- a/source/myhtml/tokenizer_doctype.h +++ b/source/myhtml/tokenizer_doctype.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ extern "C" { #endif #include "myhtml/myosi.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #include "myhtml/myhtml.h" size_t myhtml_tokenizer_state_doctype(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); diff --git a/source/myhtml/tokenizer_end.c b/source/myhtml/tokenizer_end.c index cca56fc..a80975f 100644 --- a/source/myhtml/tokenizer_end.c +++ b/source/myhtml/tokenizer_end.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/tokenizer_end.h b/source/myhtml/tokenizer_end.h index 3d78807..8b4d953 100644 --- a/source/myhtml/tokenizer_end.h +++ b/source/myhtml/tokenizer_end.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/source/myhtml/tokenizer_script.c b/source/myhtml/tokenizer_script.c index f5f473b..2c69cf7 100644 --- a/source/myhtml/tokenizer_script.c +++ b/source/myhtml/tokenizer_script.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -113,7 +113,7 @@ size_t myhtml_tokenizer_state_script_data_end_tag_name(myhtml_tree_t* tree, myht size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((html_offset + tree->global_offset) - 8), MyHTML_TOKEN_TYPE_SCRIPT); if(token_node == NULL) { @@ -146,7 +146,7 @@ size_t myhtml_tokenizer_state_script_data_end_tag_name(myhtml_tree_t* tree, myht size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((html_offset + tree->global_offset) - 8), MyHTML_TOKEN_TYPE_SCRIPT); if(token_node == NULL) { @@ -179,7 +179,7 @@ size_t myhtml_tokenizer_state_script_data_end_tag_name(myhtml_tree_t* tree, myht size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((html_offset + tree->global_offset) - 8), MyHTML_TOKEN_TYPE_SCRIPT); if(token_node == NULL) { @@ -289,7 +289,7 @@ size_t myhtml_tokenizer_state_script_data_escaped_end_tag_name(myhtml_tree_t* tr size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((html_offset + tree->global_offset) - 8), MyHTML_TOKEN_TYPE_SCRIPT); if(token_node == NULL) { @@ -322,7 +322,7 @@ size_t myhtml_tokenizer_state_script_data_escaped_end_tag_name(myhtml_tree_t* tr size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((html_offset + tree->global_offset) - 8), MyHTML_TOKEN_TYPE_SCRIPT); if(token_node == NULL) { @@ -355,7 +355,7 @@ size_t myhtml_tokenizer_state_script_data_escaped_end_tag_name(myhtml_tree_t* tr size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { token_node = myhtml_tokenizer_queue_create_text_node_if_need(tree, token_node, html, ((html_offset + tree->global_offset) - 8), MyHTML_TOKEN_TYPE_SCRIPT); if(token_node == NULL) { @@ -455,7 +455,7 @@ size_t myhtml_tokenizer_state_script_data_double_escape_start(myhtml_tree_t* tre size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) { + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_SCRIPT_DATA_DOUBLE_ESCAPED; } else { @@ -573,7 +573,7 @@ size_t myhtml_tokenizer_state_script_data_double_escape_end(myhtml_tree_t* tree, size_t tmp_size = token_node->str.length; const char *tem_name = myhtml_tree_incomming_buffer_make_data(tree, tmp_size, 6); - if(myhtml_strncasecmp(tem_name, "script", 6) == 0) { + if(mycore_strncasecmp(tem_name, "script", 6) == 0) { myhtml_tokenizer_state_set(tree) = MyHTML_TOKENIZER_STATE_SCRIPT_DATA_ESCAPED; } else { diff --git a/source/myhtml/tokenizer_script.h b/source/myhtml/tokenizer_script.h index 65cb934..6bbf86b 100644 --- a/source/myhtml/tokenizer_script.h +++ b/source/myhtml/tokenizer_script.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ extern "C" { #endif #include "myhtml/myosi.h" -#include "myhtml/utils.h" +#include "mycore/utils.h" #include "myhtml/myhtml.h" #include "myhtml/tokenizer.h" diff --git a/source/myhtml/tree.c b/source/myhtml/tree.c index 618801e..533c307 100644 --- a/source/myhtml/tree.c +++ b/source/myhtml/tree.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -22,12 +22,12 @@ myhtml_tree_t * myhtml_tree_create(void) { - return (myhtml_tree_t*)myhtml_calloc(1, sizeof(myhtml_tree_t)); + return (myhtml_tree_t*)mycore_calloc(1, sizeof(myhtml_tree_t)); } -myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) +mystatus_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) { - myhtml_status_t status = MyHTML_STATUS_OK; + mystatus_t status = MyHTML_STATUS_OK; tree->myhtml = myhtml; tree->token = myhtml_token_create(tree, 512); @@ -38,7 +38,6 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) tree->temp_tag_name.data = NULL; tree->stream_buffer = NULL; tree->parse_flags = MyHTML_TREE_PARSE_FLAGS_CLEAN; - tree->queue = mythread_queue_create(9182, &status); tree->context = NULL; tree->callback_before_token = NULL; @@ -54,12 +53,21 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) if(status) return status; - /* init Incoming Buffer objects */ + /* Thread Queue */ + tree->queue = mythread_queue_create(); + if(tree->queue == NULL) + return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; + + status = mythread_queue_init(tree->queue, 9182); + if(status) + return status; + + /* Init Incoming Buffer objects */ tree->mcobject_incoming_buf = mcobject_create(); if(tree->mcobject_incoming_buf == NULL) return MyHTML_STATUS_TREE_ERROR_INCOMING_BUFFER_CREATE; - status = mcobject_init(tree->mcobject_incoming_buf, 256, sizeof(myhtml_incoming_buffer_t)); + status = mcobject_init(tree->mcobject_incoming_buf, 256, sizeof(mycore_incoming_buffer_t)); if(status) return status; @@ -72,13 +80,19 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) if(mcstatus) return MyHTML_STATUS_TREE_ERROR_MCOBJECT_INIT; - tree->mchar = mchar_async_create(128, (4096 * 5)); + tree->mchar = mchar_async_create(); tree->active_formatting = myhtml_tree_active_formatting_init(tree); tree->open_elements = myhtml_tree_open_elements_init(tree); tree->other_elements = myhtml_tree_list_init(); tree->token_list = myhtml_tree_token_list_init(); tree->template_insertion = myhtml_tree_template_insertion_init(tree); + if(tree->mchar == NULL) + return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; + + if((status = mchar_async_init(tree->mchar, 128, (4096 * 5)))) + return status; + tree->mcasync_tree_id = mcobject_async_node_add(tree->tree_obj, &mcstatus); if(mcstatus) return MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE; @@ -91,36 +105,40 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) if(mcstatus) return MyHTML_STATUS_TREE_ERROR_MCOBJECT_CREATE_NODE; - tree->mchar_node_id = mchar_async_node_add(tree->mchar); - -#ifndef MyHTML_BUILD_WITHOUT_THREADS - - tree->async_args = (myhtml_async_args_t*)myhtml_calloc(myhtml->thread->pth_list_length, sizeof(myhtml_async_args_t)); - +#ifndef MyCORE_BUILD_WITHOUT_THREADS + tree->async_args = (myhtml_async_args_t*)mycore_calloc(myhtml->thread_total, sizeof(myhtml_async_args_t)); if(tree->async_args == NULL) - return MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION; - - // for single mode in main thread - tree->async_args[0].mchar_node_id = tree->mchar_node_id; + return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; // for batch thread - for(size_t i = 0; i < myhtml->thread->batch_count; i++) { - tree->async_args[(myhtml->thread->batch_first_id + i)].mchar_node_id = mchar_async_node_add(tree->mchar); + for(size_t i = 0; i < myhtml->thread_total; i++) { + tree->async_args[i].mchar_node_id = mchar_async_node_add(tree->mchar, &status); + + if(status) + return status; } - -#else /* MyHTML_BUILD_WITHOUT_THREADS */ - - tree->async_args = (myhtml_async_args_t*)myhtml_calloc(1, sizeof(myhtml_async_args_t)); +#else /* MyCORE_BUILD_WITHOUT_THREADS */ + tree->async_args = (myhtml_async_args_t*)mycore_calloc(1, sizeof(myhtml_async_args_t)); if(tree->async_args == NULL) return MyHTML_STATUS_TREE_ERROR_MEMORY_ALLOCATION; - tree->async_args->mchar_node_id = tree->mchar_node_id; + tree->async_args->mchar_node_id = mchar_async_node_add(tree->mchar, &status); -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ + if(status) + return status; + +#endif /* MyCORE_BUILD_WITHOUT_THREADS */ + + /* for main thread only after parsing */ + tree->mchar_node_id = tree->async_args->mchar_node_id; tree->sync = mcsync_create(); - mcsync_init(tree->sync); + if(tree->sync == NULL) + return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; + + if(mcsync_init(tree->sync)) + return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; /* init Tags after create and init mchar */ tree->tags = myhtml_tag_create(); @@ -133,22 +151,23 @@ myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml) void myhtml_tree_clean(myhtml_tree_t* tree) { -#ifndef MyHTML_BUILD_WITHOUT_THREADS +#ifndef MyCORE_BUILD_WITHOUT_THREADS myhtml_t* myhtml = tree->myhtml; - for(size_t i = 0; i < myhtml->thread->batch_count; i++) { - mchar_async_node_clean(tree->mchar, tree->async_args[(myhtml->thread->batch_first_id + i)].mchar_node_id); + for(size_t i = 0; i < myhtml->thread_total; i++) { + mchar_async_node_clean(tree->mchar, tree->async_args[i].mchar_node_id); } -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ +#else + mchar_async_node_clean(tree->mchar, tree->mchar_node_id); +#endif mcobject_async_node_clean(tree->tree_obj, tree->mcasync_tree_id); mcobject_async_node_clean(tree->token->nodes_obj, tree->mcasync_rules_token_id); mcobject_async_node_clean(tree->token->attr_obj, tree->mcasync_rules_attr_id); - mchar_async_node_clean(tree->mchar, tree->mchar_node_id); -#ifndef MyHTML_BUILD_WITHOUT_THREADS - mythread_queue_list_entry_clean(tree->myhtml->thread, tree->queue_entry); -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + mythread_queue_list_entry_clean(tree->queue_entry); +#endif /* MyCORE_BUILD_WITHOUT_THREADS */ myhtml_token_clean(tree->token); @@ -184,8 +203,8 @@ void myhtml_tree_clean(myhtml_tree_t* tree) tree->token_last_done = NULL; tree->tokenizer_status = MyHTML_STATUS_OK; - tree->encoding = MyHTML_ENCODING_UTF_8; - tree->encoding_usereq = MyHTML_ENCODING_DEFAULT; + tree->encoding = MyENCODING_UTF_8; + tree->encoding_usereq = MyENCODING_DEFAULT; myhtml_stream_buffer_clean(tree->stream_buffer); @@ -239,8 +258,8 @@ void myhtml_tree_clean_all(myhtml_tree_t* tree) tree->token_last_done = NULL; tree->tokenizer_status = MyHTML_STATUS_OK; - tree->encoding = MyHTML_ENCODING_UTF_8; - tree->encoding_usereq = MyHTML_ENCODING_DEFAULT; + tree->encoding = MyENCODING_UTF_8; + tree->encoding_usereq = MyENCODING_DEFAULT; myhtml_stream_buffer_clean(tree->stream_buffer); @@ -252,9 +271,9 @@ void myhtml_tree_clean_all(myhtml_tree_t* tree) mcobject_clean(tree->mcobject_incoming_buf); myhtml_tag_clean(tree->tags); -#ifndef MyHTML_BUILD_WITHOUT_THREADS - mythread_queue_list_entry_clean(tree->myhtml->thread, tree->queue_entry); -#endif /* MyHTML_BUILD_WITHOUT_THREADS */ +#ifndef MyCORE_BUILD_WITHOUT_THREADS + mythread_queue_list_entry_clean(tree->queue_entry); +#endif tree->attr_current = myhtml_token_attr_create(tree->token, tree->token->mcasync_attr_id); } @@ -281,8 +300,8 @@ myhtml_tree_t * myhtml_tree_destroy(myhtml_tree_t* tree) myhtml_tree_temp_tag_name_destroy(&tree->temp_tag_name, false); - myhtml_free(tree->async_args); - myhtml_free(tree); + mycore_free(tree->async_args); + mycore_free(tree); return NULL; } @@ -493,7 +512,7 @@ myhtml_tree_node_t * myhtml_tree_node_clone(myhtml_tree_node_t* node) { myhtml_tree_node_t* new_node = myhtml_tree_node_create(node->tree); - myhtml_token_node_wait_for_done(node->token); + myhtml_token_node_wait_for_done(node->tree->token, node->token); new_node->token = myhtml_token_node_clone(node->tree->token, node->token, node->tree->mcasync_rules_token_id, @@ -735,11 +754,11 @@ bool myhtml_tree_element_in_scope_by_node(myhtml_tree_node_t* node, enum myhtml_ // list myhtml_tree_list_t * myhtml_tree_list_init(void) { - myhtml_tree_list_t* list = myhtml_malloc(sizeof(myhtml_tree_list_t)); + myhtml_tree_list_t* list = mycore_malloc(sizeof(myhtml_tree_list_t)); list->length = 0; list->size = 4096; - list->list = (myhtml_tree_node_t**)myhtml_malloc(sizeof(myhtml_tree_node_t*) * list->size); + list->list = (myhtml_tree_node_t**)mycore_malloc(sizeof(myhtml_tree_node_t*) * list->size); return list; } @@ -755,10 +774,10 @@ myhtml_tree_list_t * myhtml_tree_list_destroy(myhtml_tree_list_t* list, bool des return NULL; if(list->list) - myhtml_free(list->list); + mycore_free(list->list); if(destroy_self && list) { - myhtml_free(list); + mycore_free(list); return NULL; } @@ -770,7 +789,7 @@ void myhtml_tree_list_append(myhtml_tree_list_t* list, myhtml_tree_node_t* node) if(list->length >= list->size) { list->size <<= 1; - myhtml_tree_node_t** tmp = (myhtml_tree_node_t**)myhtml_realloc(list->list, sizeof(myhtml_tree_node_t*) * list->size); + myhtml_tree_node_t** tmp = (myhtml_tree_node_t**)mycore_realloc(list->list, sizeof(myhtml_tree_node_t*) * list->size); if(tmp) list->list = tmp; @@ -790,7 +809,7 @@ void myhtml_tree_list_insert_by_index(myhtml_tree_list_t* list, myhtml_tree_node if(list->length >= list->size) { list->size <<= 1; - myhtml_tree_node_t** tmp = (myhtml_tree_node_t**)myhtml_realloc(list->list, sizeof(myhtml_tree_node_t*) * list->size); + myhtml_tree_node_t** tmp = (myhtml_tree_node_t**)mycore_realloc(list->list, sizeof(myhtml_tree_node_t*) * list->size); if(tmp) list->list = tmp; @@ -831,7 +850,7 @@ myhtml_tree_list_t * myhtml_tree_open_elements_destroy(myhtml_tree_t* tree) myhtml_tree_node_t * myhtml_tree_current_node(myhtml_tree_t* tree) { if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Current node; Open elements is 0"); + MyCORE_DEBUG("Current node; Open elements is 0"); return 0; } @@ -861,9 +880,9 @@ void myhtml_tree_open_elements_pop(myhtml_tree_t* tree) if(tree->open_elements->length) tree->open_elements->length--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Pop open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); + MyCORE_DEBUG("Pop open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); } #endif } @@ -886,9 +905,9 @@ void myhtml_tree_open_elements_remove(myhtml_tree_t* tree, myhtml_tree_node_t* n } } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Remove open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); + MyCORE_DEBUG("Remove open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); } #endif } @@ -913,9 +932,9 @@ void myhtml_tree_open_elements_pop_until(myhtml_tree_t* tree, myhtml_tag_id_t ta } } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Until open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); + MyCORE_DEBUG("Until open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); } #endif } @@ -936,9 +955,9 @@ void myhtml_tree_open_elements_pop_until_by_node(myhtml_tree_t* tree, myhtml_tre } } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Until by node open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); + MyCORE_DEBUG("Until by node open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); } #endif } @@ -957,9 +976,9 @@ void myhtml_tree_open_elements_pop_until_by_index(myhtml_tree_t* tree, size_t id } } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Until by index open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); + MyCORE_DEBUG("Until by index open elements; Now, Open Elements set 0; Good, if the end of parsing, otherwise is very bad"); } #endif } @@ -1045,7 +1064,7 @@ myhtml_tree_node_t * myhtml_tree_open_elements_find_by_tag_idx(myhtml_tree_t* tr void myhtml_tree_generate_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_id_t exclude_tag_idx, myhtml_namespace_t mynamespace) { if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Generate implied end tags; Open elements is 0"); + MyCORE_DEBUG("Generate implied end tags; Open elements is 0"); return; } @@ -1053,9 +1072,9 @@ void myhtml_tree_generate_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_id_t { myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(current_node == NULL) { - MyHTML_DEBUG_ERROR("Generate implied end tags; Current node is NULL! This is very bad"); + MyCORE_DEBUG_ERROR("Generate implied end tags; Current node is NULL! This is very bad"); } #endif @@ -1087,7 +1106,7 @@ void myhtml_tree_generate_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_id_t void myhtml_tree_generate_all_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_id_t exclude_tag_idx, myhtml_namespace_t mynamespace) { if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Generate all implied end tags; Open elements is 0"); + MyCORE_DEBUG("Generate all implied end tags; Open elements is 0"); return; } @@ -1095,9 +1114,9 @@ void myhtml_tree_generate_all_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_i { myhtml_tree_node_t* current_node = myhtml_tree_current_node(tree); -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(current_node == NULL) { - MyHTML_DEBUG_ERROR("Generate all implied end tags; Current node is NULL! This is very bad"); + MyCORE_DEBUG_ERROR("Generate all implied end tags; Current node is NULL! This is very bad"); } #endif @@ -1136,7 +1155,7 @@ void myhtml_tree_generate_all_implied_end_tags(myhtml_tree_t* tree, myhtml_tag_i void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) { if(tree->open_elements->length == 0) { - MyHTML_DEBUG("Reset insertion mode appropriately; Open elements is 0"); + MyCORE_DEBUG("Reset insertion mode appropriately; Open elements is 0"); return; } @@ -1154,9 +1173,9 @@ void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) // step 2 myhtml_tree_node_t* node = list[i]; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(node == NULL) { - MyHTML_DEBUG_ERROR("Reset insertion mode appropriately; node is NULL! This is very bad"); + MyCORE_DEBUG_ERROR("Reset insertion mode appropriately; node is NULL! This is very bad"); } #endif @@ -1197,9 +1216,9 @@ void myhtml_tree_reset_insertion_mode_appropriately(myhtml_tree_t* tree) return; } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(ancestor == 0) { - MyHTML_DEBUG_ERROR("Reset insertion mode appropriately; Ancestor is 0! This is very, very bad"); + MyCORE_DEBUG_ERROR("Reset insertion mode appropriately; Ancestor is 0! This is very, very bad"); } #endif @@ -1315,9 +1334,9 @@ myhtml_tree_list_t * myhtml_tree_active_formatting_destroy(myhtml_tree_t* tree) bool myhtml_tree_active_formatting_is_marker(myhtml_tree_t* tree, myhtml_tree_node_t* node) { -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(node == NULL) { - MyHTML_DEBUG_ERROR("Active formatting is marker; node is NULL!"); + MyCORE_DEBUG_ERROR("Active formatting is marker; node is NULL!"); } #endif @@ -1351,9 +1370,9 @@ void myhtml_tree_active_formatting_pop(myhtml_tree_t* tree) if(tree->active_formatting->length) tree->active_formatting->length--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->active_formatting->length == 0) { - MyHTML_DEBUG("Pop active formatting; length is 0"); + MyCORE_DEBUG("Pop active formatting; length is 0"); } #endif } @@ -1376,9 +1395,9 @@ void myhtml_tree_active_formatting_remove(myhtml_tree_t* tree, myhtml_tree_node_ } } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->active_formatting->length == 0) { - // MyHTML_DEBUG("Remove active formatting; length is 0"); + // MyCORE_DEBUG("Remove active formatting; length is 0"); } #endif } @@ -1390,9 +1409,9 @@ void myhtml_tree_active_formatting_remove_by_index(myhtml_tree_t* tree, size_t i memmove(&list[idx], &list[idx + 1], sizeof(myhtml_tree_node_t*) * (tree->active_formatting->length - idx)); tree->active_formatting->length--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->active_formatting->length == 0) { - MyHTML_DEBUG("Remove active formatting by index; length is 0"); + MyCORE_DEBUG("Remove active formatting by index; length is 0"); } #endif } @@ -1413,9 +1432,9 @@ void myhtml_tree_active_formatting_append_with_check(myhtml_tree_t* tree, myhtml { i--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(list[i] == NULL) { - MyHTML_DEBUG("Appen active formatting with check; list[%zu] is NULL", i); + MyCORE_DEBUG("Appen active formatting with check; list[" MyCORE_FORMAT_Z "] is NULL", i); } #endif @@ -1424,8 +1443,8 @@ void myhtml_tree_active_formatting_append_with_check(myhtml_tree_t* tree, myhtml if(list[i]->token && node->token) { - myhtml_token_node_wait_for_done(list[i]->token); - myhtml_token_node_wait_for_done(node->token); + myhtml_token_node_wait_for_done(tree->token, list[i]->token); + myhtml_token_node_wait_for_done(tree->token, node->token); if(list[i]->ns == node->ns && list[i]->tag_id == node->tag_id && @@ -1446,7 +1465,7 @@ void myhtml_tree_active_formatting_append_with_check(myhtml_tree_t* tree, myhtml myhtml_tree_node_t * myhtml_tree_active_formatting_current_node(myhtml_tree_t* tree) { if(tree->active_formatting->length == 0) { - MyHTML_DEBUG("Current node active formatting; length is 0"); + MyCORE_DEBUG("Current node active formatting; length is 0"); return 0; } @@ -1482,9 +1501,9 @@ void myhtml_tree_active_formatting_up_to_last_marker(myhtml_tree_t* tree) if(tree->active_formatting->length == 0) return; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(list[ tree->active_formatting->length ] == NULL) { - MyHTML_DEBUG("Up to last marker active formatting; list[%zu] is NULL", tree->active_formatting->length); + MyCORE_DEBUG("Up to last marker active formatting; list[" MyCORE_FORMAT_Z "] is NULL", tree->active_formatting->length); } #endif @@ -1492,9 +1511,9 @@ void myhtml_tree_active_formatting_up_to_last_marker(myhtml_tree_t* tree) { tree->active_formatting->length--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(list[ tree->active_formatting->length ] == NULL) { - MyHTML_DEBUG("Up to last marker active formatting; list[%zu] is NULL", tree->active_formatting->length); + MyCORE_DEBUG("Up to last marker active formatting; list[" MyCORE_FORMAT_Z "] is NULL", tree->active_formatting->length); } #endif @@ -1515,9 +1534,9 @@ myhtml_tree_node_t * myhtml_tree_active_formatting_between_last_marker(myhtml_tr { i--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(list[i] == NULL) { - MyHTML_DEBUG("Between last marker active formatting; list[%zu] is NULL", i); + MyCORE_DEBUG("Between last marker active formatting; list[" MyCORE_FORMAT_Z "] is NULL", i); } #endif @@ -1554,9 +1573,9 @@ void myhtml_tree_active_formatting_reconstruction(myhtml_tree_t* tree) { af_idx--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(list[af_idx] == NULL) { - MyHTML_DEBUG("Formatting reconstruction; Step 4--6; list[%zu] is NULL", af_idx); + MyCORE_DEBUG("Formatting reconstruction; Step 4--6; list[" MyCORE_FORMAT_Z "] is NULL", af_idx); } #endif @@ -1570,9 +1589,9 @@ void myhtml_tree_active_formatting_reconstruction(myhtml_tree_t* tree) while (af_idx < af->length) { -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(list[af_idx] == NULL) { - MyHTML_DEBUG("Formatting reconstruction; Next steps; list[%zu] is NULL", af_idx); + MyCORE_DEBUG("Formatting reconstruction; Next steps; list[" MyCORE_FORMAT_Z "] is NULL", af_idx); } #endif @@ -1596,9 +1615,9 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod myhtml_tree_node_t** afe_list = tree->active_formatting->list; myhtml_tree_node_t* current_node = oel_list[oel_curr_index]; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(current_node == NULL) { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Current node is NULL"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Current node is NULL"); } #endif @@ -1707,18 +1726,18 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod /* %EXTERNAL% VALIDATOR:RULES TOKEN STATUS:AAA_BEGIN LEVEL:INFO */ -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(oel_format_el_idx == 0) { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Step 11; oel_format_el_idx is 0; Bad!"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Step 11; oel_format_el_idx is 0; Bad!"); } #endif // step 12 myhtml_tree_node_t* common_ancestor = oel_list[oel_format_el_idx - 1]; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(common_ancestor == NULL) { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Step 11; common_ancestor is NULL"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Step 11; common_ancestor is NULL"); } #endif @@ -1744,7 +1763,7 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod if(node_index > 0) node_index--; else { - fprintf(stderr, "ERROR: adoption agency algorithm; decrement node_index, node_index is null"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; decrement node_index, node_index is null"); return false; } @@ -1752,9 +1771,9 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod node = oel_list[node_index]; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(node == NULL) { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Step 13.3; node is NULL"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Step 13.3; node is NULL"); } #endif // step 14.4 @@ -1795,9 +1814,9 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod if(last == furthest_block) { bookmark = afe_node_index + 1; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(bookmark >= tree->active_formatting->length) { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Step 13.8; bookmark >= open_elements length"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Step 13.8; bookmark >= open_elements length"); } #endif } @@ -1846,9 +1865,9 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod if(afe_index < bookmark) bookmark--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(bookmark >= tree->active_formatting->length) { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Before Step 18; bookmark (%zu) >= open_elements length", bookmark); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Before Step 18; bookmark (" MyCORE_FORMAT_Z ") >= open_elements length", bookmark); } #endif @@ -1862,7 +1881,7 @@ bool myhtml_tree_adoption_agency_algorithm(myhtml_tree_t* tree, myhtml_token_nod myhtml_tree_list_insert_by_index(tree->open_elements, new_formatting_element, idx_furthest_block + 1); } else { - MyHTML_DEBUG_ERROR("Adoption agency algorithm; Step 19; can't find furthest_block in open elements"); + MyCORE_DEBUG_ERROR("Adoption agency algorithm; Step 19; can't find furthest_block in open elements"); } } @@ -1881,9 +1900,9 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting(myhtml_tree_t* tree myhtml_tree_node_t* adjusted_location; if(tree->foster_parenting) { -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(target == NULL) { - MyHTML_DEBUG_ERROR("Appropriate place inserting; Step 2; target is NULL in return value! This IS very bad"); + MyCORE_DEBUG_ERROR("Appropriate place inserting; Step 2; target is NULL in return value! This IS very bad"); } #endif if(target->ns != MyHTML_NAMESPACE_HTML) @@ -1932,9 +1951,9 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting(myhtml_tree_t* tree break; } -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(idx_table == 0) { - MyHTML_DEBUG_ERROR("Appropriate place inserting; Step 2.5; idx_table is 0"); + MyCORE_DEBUG_ERROR("Appropriate place inserting; Step 2.5; idx_table is 0"); } #endif @@ -1950,9 +1969,9 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting(myhtml_tree_t* tree } } else { -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(target == NULL) { - MyHTML_DEBUG_ERROR("Appropriate place inserting; Step 3-5; target is NULL in return value! This IS very bad"); + MyCORE_DEBUG_ERROR("Appropriate place inserting; Step 3-5; target is NULL in return value! This IS very bad"); } #endif @@ -1972,9 +1991,9 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting_in_tree(myhtml_tree myhtml_tree_node_t* adjusted_location; if(target->tree->foster_parenting) { -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(target == NULL) { - MyHTML_DEBUG_ERROR("Appropriate place inserting; Step 2; target is NULL in return value! This IS very bad"); + MyCORE_DEBUG_ERROR("Appropriate place inserting; Step 2; target is NULL in return value! This IS very bad"); } #endif @@ -2028,12 +2047,6 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting_in_tree(myhtml_tree break; } -#ifdef DEBUG_MODE - if(idx_table == 0) { - MyHTML_DEBUG_ERROR("Appropriate place inserting; Step 2.5; idx_table is 0"); - } -#endif - // step 2.6-7 adjusted_location = target; @@ -2047,9 +2060,9 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting_in_tree(myhtml_tree } } else { -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(target == NULL) { - MyHTML_DEBUG_ERROR("Appropriate place inserting; Step 3-5; target is NULL in return value! This IS very bad"); + MyCORE_DEBUG_ERROR("Appropriate place inserting; Step 3-5; target is NULL in return value! This IS very bad"); } #endif @@ -2066,11 +2079,11 @@ myhtml_tree_node_t * myhtml_tree_appropriate_place_inserting_in_tree(myhtml_tree // stack of template insertion modes myhtml_tree_insertion_list_t * myhtml_tree_template_insertion_init(myhtml_tree_t* tree) { - myhtml_tree_insertion_list_t* list = myhtml_malloc(sizeof(myhtml_tree_insertion_list_t)); + myhtml_tree_insertion_list_t* list = mycore_malloc(sizeof(myhtml_tree_insertion_list_t)); list->length = 0; list->size = 1024; - list->list = (enum myhtml_insertion_mode*)myhtml_malloc(sizeof(enum myhtml_insertion_mode) * list->size); + list->list = (enum myhtml_insertion_mode*)mycore_malloc(sizeof(enum myhtml_insertion_mode) * list->size); tree->template_insertion = list; @@ -2088,10 +2101,10 @@ myhtml_tree_insertion_list_t * myhtml_tree_template_insertion_destroy(myhtml_tre return NULL; if(tree->template_insertion->list) - myhtml_free(tree->template_insertion->list); + mycore_free(tree->template_insertion->list); if(tree->template_insertion) - myhtml_free(tree->template_insertion); + mycore_free(tree->template_insertion); return NULL; } @@ -2103,7 +2116,7 @@ void myhtml_tree_template_insertion_append(myhtml_tree_t* tree, enum myhtml_inse if(list->length >= list->size) { list->size <<= 1; - enum myhtml_insertion_mode* tmp = (enum myhtml_insertion_mode*)myhtml_realloc(list->list, + enum myhtml_insertion_mode* tmp = (enum myhtml_insertion_mode*)mycore_realloc(list->list, sizeof(enum myhtml_insertion_mode) * list->size); if(tmp) @@ -2119,9 +2132,9 @@ void myhtml_tree_template_insertion_pop(myhtml_tree_t* tree) if(tree->template_insertion->length) tree->template_insertion->length--; -#ifdef DEBUG_MODE +#ifdef MyCORE_BUILD_DEBUG if(tree->template_insertion->length == 0) { - MyHTML_DEBUG("Pop template insertion; length is 0"); + MyCORE_DEBUG("Pop template insertion; length is 0"); } #endif } @@ -2131,122 +2144,14 @@ size_t myhtml_tree_template_insertion_length(myhtml_tree_t* tree) return tree->template_insertion->length; } -void myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out) -{ - if(node == NULL) - return; - - const myhtml_tag_context_t *ctx = myhtml_tag_get_by_id(tree->tags, node->tag_id); - - if(node->tag_id == MyHTML_TAG__TEXT || - node->tag_id == MyHTML_TAG__COMMENT) - { - if(node->token) - fprintf(out, "<%.*s>: %.*s\n", (int)ctx->name_length, ctx->name, - (int)node->token->str.length, node->token->str.data); - else - fprintf(out, "<%.*s>\n", (int)ctx->name_length, ctx->name); - } - else if(node->tag_id == MyHTML_TAG__DOCTYPE) - { - fprintf(out, "doctype.attr_name) { - fprintf(out, " %s", tree->doctype.attr_name); - } - - if(tree->doctype.attr_public) { - fprintf(out, " %s", tree->doctype.attr_public); - } - - if(tree->doctype.attr_system) { - fprintf(out, " %s", tree->doctype.attr_system); - } - - fprintf(out, ">\n"); - } - else - { - if(node->token && node->token->type & MyHTML_TOKEN_TYPE_CLOSE) { - fprintf(out, "name_length, ctx->name); - } - else { - fprintf(out, "<%.*s", (int)ctx->name_length, ctx->name); - } - - if(node->ns != MyHTML_NAMESPACE_HTML) { - switch (node->ns) { - case MyHTML_NAMESPACE_SVG: - fprintf(out, ":svg"); - break; - case MyHTML_NAMESPACE_MATHML: - fprintf(out, ":math"); - break; - case MyHTML_NAMESPACE_XLINK: - fprintf(out, ":xlink"); - break; - case MyHTML_NAMESPACE_XML: - fprintf(out, ":xml"); - break; - case MyHTML_NAMESPACE_XMLNS: - fprintf(out, ":xmlns"); - break; - default: - break; - } - } - - if(node->token) - myhtml_token_print_attr(tree, node->token, out); - - fprintf(out, ">\n"); - } -} - -void _myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc) -{ - if(node == NULL) - return; - - size_t i; - - while(node) - { - for(i = 0; i < inc; i++) - fprintf(out, "\t"); - - myhtml_tree_print_node(tree, node, out); - _myhtml_tree_print_node_children(tree, node->child, out, (inc + 1)); - - node = node->next; - } -} - -void myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc) -{ - if(node == NULL) - return; - - _myhtml_tree_print_node_children(tree, node->child, out, inc); -} - -void myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc) -{ - if(node == NULL) - return; - - myhtml_tree_print_node(tree, node, out); - myhtml_tree_print_node_children(tree, node, out, (inc + 1)); -} - // token list myhtml_tree_token_list_t * myhtml_tree_token_list_init(void) { - myhtml_tree_token_list_t* list = myhtml_malloc(sizeof(myhtml_tree_token_list_t)); + myhtml_tree_token_list_t* list = mycore_malloc(sizeof(myhtml_tree_token_list_t)); list->length = 0; list->size = 4096; - list->list = (myhtml_token_node_t**)myhtml_malloc(sizeof(myhtml_token_node_t*) * list->size); + list->list = (myhtml_token_node_t**)mycore_malloc(sizeof(myhtml_token_node_t*) * list->size); return list; } @@ -2262,10 +2167,10 @@ myhtml_tree_token_list_t * myhtml_tree_token_list_destroy(myhtml_tree_token_list return NULL; if(list->list) - myhtml_free(list->list); + mycore_free(list->list); if(destroy_self && list) { - myhtml_free(list); + mycore_free(list); return NULL; } @@ -2277,7 +2182,7 @@ void myhtml_tree_token_list_append(myhtml_tree_token_list_t* list, myhtml_token_ if(list->length >= list->size) { list->size <<= 1; - myhtml_token_node_t** tmp = (myhtml_token_node_t**)myhtml_realloc(list->list, sizeof(myhtml_token_node_t*) * list->size); + myhtml_token_node_t** tmp = (myhtml_token_node_t**)mycore_realloc(list->list, sizeof(myhtml_token_node_t*) * list->size); if(tmp) list->list = tmp; @@ -2292,7 +2197,7 @@ void myhtml_tree_token_list_append_after_index(myhtml_tree_token_list_t* list, m if(list->length >= list->size) { list->size <<= 1; - myhtml_token_node_t** tmp = (myhtml_token_node_t**)myhtml_realloc(list->list, sizeof(myhtml_token_node_t*) * list->size); + myhtml_token_node_t** tmp = (myhtml_token_node_t**)mycore_realloc(list->list, sizeof(myhtml_token_node_t*) * list->size); if(tmp) list->list = tmp; @@ -2313,7 +2218,7 @@ void myhtml_tree_token_list_append_after_index(myhtml_tree_token_list_t* list, m myhtml_token_node_t * myhtml_tree_token_list_current_node(myhtml_tree_token_list_t* list) { if(list->length == 0) { - MyHTML_DEBUG("Token list current node; length is 0"); + MyCORE_DEBUG("Token list current node; length is 0"); return NULL; } @@ -2443,7 +2348,7 @@ bool myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node node->tag_id == MyHTML_TAG_ANNOTATION_XML && node->token && (node->token->type & MyHTML_TOKEN_TYPE_CLOSE) == 0) { - myhtml_token_node_wait_for_done(node->token); + myhtml_token_node_wait_for_done(tree->token, node->token); myhtml_token_attr_t* attr = myhtml_token_attr_match_case(tree->token, node->token, "encoding", 8, "text/html", 9); @@ -2460,11 +2365,11 @@ bool myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node } // temp tag name -myhtml_status_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name) +mystatus_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name) { temp_tag_name->size = 1024; temp_tag_name->length = 0; - temp_tag_name->data = (char *)myhtml_malloc(temp_tag_name->size * sizeof(char)); + temp_tag_name->data = (char *)mycore_malloc(temp_tag_name->size * sizeof(char)); if(temp_tag_name->data == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; @@ -2483,23 +2388,23 @@ myhtml_tree_temp_tag_name_t * myhtml_tree_temp_tag_name_destroy(myhtml_tree_temp return NULL; if(temp_tag_name->data) { - myhtml_free(temp_tag_name->data); + mycore_free(temp_tag_name->data); temp_tag_name->data = NULL; } if(self_destroy) { - myhtml_free(temp_tag_name); + mycore_free(temp_tag_name); return NULL; } return temp_tag_name; } -myhtml_status_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name) +mystatus_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name) { if(temp_tag_name->length >= temp_tag_name->size) { size_t nsize = temp_tag_name->size << 1; - char *tmp = (char *)myhtml_realloc(temp_tag_name->data, nsize * sizeof(char)); + char *tmp = (char *)mycore_realloc(temp_tag_name->data, nsize * sizeof(char)); if(tmp) { temp_tag_name->size = nsize; @@ -2515,14 +2420,14 @@ myhtml_status_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t return MyHTML_STATUS_OK; } -myhtml_status_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len) +mystatus_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len) { if(temp_tag_name->data == NULL || name_len == 0) return MyHTML_STATUS_OK; if((temp_tag_name->length + name_len) >= temp_tag_name->size) { size_t nsize = (temp_tag_name->size << 1) + name_len; - char *tmp = (char *)myhtml_realloc(temp_tag_name->data, nsize * sizeof(char)); + char *tmp = (char *)mycore_realloc(temp_tag_name->data, nsize * sizeof(char)); if(tmp) { temp_tag_name->size = nsize; @@ -2540,20 +2445,19 @@ myhtml_status_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* te void myhtml_tree_wait_for_last_done_token(myhtml_tree_t* tree, myhtml_token_node_t* token_for_wait) { -#ifndef MyHTML_BUILD_WITHOUT_THREADS +#ifndef MyCORE_BUILD_WITHOUT_THREADS - const struct timespec timeout = {0, 0}; - while(tree->token_last_done != token_for_wait) {myhtml_thread_nanosleep(&timeout);} + while(tree->token_last_done != token_for_wait) {mythread_nanosleep_sleep(tree->myhtml->thread_stream->timespec);} #endif } /* special tonek list */ -myhtml_status_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special) +mystatus_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special) { special->size = 1024; special->length = 0; - special->list = (myhtml_tree_special_token_t *)myhtml_malloc(special->size * sizeof(myhtml_tree_special_token_t)); + special->list = (myhtml_tree_special_token_t *)mycore_malloc(special->size * sizeof(myhtml_tree_special_token_t)); if(special->list == NULL) return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; @@ -2572,23 +2476,23 @@ myhtml_tree_special_token_list_t * myhtml_tree_special_list_destroy(myhtml_tree_ return NULL; if(special->list) { - myhtml_free(special->list); + mycore_free(special->list); special->list = NULL; } if(self_destroy) { - myhtml_free(special); + mycore_free(special); return NULL; } return special; } -myhtml_status_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns) +mystatus_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns) { if(special->length >= special->size) { size_t nsize = special->size << 1; - myhtml_tree_special_token_t *tmp = (myhtml_tree_special_token_t *)myhtml_realloc(special->list, nsize * sizeof(myhtml_tree_special_token_t)); + myhtml_tree_special_token_t *tmp = (myhtml_tree_special_token_t *)mycore_realloc(special->list, nsize * sizeof(myhtml_tree_special_token_t)); if(tmp) { special->size = nsize; @@ -2628,14 +2532,14 @@ myhtml_tree_special_token_t * myhtml_tree_special_list_get_last(myhtml_tree_spec } /* incoming buffer */ -myhtml_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree) +mycore_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree) { return tree->incoming_buf_first; } const char * myhtml_tree_incomming_buffer_make_data(myhtml_tree_t *tree, size_t begin, size_t length) { - myhtml_incoming_buffer_t *buffer = myhtml_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); + mycore_incoming_buffer_t *buffer = mycore_incoming_buffer_find_by_position(tree->incoming_buf_first, begin); size_t relative_begin = begin - buffer->offset; if((relative_begin + length) <= buffer->size) { diff --git a/source/myhtml/tree.h b/source/myhtml/tree.h index 1e126f6..c3299de 100644 --- a/source/myhtml/tree.h +++ b/source/myhtml/tree.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2016 Alexander Borisov + Copyright (C) 2015-2017 Alexander Borisov This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -31,10 +31,11 @@ extern "C" { #include "myhtml/mystring.h" #include "myhtml/token.h" #include "myhtml/stream.h" -#include "myhtml/utils/mcsync.h" -#include "myhtml/utils/mchar_async.h" -#include "myhtml/utils/mcobject.h" -#include "myhtml/utils/mcobject_async.h" +#include "mycore/thread_queue.h" +#include "mycore/utils/mcsync.h" +#include "mycore/utils/mchar_async.h" +#include "mycore/utils/mcobject.h" +#include "mycore/utils/mcobject_async.h" #define myhtml_tree_get(tree, attr) tree->attr #define myhtml_tree_set(tree, attr) tree->attr @@ -164,7 +165,7 @@ struct myhtml_tree_temp_stream { size_t length; size_t size; - myhtml_encoding_result_t res; + myencoding_result_t res; struct myhtml_tree_temp_tag_name* current; }; @@ -185,6 +186,11 @@ struct myhtml_tree { size_t mcasync_rules_token_id; size_t mcasync_rules_attr_id; size_t mcasync_tree_id; + /* + * mchar_node_id + * for rules, or if single mode, + * or for main thread only after parsing + */ size_t mchar_node_id; myhtml_token_attr_t* attr_current; myhtml_tag_id_t tmp_tag_id; @@ -192,8 +198,8 @@ struct myhtml_tree { mythread_queue_node_t* current_qnode; mcobject_t* mcobject_incoming_buf; - myhtml_incoming_buffer_t* incoming_buf; - myhtml_incoming_buffer_t* incoming_buf_first; + mycore_incoming_buffer_t* incoming_buf; + mycore_incoming_buffer_t* incoming_buf_first; // ref for nodes myhtml_tree_node_t* document; @@ -227,10 +233,10 @@ struct myhtml_tree { volatile myhtml_tree_parse_flags_t parse_flags; bool foster_parenting; size_t global_offset; - myhtml_status_t tokenizer_status; + mystatus_t tokenizer_status; - myhtml_encoding_t encoding; - myhtml_encoding_t encoding_usereq; + myencoding_t encoding; + myencoding_t encoding_usereq; myhtml_tree_temp_tag_name_t temp_tag_name; /* callback */ @@ -249,7 +255,7 @@ struct myhtml_tree { // base myhtml_tree_t * myhtml_tree_create(void); -myhtml_status_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); +mystatus_t myhtml_tree_init(myhtml_tree_t* tree, myhtml_t* myhtml); void myhtml_tree_clean(myhtml_tree_t* tree); void myhtml_tree_clean_all(myhtml_tree_t* tree); myhtml_tree_t * myhtml_tree_destroy(myhtml_tree_t* tree); @@ -355,10 +361,6 @@ void myhtml_tree_node_clean(myhtml_tree_node_t* tree_node); void myhtml_tree_node_free(myhtml_tree_node_t* node); myhtml_tree_node_t * myhtml_tree_node_clone(myhtml_tree_node_t* node); -void myhtml_tree_print_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out); -void myhtml_tree_print_node_children(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc); -void myhtml_tree_print_by_node(myhtml_tree_t* tree, myhtml_tree_node_t* node, FILE* out, size_t inc); - void myhtml_tree_node_add_child(myhtml_tree_node_t* root, myhtml_tree_node_t* node); void myhtml_tree_node_insert_before(myhtml_tree_node_t* root, myhtml_tree_node_t* node); void myhtml_tree_node_insert_after(myhtml_tree_node_t* root, myhtml_tree_node_t* node); @@ -390,21 +392,21 @@ bool myhtml_tree_is_mathml_integration_point(myhtml_tree_t* tree, myhtml_tree_no bool myhtml_tree_is_html_integration_point(myhtml_tree_t* tree, myhtml_tree_node_t* node); // temp tag name -myhtml_status_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name); +mystatus_t myhtml_tree_temp_tag_name_init(myhtml_tree_temp_tag_name_t* temp_tag_name); void myhtml_tree_temp_tag_name_clean(myhtml_tree_temp_tag_name_t* temp_tag_name); myhtml_tree_temp_tag_name_t * myhtml_tree_temp_tag_name_destroy(myhtml_tree_temp_tag_name_t* temp_tag_name, bool self_destroy); -myhtml_status_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len); -myhtml_status_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name); +mystatus_t myhtml_tree_temp_tag_name_append(myhtml_tree_temp_tag_name_t* temp_tag_name, const char* name, size_t name_len); +mystatus_t myhtml_tree_temp_tag_name_append_one(myhtml_tree_temp_tag_name_t* temp_tag_name, const char name); /* special tonek list */ -myhtml_status_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special); -myhtml_status_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns); +mystatus_t myhtml_tree_special_list_init(myhtml_tree_special_token_list_t* special); +mystatus_t myhtml_tree_special_list_append(myhtml_tree_special_token_list_t* special, myhtml_token_node_t *token, myhtml_namespace_t ns); size_t myhtml_tree_special_list_length(myhtml_tree_special_token_list_t* special); myhtml_tree_special_token_t * myhtml_tree_special_list_get_last(myhtml_tree_special_token_list_t* special); size_t myhtml_tree_special_list_pop(myhtml_tree_special_token_list_t* special); /* incoming buffer */ -myhtml_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); +mycore_incoming_buffer_t * myhtml_tree_incoming_buffer_first(myhtml_tree_t *tree); const char * myhtml_tree_incomming_buffer_make_data(myhtml_tree_t *tree, size_t begin, size_t length); #ifdef __cplusplus diff --git a/source/myhtml/utils.c b/source/myhtml/utils.c deleted file mode 100644 index 52a99da..0000000 --- a/source/myhtml/utils.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils.h" - -static const unsigned char myhtml_utils_chars_map[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, - 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, - 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, - 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, - 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, - 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, - 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, - 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, - 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, - 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, - 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, - 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, - 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, - 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, - 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, - 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xff -}; - -size_t myhtml_strncasecmp(const char* str1, const char* str2, size_t size) -{ - if(str1 == NULL || str2 == NULL) { - if(str1 == str2) - return 0; - - return 1; - } - - const unsigned char *ustr1 = (const unsigned char *)str1; - const unsigned char *ustr2 = (const unsigned char *)str2; - - size_t i = 0; - while (i < size) { - if(myhtml_utils_chars_map[*ustr1] != myhtml_utils_chars_map[*ustr2]) - return (size - i); - - ustr1++; - ustr2++; - - i++; - } - - return 0; -} - -size_t myhtml_strcasecmp(const char* str1, const char* str2) -{ - if(str1 == NULL || str2 == NULL) { - if(str1 == str2) - return 0; - - return 1; - } - - const unsigned char *ustr1 = (const unsigned char *)str1; - const unsigned char *ustr2 = (const unsigned char *)str2; - - for (size_t i = 0;;) - { - if(myhtml_utils_chars_map[*ustr1] != myhtml_utils_chars_map[*ustr2]) - return (i + 1); - - if(*ustr1 == '\0') - return 0; - - ustr1++; - ustr2++; - - i++; - } -} - -size_t myhtml_strncmp(const char* str1, const char* str2, size_t size) -{ - if(str1 == NULL || str2 == NULL) { - if(str1 == str2) - return 0; - - return 1; - } - - const unsigned char *ustr1 = (const unsigned char *)str1; - const unsigned char *ustr2 = (const unsigned char *)str2; - - size_t i = 0; - while (i < size) { - if(*ustr1 != *ustr2) - return (size - i); - - ustr1++; - ustr2++; - - i++; - } - - return 0; -} - -size_t myhtml_strcmp(const char* str1, const char* str2) -{ - if(str1 == NULL || str2 == NULL) { - if(str1 == str2) - return 0; - - return 1; - } - - const unsigned char *ustr1 = (const unsigned char *)str1; - const unsigned char *ustr2 = (const unsigned char *)str2; - - for (size_t i = 0;;) - { - if(*ustr1 != *ustr2) - return (i + 1); - - if(*ustr1 == '\0') - return 0; - - ustr1++; - ustr2++; - - i++; - } -} - -size_t myhtml_strcmp_ws(const char* str1, const char* str2) -{ - if(str1 == NULL || str2 == NULL) { - if(str1 == str2) - return 0; - - return 1; - } - - const unsigned char *ustr1 = (const unsigned char *)str1; - const unsigned char *ustr2 = (const unsigned char *)str2; - - for (size_t i = 0;;) - { - if(*ustr1 != *ustr2) - return (i + 1); - - if(myhtml_utils_whithspace(*ustr1, ==, ||) || *ustr1 == '\0') - return 0; - - ustr1++; - ustr2++; - - i++; - } -} - -bool myhtml_ustrcasecmp_without_checks_by_secondary(const unsigned char* ustr1, const unsigned char* ustr2) -{ - while (*ustr1 != '\0') { - if(myhtml_utils_chars_map[*ustr1] != myhtml_utils_chars_map[*ustr2]) - return false; - - ustr1++; - ustr2++; - } - - return true; -} - - diff --git a/source/myhtml/utils.h b/source/myhtml/utils.h deleted file mode 100644 index bca879c..0000000 --- a/source/myhtml/utils.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_H -#define MyHTML_UTILS_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" - -#define myhtml_utils_whithspace(onechar, action, logic) \ - (onechar action ' ' logic \ - onechar action '\t' logic \ - onechar action '\n' logic \ - onechar action '\f' logic \ - onechar action '\r') - -size_t myhtml_strncasecmp(const char* str1, const char* str2, size_t size); -size_t myhtml_strcasecmp(const char* str1, const char* str2); -size_t myhtml_strncmp(const char* str1, const char* str2, size_t size); -size_t myhtml_strcmp(const char* str1, const char* str2); -size_t myhtml_strcmp_ws(const char* str1, const char* str2); -bool myhtml_ustrcasecmp_without_checks_by_secondary(const unsigned char* ustr1, const unsigned char* ustr2); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* utils_h */ diff --git a/source/myhtml/utils/avl_tree.c b/source/myhtml/utils/avl_tree.c deleted file mode 100644 index b8da055..0000000 --- a/source/myhtml/utils/avl_tree.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - Copyright (C) 2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/avl_tree.h" - -myhtml_utils_avl_tree_t * myhtml_utils_avl_tree_create(void) -{ - return (myhtml_utils_avl_tree_t*)myhtml_calloc(1, sizeof(myhtml_utils_avl_tree_t)); -} - -myhtml_status_t myhtml_utils_avl_tree_init(myhtml_utils_avl_tree_t* avl_tree) -{ - /* for raw declaration style */ - avl_tree->mc_nodes = mcobject_create(); - if(avl_tree->mc_nodes == NULL) - return MyHTML_STATUS_ERROR_MEMORY_ALLOCATION; - - myhtml_status_t myhtml_status = mcobject_init(avl_tree->mc_nodes, 256, sizeof(myhtml_utils_avl_tree_node_t)); - if(myhtml_status) - return MyHTML_STATUS_ERROR; - - return MyHTML_STATUS_OK; -} - -void myhtml_utils_avl_tree_clean(myhtml_utils_avl_tree_t* avl_tree) -{ - mcobject_clean(avl_tree->mc_nodes); -} - -myhtml_utils_avl_tree_t * myhtml_utils_avl_tree_destroy(myhtml_utils_avl_tree_t* avl_tree, bool self_destroy) -{ - if(avl_tree == NULL) - return NULL; - - mcobject_destroy(avl_tree->mc_nodes, true); - - if(self_destroy) { - myhtml_free(avl_tree); - return NULL; - } - - return avl_tree; -} - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_node_create_root(myhtml_utils_avl_tree_t* avl_tree, size_t type, void* value) -{ - myhtml_utils_avl_tree_node_t *node = mcobject_malloc(avl_tree->mc_nodes, NULL); - memset(node, 0, sizeof(myhtml_utils_avl_tree_node_t)); - - node->type = type; - node->value = value; - - return node; -} - -void myhtml_utils_avl_tree_node_clean(myhtml_utils_avl_tree_node_t* node) -{ - memset(node, 0, sizeof(myhtml_utils_avl_tree_node_t)); -} - -short myhtml_utils_avl_tree_node_height(myhtml_utils_avl_tree_node_t* node) -{ - return (node ? node->height : 0); -} - -short myhtml_utils_avl_tree_node_balance_factor(myhtml_utils_avl_tree_node_t* node) -{ - return (myhtml_utils_avl_tree_node_height(node->right) - myhtml_utils_avl_tree_node_height(node->left)); -} - -void myhtml_utils_avl_tree_node_set_height(myhtml_utils_avl_tree_node_t* node) -{ - short left_height = myhtml_utils_avl_tree_node_height(node->left); - short right_height = myhtml_utils_avl_tree_node_height(node->right); - - node->height = (left_height > right_height ? left_height : right_height) + 1; -} - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_node_rotate_right(myhtml_utils_avl_tree_node_t* pos) -{ - myhtml_utils_avl_tree_node_t* node = pos->left; - - node->parent = pos->parent; - - if(node->right) - node->right->parent = pos; - - pos->left = node->right; - pos->parent = node; - - node->right = pos; - - myhtml_utils_avl_tree_node_set_height(pos); - myhtml_utils_avl_tree_node_set_height(node); - - return node; -} - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_node_rotate_left(myhtml_utils_avl_tree_node_t* pos) -{ - myhtml_utils_avl_tree_node_t* node = pos->right; - - node->parent = pos->parent; - - if(node->left) - node->left->parent = pos; - - pos->right = node->left; - pos->parent = node; - - node->left = pos; - - myhtml_utils_avl_tree_node_set_height(pos); - myhtml_utils_avl_tree_node_set_height(node); - - return node; -} - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_node_balance(myhtml_utils_avl_tree_node_t* node, myhtml_utils_avl_tree_node_t** root) -{ - /* set height */ - short left_height = myhtml_utils_avl_tree_node_height(node->left); - short right_height = myhtml_utils_avl_tree_node_height(node->right); - - node->height = (left_height > right_height ? left_height : right_height) + 1; - - /* check balance */ - switch ((right_height - left_height)) - { - case 2: { - if(myhtml_utils_avl_tree_node_balance_factor(node->right) < 0) - node->right = myhtml_utils_avl_tree_node_rotate_right(node->right); - - myhtml_utils_avl_tree_node_t* parent = node->parent; - - if(parent) { - if(parent->right == node) - return parent->right = myhtml_utils_avl_tree_node_rotate_left(node); - else - return parent->left = myhtml_utils_avl_tree_node_rotate_left(node); - } - - return myhtml_utils_avl_tree_node_rotate_left(node); - } - case -2: { - if(myhtml_utils_avl_tree_node_balance_factor(node->left) > 0) - node->left = myhtml_utils_avl_tree_node_rotate_left(node->left); - - myhtml_utils_avl_tree_node_t* parent = node->parent; - - if(parent) { - if(parent->right == node) - return parent->right = myhtml_utils_avl_tree_node_rotate_right(node); - else - return parent->left = myhtml_utils_avl_tree_node_rotate_right(node); - } - - return myhtml_utils_avl_tree_node_rotate_right(node); - } - default: - break; - } - - if(node->parent == NULL) - *root = node; - - return node->parent; -} - -void myhtml_utils_avl_tree_add(myhtml_utils_avl_tree_t* avl_tree, myhtml_utils_avl_tree_node_t** root, size_t type, void* value) -{ - if(*root == NULL) { - *root = myhtml_utils_avl_tree_node_create_root(avl_tree, type, value); - return; - } - - myhtml_utils_avl_tree_node_t* node = *root; - myhtml_utils_avl_tree_node_t* new_node = mcobject_malloc(avl_tree->mc_nodes, NULL); - myhtml_utils_avl_tree_node_clean(new_node); - - while(1) - { - if(type == node->type) { - node->value = value; - return; - } - else if(type < node->type) { - if(node->left == NULL) { - node->left = new_node; - - new_node->parent = node; - new_node->type = type; - new_node->value = value; - - node = new_node; - break; - } - - node = node->left; - } - else { - if(node->right == NULL) { - node->right = new_node; - - new_node->parent = node; - new_node->type = type; - new_node->value = value; - - node = new_node; - break; - } - - node = node->right; - } - } - - while(node) { - node = myhtml_utils_avl_tree_node_balance(node, root); - } -} - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_find_min(myhtml_utils_avl_tree_node_t* node) -{ - if(node == NULL) - return NULL; - - while(node->right) { - node = node->right; - } - - return node; -} - -void myhtml_utils_avl_tree_rotate_for_delete(myhtml_utils_avl_tree_node_t* delete_node, myhtml_utils_avl_tree_node_t* node, myhtml_utils_avl_tree_node_t** root) -{ - myhtml_utils_avl_tree_node_t* balance_node; - - if(node) { - if(delete_node->left == node) { - balance_node = node->left ? node->left : node; - - node->parent = delete_node->parent; - node->right = delete_node->right; - - if(delete_node->right) - delete_node->right->parent = node; - } - else { - balance_node = node; - - node->parent->right = NULL; - node->parent = delete_node->parent; - node->right = delete_node->right; - node->left = delete_node->left; - - if(delete_node->left) - delete_node->left->parent = node; - if(delete_node->right) - delete_node->right->parent = node; - } - - if(delete_node->parent) { - if(delete_node->parent->left == delete_node) { delete_node->parent->left = node; } - else { delete_node->parent->right = node; } - } - else { - *root = node; - } - } - else { - balance_node = delete_node->parent; - - if(delete_node->parent) { - if(delete_node->parent->left == delete_node) { delete_node->parent->left = delete_node->right; } - else { delete_node->parent->right = delete_node->right; } - } - else { - *root = delete_node->right; - } - } - - while(balance_node) { - balance_node = myhtml_utils_avl_tree_node_balance(balance_node, root); - } -} - -void * myhtml_utils_avl_tree_delete(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t** root, size_t type) -{ - myhtml_utils_avl_tree_node_t* node = *root; - - while(node) - { - if(type == node->type) { - myhtml_utils_avl_tree_rotate_for_delete(node, myhtml_utils_avl_tree_find_min(node->left), root); - - void *value = node->value; - mcobject_free(avl_tree->mc_nodes, node); - - return value; - } - else if(type < node->type) - node = node->left; - else - node = node->right; - } - - return NULL; -} - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_search_by_type(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t* node, size_t type) -{ - while(node) - { - if(type == node->type) - return node; - else if(type < node->type) - node = node->left; - else - node = node->right; - } - - return NULL; -} - -void myhtml_utils_avl_tree_list_all_nodes(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t* root, myhtml_utils_avl_tree_node_callback_f callback, void* ctx) -{ - if(root == NULL) - return; - - callback(root, ctx); - - myhtml_utils_avl_tree_list_all_nodes(avl_tree, root->left, callback, ctx); - myhtml_utils_avl_tree_list_all_nodes(avl_tree, root->right, callback, ctx); -} - - diff --git a/source/myhtml/utils/avl_tree.h b/source/myhtml/utils/avl_tree.h deleted file mode 100644 index f2c837e..0000000 --- a/source/myhtml/utils/avl_tree.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - Copyright (C) 2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_AVL_TREE_H -#define MyHTML_UTILS_AVL_TREE_H -#pragma once - -#include "myhtml/myosi.h" -#include "myhtml/utils/mcobject.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct myhtml_utils_avl_tree_node myhtml_utils_avl_tree_node_t; -typedef void (*myhtml_utils_avl_tree_node_callback_f)(myhtml_utils_avl_tree_node_t* avl_tree_node, void* ctx); - -struct myhtml_utils_avl_tree_node { - void *value; - size_t type; - - myhtml_utils_avl_tree_node_t* left; - myhtml_utils_avl_tree_node_t* right; - myhtml_utils_avl_tree_node_t* parent; - - short height; -}; - -struct myhtml_utils_avl_tree { - mcobject_t* mc_nodes; -} -typedef myhtml_utils_avl_tree_t; - -myhtml_utils_avl_tree_t * myhtml_utils_avl_tree_create(void); -myhtml_status_t myhtml_utils_avl_tree_init(myhtml_utils_avl_tree_t* avl_tree); -void myhtml_utils_avl_tree_clean(myhtml_utils_avl_tree_t* avl_tree); -myhtml_utils_avl_tree_t * myhtml_utils_avl_tree_destroy(myhtml_utils_avl_tree_t* avl_tree, bool self_destroy); - -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_node_create_root(myhtml_utils_avl_tree_t* avl_tree, size_t type, void* value); - -void myhtml_utils_avl_tree_add(myhtml_utils_avl_tree_t* avl_tree, myhtml_utils_avl_tree_node_t** root, size_t type, void* value); -void * myhtml_utils_avl_tree_delete(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t** root, size_t type); -myhtml_utils_avl_tree_node_t * myhtml_utils_avl_tree_search_by_type(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t* node, size_t type); - -void myhtml_utils_avl_tree_list_all_nodes(myhtml_utils_avl_tree_t *avl_tree, myhtml_utils_avl_tree_node_t* root, myhtml_utils_avl_tree_node_callback_f callback, void* ctx); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_UTILS_AVL_TREE_H */ diff --git a/source/myhtml/utils/mchar_async.c b/source/myhtml/utils/mchar_async.c deleted file mode 100644 index 37c8c57..0000000 --- a/source/myhtml/utils/mchar_async.c +++ /dev/null @@ -1,770 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/mchar_async.h" - -mchar_async_t * mchar_async_create(size_t pos_size, size_t size) -{ - mchar_async_t *mcobj_async = (mchar_async_t*)myhtml_calloc(1, sizeof(mchar_async_t)); - - mchar_async_init(mcobj_async, pos_size, size); - - return mcobj_async; -} - -void mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size) -{ - if(char_size < 4096) - char_size = 4096; - - mchar_async->origin_size = char_size; - - mchar_async->chunks_size = chunk_len; - mchar_async->chunks_pos_size = 1024; - mchar_async->chunks = (mchar_async_chunk_t**)myhtml_calloc(mchar_async->chunks_pos_size, sizeof(mchar_async_chunk_t*)); - mchar_async->chunks[0] = (mchar_async_chunk_t*)myhtml_calloc(mchar_async->chunks_size, sizeof(mchar_async_chunk_t)); - - mchar_async_cache_init(&mchar_async->chunk_cache); - - mchar_async->nodes_length = 0; - mchar_async->nodes_size = 64; - mchar_async->nodes = (mchar_async_node_t*)myhtml_calloc(mchar_async->nodes_size, sizeof(mchar_async_node_t)); - - mchar_async->nodes_cache_length = 0; - mchar_async->nodes_cache_size = mchar_async->nodes_size; - mchar_async->nodes_cache = (size_t*)myhtml_malloc(mchar_async->nodes_cache_size * sizeof(size_t)); - - mchar_async_clean(mchar_async); - - mchar_async->mcsync = mcsync_create(); -} - -void mchar_async_clean(mchar_async_t *mchar_async) -{ - mchar_async->chunks_length = 0; - mchar_async->chunks_pos_length = 1; - - mchar_async_cache_clean(&mchar_async->chunk_cache); - - for (size_t node_idx = 0; node_idx < mchar_async->nodes_length; node_idx++) - { - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - mchar_async_cache_clean(&node->cache); - - node->chunk = mchar_async_chunk_malloc(mchar_async, node, mchar_async->origin_size); - node->chunk->prev = 0; - } -} - -mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self) -{ - if(mchar_async == NULL) - return NULL; - - if(mchar_async->nodes) - { - for (size_t node_idx = 0; node_idx < mchar_async->nodes_length; node_idx++) - { - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - mchar_async_cache_destroy(&node->cache, false); - } - - myhtml_free(mchar_async->nodes); - mchar_async->nodes = NULL; - } - - if(mchar_async->nodes_cache) { - myhtml_free(mchar_async->nodes_cache); - } - - if(mchar_async->chunks) - { - for (size_t pos_idx = 0; pos_idx < mchar_async->chunks_pos_length; pos_idx++) { - if(mchar_async->chunks[pos_idx]) - { - for (size_t idx = 0; idx < mchar_async->chunks_size; idx++) { - if(mchar_async->chunks[pos_idx][idx].begin) - myhtml_free(mchar_async->chunks[pos_idx][idx].begin); - } - - myhtml_free(mchar_async->chunks[pos_idx]); - } - } - - myhtml_free(mchar_async->chunks); - mchar_async->chunks = NULL; - } - - mchar_async_cache_destroy(&mchar_async->chunk_cache, false); - - mchar_async->mcsync = mcsync_destroy(mchar_async->mcsync, 1); - - memset(mchar_async, 0, sizeof(mchar_async_t)); - - if(destroy_self) - myhtml_free(mchar_async); - else - return mchar_async; - - return NULL; -} - -void mchar_async_mem_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, mchar_async_chunk_t *chunk, size_t length) -{ - if(chunk == NULL) - return; - - if(chunk->begin) { - if(length > chunk->size) { - myhtml_free(chunk->begin); - - chunk->size = length + mchar_async->origin_size; - chunk->begin = (char*)myhtml_malloc(chunk->size * sizeof(char)); - } - } - else { - chunk->size = mchar_async->origin_size; - - if(length > chunk->size) - chunk->size = length; - - chunk->begin = (char*)myhtml_malloc(chunk->size * sizeof(char)); - } - - chunk->length = 0; -} - -mchar_async_chunk_t * mchar_async_chunk_malloc_without_lock(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length) -{ - if(mchar_async_cache_has_nodes(mchar_async->chunk_cache)) - { - size_t index = mchar_async_cache_delete(&mchar_async->chunk_cache, length); - - if(index) - return (mchar_async_chunk_t*)mchar_async->chunk_cache.nodes[index].value; - } - - if(mchar_async->chunks_length >= mchar_async->chunks_size) - { - size_t current_idx = mchar_async->chunks_pos_length; - mchar_async->chunks_pos_length++; - - if(mchar_async->chunks_pos_length >= mchar_async->chunks_pos_size) - { - mchar_async->chunks_pos_size <<= 1; - mchar_async_chunk_t **tmp_pos = myhtml_realloc(mchar_async->chunks, - sizeof(mchar_async_chunk_t*) * mchar_async->chunks_pos_size); - - if(tmp_pos) { - memset(&tmp_pos[mchar_async->chunks_pos_length], 0, (mchar_async->chunks_pos_size - mchar_async->chunks_pos_length) - * sizeof(mchar_async_chunk_t*)); - - mchar_async->chunks = tmp_pos; - } - } - - if(mchar_async->chunks[current_idx] == NULL) { - mchar_async_chunk_t *tmp = myhtml_calloc(mchar_async->chunks_size, sizeof(mchar_async_chunk_t)); - - if(tmp) - mchar_async->chunks[current_idx] = tmp; - } - - mchar_async->chunks_length = 0; - } - - mchar_async_chunk_t *chunk = &mchar_async->chunks[mchar_async->chunks_pos_length - 1][mchar_async->chunks_length]; - mchar_async->chunks_length++; - - mchar_async_mem_malloc(mchar_async, node, chunk, length); - - return chunk; -} - -mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length) -{ - mcsync_lock(mchar_async->mcsync); - mchar_async_chunk_t *chunk = mchar_async_chunk_malloc_without_lock(mchar_async, node, length); - mcsync_unlock(mchar_async->mcsync); - - return chunk; -} - -size_t mchar_async_node_add(mchar_async_t *mchar_async) -{ - mcsync_lock(mchar_async->mcsync); - - size_t node_idx; - - if(mchar_async->nodes_cache_length) { - mchar_async->nodes_cache_length--; - - node_idx = mchar_async->nodes_cache[ mchar_async->nodes_cache_length ]; - } - else { - if(mchar_async->nodes_length >= mchar_async->nodes_size) { - mcsync_unlock(mchar_async->mcsync); - return 0; - } - - node_idx = mchar_async->nodes_length; - mchar_async->nodes_length++; - } - - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - - mchar_async_cache_init(&node->cache); - - node->chunk = mchar_async_chunk_malloc_without_lock(mchar_async, node, mchar_async->origin_size); - - node->chunk->next = NULL; - node->chunk->prev = NULL; - - mcsync_unlock(mchar_async->mcsync); - - return node_idx; -} - -void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx) -{ - if(mchar_async->nodes_length <= node_idx) - return; - - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - - while (node->chunk->prev) - node->chunk = node->chunk->prev; - - node->chunk->length = 0; - mchar_async_cache_clean(&node->cache); -} - -void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx) -{ - mcsync_lock(mchar_async->mcsync); - - if(mchar_async->nodes_length <= node_idx) { - mcsync_unlock(mchar_async->mcsync); - return; - } - - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - mchar_async_chunk_t *chunk = node->chunk; - - while (chunk->next) - chunk = chunk->next; - - while (chunk) - { - mchar_async_cache_add(&mchar_async->chunk_cache, (void*)chunk, chunk->size); - chunk = chunk->prev; - } - - if(node->cache.nodes) - mchar_async_cache_destroy(&node->cache, false); - - memset(node, 0, sizeof(mchar_async_node_t)); - - if(mchar_async->nodes_cache_length >= mchar_async->nodes_cache_size) { - size_t new_size = mchar_async->nodes_cache_size << 1; - - size_t *tmp = (size_t*)myhtml_realloc(mchar_async->nodes_cache, sizeof(size_t) * mchar_async->nodes_cache_size); - - if(tmp) { - mchar_async->nodes_cache = tmp; - mchar_async->nodes_cache_size = new_size; - } - } - - mchar_async->nodes_cache[ mchar_async->nodes_cache_length ] = node_idx; - mchar_async->nodes_cache_length++; - - mcsync_unlock(mchar_async->mcsync); -} - -mchar_async_chunk_t * mchar_sync_chunk_find_by_size(mchar_async_node_t *node, size_t size) -{ - mchar_async_chunk_t *chunk = node->chunk->next; - - while (chunk) { - if(chunk->size >= size) - return chunk; - - chunk = chunk->next; - } - - return NULL; -} - -void mchar_sync_chunk_insert_after(mchar_async_chunk_t *base, mchar_async_chunk_t *chunk) -{ - if(base->next == chunk) - return; - - if(chunk->prev) - chunk->prev->next = chunk->next; - - if(chunk->next) - chunk->next->prev = chunk->prev; - - if(base->next) - base->next->prev = chunk; - - chunk->next = base->next; - chunk->prev = base; - - base->next = chunk; -} - -char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size) -{ - if(size == 0) - return NULL; - - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - mchar_async_chunk_t *chunk = node->chunk; - - if(mchar_async_cache_has_nodes(node->cache)) { - size_t index = mchar_async_cache_delete(&node->cache, size); - - if(index) { - return (char *)(node->cache.nodes[index].value); - } - } - - size_t new_size = chunk->length + size + sizeof(size_t); - - if(new_size > chunk->size) - { - if((chunk->length + sizeof(size_t)) < chunk->size) - { - size_t calc_size = (chunk->size - chunk->length) - sizeof(size_t); - - if(calc_size) { - char *tmp = &chunk->begin[(chunk->length + sizeof(size_t))]; - *(size_t*)(&chunk->begin[chunk->length]) = calc_size; - - chunk->length = chunk->size; - - mchar_async_cache_add(&node->cache, tmp, calc_size); - } - } - - chunk = mchar_sync_chunk_find_by_size(node, (size + sizeof(size_t))); - - if(chunk) - chunk->length = 0; - else { - if((size + sizeof(size_t)) > mchar_async->origin_size) - chunk = mchar_async_chunk_malloc(mchar_async, node, (size + sizeof(size_t) + mchar_async->origin_size)); - else - chunk = mchar_async_chunk_malloc(mchar_async, node, mchar_async->origin_size); - } - - mchar_sync_chunk_insert_after(node->chunk, chunk); - node->chunk = chunk; - } - - char *tmp = &chunk->begin[(chunk->length + sizeof(size_t))]; - *((size_t*)(&chunk->begin[chunk->length])) = size; - - chunk->length = chunk->length + size + sizeof(size_t); - - return tmp; -} - -char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size) -{ - if(data == NULL) - return NULL; - - size_t curr_size = *((size_t*)(data - sizeof(size_t))); - - if(curr_size >= new_size) - return data; - - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - - if(node->chunk->length >= curr_size && - &node->chunk->begin[ (node->chunk->length - curr_size) ] == data) - { - size_t next_size = (node->chunk->length - curr_size) + new_size; - - if(next_size <= node->chunk->size) { - /* it`s Magic */ - *((size_t*)(&node->chunk->begin[ ((node->chunk->length - curr_size) - sizeof(size_t)) ])) = new_size; - - node->chunk->length = next_size; - - return data; - } -// else { -// size_t re_size = next_size - node->chunk->length; -// -// /* a little Magic ;) */ -// *((size_t*)(&node->chunk->begin[ ((node->chunk->length - curr_size) - sizeof(size_t)) ])) = re_size; -// -// curr_size = re_size; -// } - } - - char *tmp = mchar_async_malloc(mchar_async, node_idx, new_size); - - if(tmp) { - memcpy(tmp, data, sizeof(char) * data_len); - - mchar_async_cache_add(&node->cache, data, curr_size); - } - - return tmp; -} - -char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len) -{ - if(data == NULL) - return NULL; - - size_t curr_size = *((size_t*)(data - sizeof(size_t))); - - char *tmp_old = data; - data = &data[crop_len]; - - *((size_t*)(data - sizeof(size_t))) = curr_size - crop_len; - - if((crop_len + 4) > sizeof(size_t)) { - crop_len = crop_len - sizeof(size_t); - *((size_t*)(tmp_old - sizeof(size_t))) = crop_len; - - mchar_async_node_t *node = &mchar_async->nodes[node_idx]; - mchar_async_cache_add(&node->cache, tmp_old, crop_len); - } - - return data; -} - -char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len) -{ - if(data == NULL) - return NULL; - - size_t curr_size = *((size_t*)(data - sizeof(size_t))); - data = &data[crop_len]; - - *((size_t*)(data - sizeof(size_t))) = curr_size - crop_len; - - return data; -} - -size_t mchar_async_get_size_by_data(const char *data) -{ - if(data == NULL) - return 0; - - return *((size_t*)(data - sizeof(size_t))); -} - -void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry) -{ - if(entry) - mchar_async_cache_add(&mchar_async->nodes[node_idx].cache, entry, *(size_t*)(entry - sizeof(size_t))); -} - -void mchar_async_cache_init(mchar_async_cache_t *cache) -{ - cache->count = 0; - cache->nodes_root = 0; - cache->nodes_length = 1; - cache->nodes_size = 1024; - cache->nodes = (mchar_async_cache_node_t*)myhtml_malloc(sizeof(mchar_async_cache_node_t) * cache->nodes_size); - - cache->nodes[0].left = 0; - cache->nodes[0].right = 0; - cache->nodes[0].size = 0; - cache->nodes[0].value = NULL; - - cache->index_length = 0; - cache->index_size = cache->nodes_size; - cache->index = (size_t*)myhtml_malloc(sizeof(size_t) * cache->index_size); -} - -void mchar_async_cache_clean(mchar_async_cache_t *cache) -{ - cache->count = 0; - cache->nodes_root = 0; - cache->nodes_length = 1; - cache->index_length = 0; - - if(cache->nodes) { - cache->nodes[0].left = 0; - cache->nodes[0].right = 0; - cache->nodes[0].size = 0; - cache->nodes[0].value = NULL; - } -} - -mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy) -{ - if(cache == NULL) - return NULL; - - if(cache->nodes) - myhtml_free(cache->nodes); - - if(cache->index) - myhtml_free(cache->index); - - if(self_destroy) { - myhtml_free(cache); - return NULL; - } - - return cache; -} - -size_t mchar_async_cache_malloc(mchar_async_cache_t *cache) -{ - if(cache->index_length) { - cache->index_length--; - return cache->index[cache->index_length]; - } - - cache->nodes_length++; - - if(cache->nodes_length >= cache->nodes_size) { - cache->nodes_size <<= 1; - - mchar_async_cache_node_t *tmp = (mchar_async_cache_node_t*)myhtml_realloc(cache->nodes, sizeof(mchar_async_cache_node_t) * cache->nodes_size); - - if(tmp) - cache->nodes = tmp; - } - - return cache->nodes_length - 1; -} - -size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size) -{ - mchar_async_cache_node_t *list = cache->nodes; - size_t idx = cache->nodes_root; - - while (idx) - { - if(size <= list[idx].size) - { - while( list[ list[idx].right ].size == size ) - idx = list[idx].right; - - size_t parent = list[idx].parent; - - if(parent) { - if(list[parent].left == idx) - { - if(list[idx].right) { - if(list[idx].left) { - size_t last_left = list[ list[idx].right ].left; - - while( list[last_left].left ) - last_left = list[last_left].left; - - if(last_left) { - list[last_left].left = list[idx].left; - list[ list[idx].left ].parent = last_left; - } - else { - list[ list[idx].right ].left = list[idx].left; - } - } - - list[parent].left = list[idx].right; - list[ list[idx].right ].parent = parent; - } - else { - list[parent].left = list[idx].left; - list[ list[idx].left ].parent = parent; - } - } - else { - if(list[idx].left) { - if(list[idx].right) { - size_t last_right = list[ list[idx].left ].right; - - while( list[last_right].right ) - last_right = list[last_right].right; - - if(last_right) { - list[last_right].right = list[idx].right; - list[ list[idx].right ].parent = last_right; - } - else { - list[ list[idx].left ].right = list[idx].right; - } - } - - list[parent].right = list[idx].left; - list[ list[idx].left ].parent = parent; - } - else { - list[parent].right = list[idx].right; - list[ list[idx].right ].parent = parent; - } - } - } - else { - if(list[idx].left) { - if(list[idx].right) { - size_t last_right = list[ list[idx].left ].right; - - while( list[last_right].right ) - last_right = list[last_right].right; - - if(last_right) { - list[last_right].right = list[idx].right; - list[ list[idx].right ].parent = last_right; - } - else { - list[ list[idx].left ].right = list[idx].right; - } - } - - cache->nodes_root = list[idx].left; - list[ list[idx].left ].parent = 0; - } - else { - cache->nodes_root = list[idx].right; - list[ list[idx].right ].parent = 0; - } - } - - cache->index[cache->index_length] = idx; - - cache->index_length++; - if(cache->index_length >= cache->index_size) - { - size_t new_size = cache->index_size << 1; - size_t *tmp = (size_t*)myhtml_realloc(cache->index, sizeof(size_t) * new_size); - - if(tmp) { - cache->index = tmp; - cache->index_size = new_size; - } - } - - cache->count--; - - return idx; - } - else { - idx = list[idx].right; - } - } - - return 0; -} - -void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size) -{ - cache->count++; - - if(cache->nodes_root == 0) { - mchar_async_cache_node_t *list = cache->nodes; - - cache->nodes_root = mchar_async_cache_malloc(cache); - - list[cache->nodes_root].parent = 0; - list[cache->nodes_root].left = 0; - list[cache->nodes_root].right = 0; - list[cache->nodes_root].size = size; - list[cache->nodes_root].value = value; - - return; - } - - size_t idx = cache->nodes_root; - size_t new_idx = mchar_async_cache_malloc(cache); - - mchar_async_cache_node_t *list = cache->nodes; - - while(idx) - { - if(size == list[idx].size) - { - if(list[idx].right) { - list[new_idx].right = list[idx].right; - list[ list[idx].right ].parent = new_idx; - } - else { - list[new_idx].right = 0; - } - - list[idx].right = new_idx; - - list[new_idx].parent = idx; - list[new_idx].left = 0; - list[new_idx].size = size; - list[new_idx].value = value; - - break; - } - else if(size < list[idx].size) - { - size_t parent = list[idx].parent; - - if(parent) { - if(list[parent].left == idx) - list[parent].left = new_idx; - else - list[parent].right = new_idx; - - list[new_idx].parent = parent; - } - else { - cache->nodes_root = new_idx; - list[new_idx].parent = 0; - } - - list[idx].parent = new_idx; - - list[new_idx].right = idx; - list[new_idx].left = 0; - list[new_idx].size = size; - list[new_idx].value = value; - - break; - } - else // size > list[idx].size - { - if(list[idx].right) - idx = list[idx].right; - else { - list[idx].right = new_idx; - - list[new_idx].right = 0; - list[new_idx].left = 0; - list[new_idx].parent = idx; - list[new_idx].size = size; - list[new_idx].value = value; - - break; - } - } - } -} - - diff --git a/source/myhtml/utils/mchar_async.h b/source/myhtml/utils/mchar_async.h deleted file mode 100644 index dcba9c5..0000000 --- a/source/myhtml/utils/mchar_async.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCHAR_ASYNC_H -#define MyHTML_UTILS_MCHAR_ASYNC_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" -#include "myhtml/utils/mcsync.h" - -#define mchar_async_cache_has_nodes(cache) cache.count - -typedef struct mchar_async_node mchar_async_node_t; - -struct mchar_async_cache_node { - void *value; - size_t size; - - size_t left; - size_t right; - size_t parent; -} -typedef mchar_async_cache_node_t; - -struct mchar_async_chunk { - char *begin; - size_t length; - size_t size; - - struct mchar_async_chunk *next; - struct mchar_async_chunk *prev; -} -typedef mchar_async_chunk_t; - -struct mchar_async_cache { - mchar_async_cache_node_t *nodes; - size_t nodes_size; - size_t nodes_length; - size_t nodes_root; - - size_t count; - - size_t *index; - size_t index_length; - size_t index_size; -} -typedef mchar_async_cache_t; - -struct mchar_async_node { - mchar_async_chunk_t *chunk; - mchar_async_cache_t cache; -}; - -struct mchar_async { - size_t origin_size; - - mchar_async_chunk_t **chunks; - size_t chunks_pos_size; - size_t chunks_pos_length; - size_t chunks_size; - size_t chunks_length; - - mchar_async_cache_t chunk_cache; - - mchar_async_node_t *nodes; - size_t nodes_length; - size_t nodes_size; - - size_t *nodes_cache; - size_t nodes_cache_length; - size_t nodes_cache_size; - - mcsync_t *mcsync; -} -typedef mchar_async_t; - - -mchar_async_t * mchar_async_create(size_t pos_size, size_t size); -void mchar_async_init(mchar_async_t *mchar_async, size_t chunk_len, size_t char_size); -void mchar_async_clean(mchar_async_t *mchar_async); -mchar_async_t * mchar_async_destroy(mchar_async_t *mchar_async, int destroy_self); - -char * mchar_async_malloc(mchar_async_t *mchar_async, size_t node_idx, size_t size); -char * mchar_async_realloc(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t data_len, size_t new_size); -void mchar_async_free(mchar_async_t *mchar_async, size_t node_idx, char *entry); - -size_t mchar_async_node_add(mchar_async_t *mchar_async); -void mchar_async_node_clean(mchar_async_t *mchar_async, size_t node_idx); -void mchar_async_node_delete(mchar_async_t *mchar_async, size_t node_idx); - -mchar_async_chunk_t * mchar_async_chunk_malloc(mchar_async_t *mchar_async, mchar_async_node_t *node, size_t length); -char * mchar_async_crop_first_chars(mchar_async_t *mchar_async, size_t node_idx, char *data, size_t crop_len); -char * mchar_async_crop_first_chars_without_cache(char *data, size_t crop_len); - -size_t mchar_async_get_size_by_data(const char *data); - -// cache -void mchar_async_cache_init(mchar_async_cache_t *cache); -mchar_async_cache_t * mchar_async_cache_destroy(mchar_async_cache_t *cache, bool self_destroy); -void mchar_async_cache_clean(mchar_async_cache_t *cache); - -void mchar_async_cache_add(mchar_async_cache_t *cache, void* value, size_t size); -size_t mchar_async_cache_delete(mchar_async_cache_t *cache, size_t size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* mchar_async_h */ - diff --git a/source/myhtml/utils/mcobject.c b/source/myhtml/utils/mcobject.c deleted file mode 100644 index 3353909..0000000 --- a/source/myhtml/utils/mcobject.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/mcobject.h" - -mcobject_t * mcobject_create(void) -{ - return myhtml_calloc(1, sizeof(mcobject_t)); -} - -myhtml_status_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size) -{ - mcobject->struct_size = struct_size; - mcobject->chunk_size = chunk_size; - - mcobject->chunk = NULL; - - mcobject->cache_length = 0; - mcobject->cache_size = chunk_size; - mcobject->cache = (void**)myhtml_malloc(sizeof(void*) * mcobject->cache_size); - - if(mcobject->cache == NULL) - return MyHTML_STATUS_MCOBJECT_ERROR_CACHE_CREATE; - - return MyHTML_STATUS_OK; -} - -void mcobject_clean(mcobject_t *mcobject) -{ - if(mcobject->chunk == NULL) - return; - - mcobject_chunk_t* chunk = mcobject->chunk; - - while(chunk->next) - chunk = chunk->next; - - while(chunk) { - mcobject_chunk_t* tmp = chunk->prev; - - if(chunk->begin) { - myhtml_free(chunk->begin); - } - - myhtml_free(chunk); - - chunk = tmp; - } - - mcobject->chunk = NULL; - mcobject->cache_length = 0; -} - -mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self) -{ - if(mcobject == NULL) - return NULL; - - mcobject_clean(mcobject); - - if(mcobject->cache) { - myhtml_free(mcobject->cache); - mcobject->cache = NULL; - } - - if(destroy_self) { - myhtml_free(mcobject); - return NULL; - } - - return mcobject; -} - -void mcobject_chunk_malloc(mcobject_t* mcobject, myhtml_status_t* status) -{ - if(status) - *status = MyHTML_STATUS_OK; - - mcobject_chunk_t* chunk; - - if(mcobject->chunk && mcobject->chunk->next) { - mcobject->chunk = mcobject->chunk->next; - - mcobject->chunk->length = 0; - - return; - } - else { - chunk = myhtml_calloc(1, sizeof(mcobject_chunk_t)); - - if(chunk == NULL) { - if(status) - *status = MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_CREATE; - - return; - } - - chunk->begin = myhtml_malloc(mcobject->struct_size * mcobject->chunk_size); - - if(chunk->begin == NULL) { - if(status) - *status = MyHTML_STATUS_MCOBJECT_ERROR_CHUNK_INIT; - - myhtml_free(chunk); - return; - } - - chunk->size = mcobject->chunk_size; - } - - if(mcobject->chunk == NULL) { - mcobject->chunk = chunk; - return; - } - - chunk->prev = mcobject->chunk; - mcobject->chunk->next = chunk; - - mcobject->chunk = chunk; -} - -void * mcobject_malloc(mcobject_t *mcobject, myhtml_status_t* status) -{ - if(mcobject->cache_length) { - if(status) - *status = MyHTML_STATUS_OK; - - mcobject->cache_length--; - return mcobject->cache[ mcobject->cache_length ]; - } - - mcobject_chunk_t* chunk = mcobject->chunk; - - if(chunk == NULL || chunk->length >= chunk->size) - { - myhtml_status_t ns_status; - mcobject_chunk_malloc(mcobject, &ns_status); - - if(ns_status) { - if(status) - *status = ns_status; - - return NULL; - } - - chunk = mcobject->chunk; - } - - if(status) - *status = MyHTML_STATUS_OK; - - chunk->length++; - return &chunk->begin[((chunk->length - 1) * mcobject->struct_size)]; -} - -myhtml_status_t mcobject_free(mcobject_t *mcobject, void *entry) -{ - if(mcobject->cache_length >= mcobject->cache_size) { - size_t new_size = mcobject->cache_size << 1; - - void **tmp = (void**)myhtml_realloc(mcobject->cache, sizeof(void*) * new_size); - - if(tmp) { - mcobject->cache = tmp; - mcobject->cache_size = new_size; - } - else - return MyHTML_STATUS_MCOBJECT_ERROR_CACHE_REALLOC; - } - - mcobject->cache[ mcobject->cache_length ] = entry; - mcobject->cache_length++; - - return MyHTML_STATUS_OK; -} - - diff --git a/source/myhtml/utils/mcobject.h b/source/myhtml/utils/mcobject.h deleted file mode 100644 index b68935b..0000000 --- a/source/myhtml/utils/mcobject.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCOBJECT_H -#define MyHTML_UTILS_MCOBJECT_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" - -struct mcobject_chunk { - unsigned char *begin; - size_t length; - size_t size; - - struct mcobject_chunk *next; - struct mcobject_chunk *prev; -} -typedef mcobject_chunk_t; - -struct mcobject { - mcobject_chunk_t *chunk; - - void **cache; - size_t cache_size; - size_t cache_length; - - size_t struct_size; - size_t chunk_size; -} -typedef mcobject_t; - - -mcobject_t * mcobject_create(void); -myhtml_status_t mcobject_init(mcobject_t *mcobject, size_t chunk_size, size_t struct_size); -void mcobject_clean(mcobject_t *mcobject); -mcobject_t * mcobject_destroy(mcobject_t *mcobject, bool destroy_self); - -void mcobject_chunk_malloc(mcobject_t* mcobject, myhtml_status_t* status); - -void * mcobject_malloc(mcobject_t *mcobject, myhtml_status_t* status); -myhtml_status_t mcobject_free(mcobject_t *mcobject, void *entry); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_UTILS_MCOBJECT_H */ - diff --git a/source/myhtml/utils/mcobject_async.c b/source/myhtml/utils/mcobject_async.c deleted file mode 100644 index 21e36e8..0000000 --- a/source/myhtml/utils/mcobject_async.c +++ /dev/null @@ -1,475 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/mcobject_async.h" - -mcobject_async_t * mcobject_async_create(void) -{ - return (mcobject_async_t*)myhtml_calloc(1, sizeof(mcobject_async_t)); -} - -mcobject_async_status_t mcobject_async_chunk_up(mcobject_async_t *mcobj_async) -{ - mcobj_async->chunks_length = 0; - - if(mcobj_async->chunks[ mcobj_async->chunks_pos_length ] == NULL) { - mcobj_async->chunks[ mcobj_async->chunks_pos_length ] = (mcobject_async_chunk_t*)myhtml_calloc(mcobj_async->chunks_size, sizeof(mcobject_async_chunk_t)); - - if(mcobj_async->chunks[ mcobj_async->chunks_pos_length ] == NULL) - return MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; - } - - return MCOBJECT_ASYNC_STATUS_OK; -} - -mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size) -{ - mcobj_async->origin_size = obj_size_by_one_chunk; - mcobj_async->struct_size = struct_size; - mcobj_async->struct_size_sn = struct_size + sizeof(size_t); - - mcobj_async->chunks_pos_length = 0; - mcobj_async->chunks_pos_size = 128; - mcobj_async->chunks_size = chunk_len; - mcobj_async->chunks = (mcobject_async_chunk_t**)myhtml_calloc(mcobj_async->chunks_pos_size, sizeof(mcobject_async_chunk_t*)); - - if(mcobj_async->chunks == NULL) - return MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; - - mcobject_async_chunk_up(mcobj_async); - - mcobj_async->chunk_cache_size = mcobj_async->chunks_size; - mcobj_async->chunk_cache = (mcobject_async_chunk_t**)myhtml_calloc(mcobj_async->chunk_cache_size, sizeof(mcobject_async_chunk_t*)); - - if(mcobj_async->chunk_cache == NULL) - return MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION; - - mcobj_async->nodes_length = 0; - mcobj_async->nodes_size = 64; - mcobj_async->nodes = (mcobject_async_node_t*)myhtml_calloc(mcobj_async->nodes_size, sizeof(mcobject_async_node_t)); - - if(mcobj_async->nodes == NULL) - return MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION; - - mcobj_async->nodes_cache_length = 0; - mcobj_async->nodes_cache_size = mcobj_async->nodes_size; - mcobj_async->nodes_cache = (size_t*)myhtml_malloc(mcobj_async->nodes_cache_size * sizeof(size_t)); - - if(mcobj_async->nodes_cache == NULL) - return MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION; - - mcobject_async_clean(mcobj_async); - - mcobj_async->mcsync = mcsync_create(); - - return MCOBJECT_ASYNC_STATUS_OK; -} - -void mcobject_async_clean(mcobject_async_t *mcobj_async) -{ - if(mcobj_async->chunks[0] != NULL) - mcobj_async->chunks_pos_length = 1; - else - mcobj_async->chunks_pos_length = 0; - - mcobj_async->chunks_length = 0; - mcobj_async->chunk_cache_length = 0; - - size_t node_idx; - for (node_idx = 0; node_idx < mcobj_async->nodes_length; node_idx++) - { - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - node->cache_length = 0; - - if(node->chunk) { - node->chunk = mcobject_async_chunk_malloc(mcobj_async, mcobj_async->origin_size, NULL); - } - } -} - -mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self) -{ - if(mcobj_async == NULL) - return NULL; - - if(mcobj_async->nodes) - { - for (size_t node_idx = 0; node_idx < mcobj_async->nodes_length; node_idx++) - { - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - - if(node->cache) - myhtml_free(node->cache); - } - - myhtml_free(mcobj_async->nodes); - } - - if(mcobj_async->nodes_cache) { - myhtml_free(mcobj_async->nodes_cache); - } - - if(mcobj_async->chunks) { - for (size_t pos_idx = 0; pos_idx < mcobj_async->chunks_pos_length; pos_idx++) { - if(mcobj_async->chunks[pos_idx]) - { - for (size_t idx = 0; idx < mcobj_async->chunks_size; idx++) { - if(mcobj_async->chunks[pos_idx][idx].begin) - myhtml_free(mcobj_async->chunks[pos_idx][idx].begin); - } - - myhtml_free(mcobj_async->chunks[pos_idx]); - } - } - - myhtml_free(mcobj_async->chunks); - } - - if(mcobj_async->chunk_cache) { - myhtml_free(mcobj_async->chunk_cache); - } - - mcobj_async->mcsync = mcsync_destroy(mcobj_async->mcsync, 1); - - memset(mcobj_async, 0, sizeof(mcobject_async_t)); - - if(destroy_self) - myhtml_free(mcobj_async); - else - return mcobj_async; - - return NULL; -} - -mcobject_async_status_t mcobject_async_mem_malloc(mcobject_async_t *mcobj_async, mcobject_async_chunk_t *chunk, size_t length) -{ - if(chunk->begin) { - if(length > chunk->size) { - myhtml_free(chunk->begin); - - chunk->size = length + mcobj_async->origin_size; - chunk->begin = (unsigned char*)myhtml_malloc(chunk->size * mcobj_async->struct_size_sn); - } - } - else { - chunk->size = mcobj_async->origin_size; - - if(length > chunk->size) - chunk->size += length; - - chunk->begin = (unsigned char*)myhtml_malloc(chunk->size * mcobj_async->struct_size_sn); - } - - chunk->length = 0; - - if(chunk->begin == NULL) - return MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; - - return MCOBJECT_ASYNC_STATUS_OK; -} - -mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status) -{ - if(status) - *status = MCOBJECT_ASYNC_STATUS_OK; - - if(mcobj_async->chunk_cache_length) - { - mcobj_async->chunk_cache_length--; - - mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]->length = 0; - mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]->next = NULL; - mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]->prev = NULL; - - return mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ]; - } - - if(mcobj_async->chunks_length >= mcobj_async->chunks_size) - { - if(mcobj_async->chunks_pos_length >= mcobj_async->chunks_pos_size) - { - size_t tmp_pos_size = mcobj_async->chunks_pos_size << 1; - mcobject_async_chunk_t **tmp_pos = myhtml_realloc(mcobj_async->chunks, - sizeof(mcobject_async_chunk_t*) * tmp_pos_size); - - if(tmp_pos) - { - memset(&tmp_pos[mcobj_async->chunks_pos_length], 0, (tmp_pos_size - mcobj_async->chunks_pos_length) - * sizeof(mcobject_async_chunk_t*)); - - mcobj_async->chunks_pos_size = tmp_pos_size; - mcobj_async->chunks = tmp_pos; - } - else { - if(status) - *status = MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; - - return NULL; - } - } - - if(mcobject_async_chunk_up(mcobj_async)) { - if(status) - *status = MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION; - - return NULL; - } - - mcobj_async->chunks_pos_length++; - } - - mcobject_async_chunk_t* chunk = &mcobj_async->chunks[mcobj_async->chunks_pos_length - 1][mcobj_async->chunks_length]; - mcobj_async->chunks_length++; - - chunk->next = NULL; - chunk->prev = NULL; - - if(status) - *status = mcobject_async_mem_malloc(mcobj_async, chunk, length); - else - mcobject_async_mem_malloc(mcobj_async, chunk, length); - - return chunk; -} - -mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status) -{ - mcsync_lock(mcobj_async->mcsync); - mcobject_async_chunk_t* chunk = mcobject_async_chunk_malloc_without_lock(mcobj_async, length, status); - mcsync_unlock(mcobj_async->mcsync); - - return chunk; -} - -size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status) -{ - mcsync_lock(mcobj_async->mcsync); - - if(status) - *status = MCOBJECT_ASYNC_STATUS_OK; - - size_t node_idx; - - if(mcobj_async->nodes_cache_length) { - mcobj_async->nodes_cache_length--; - - node_idx = mcobj_async->nodes_cache[ mcobj_async->nodes_cache_length ]; - } - else { - if(mcobj_async->nodes_length >= mcobj_async->nodes_size) { - mcsync_unlock(mcobj_async->mcsync); - return 0; - } - - node_idx = mcobj_async->nodes_length; - mcobj_async->nodes_length++; - } - - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - - node->chunk = mcobject_async_chunk_malloc_without_lock(mcobj_async, mcobj_async->origin_size, status); - - if(status && *status) { - mcsync_unlock(mcobj_async->mcsync); - return 0; - } - - node->chunk->next = NULL; - node->chunk->prev = NULL; - - node->cache_length = 0; - node->cache_size = mcobj_async->origin_size; - node->cache = (void**)myhtml_malloc(sizeof(void*) * node->cache_size); - - if(node->cache == NULL) { - if(status) - *status = MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION; - - mcsync_unlock(mcobj_async->mcsync); - return 0; - } - - mcsync_unlock(mcobj_async->mcsync); - - return node_idx; -} - -void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx) -{ - if(mcobj_async->nodes_length <= node_idx) - return; - - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - node->cache_length = 0; - - if(node->chunk == NULL) - return; - - while (node->chunk->prev) - node->chunk = node->chunk->prev; - - node->chunk->length = 0; - node->cache_length = 0; -} - -void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async) -{ - for (size_t node_idx = 0; node_idx < mcobj_async->nodes_length; node_idx++) { - mcobject_async_node_clean(mcobj_async, node_idx); - } -} - -void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx) -{ - mcsync_lock(mcobj_async->mcsync); - - if(mcobj_async->nodes_length <= node_idx) { - mcsync_unlock(mcobj_async->mcsync); - return; - } - - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - mcobject_async_chunk_t *chunk = node->chunk; - - while (chunk->next) - chunk = chunk->next; - - while (chunk) - { - if(mcobj_async->chunk_cache_length >= mcobj_async->chunk_cache_size) { - size_t new_size = mcobj_async->chunk_cache_size << 1; - - mcobject_async_chunk_t **tmp = (mcobject_async_chunk_t**)myhtml_realloc(mcobj_async->chunk_cache, - sizeof(mcobject_async_chunk_t*) * new_size); - - if(tmp) { - mcobj_async->chunk_cache_size = new_size; - mcobj_async->chunk_cache = tmp; - } - else { - // TODO: add return status - mcsync_unlock(mcobj_async->mcsync); - return; - } - } - - mcobj_async->chunk_cache[ mcobj_async->chunk_cache_length ] = chunk; - mcobj_async->chunk_cache_length++; - - chunk = chunk->prev; - } - - if(node->cache) - myhtml_free(node->cache); - - memset(node, 0, sizeof(mcobject_async_node_t)); - - if(mcobj_async->nodes_cache_length >= mcobj_async->nodes_cache_size) { - size_t new_size = mcobj_async->nodes_cache_size << 1; - - size_t *tmp = (size_t*)myhtml_realloc(mcobj_async->nodes_cache, sizeof(size_t) * mcobj_async->nodes_cache_size); - - if(tmp) { - mcobj_async->nodes_cache = tmp; - mcobj_async->nodes_cache_size = new_size; - } - } - - mcobj_async->nodes_cache[ mcobj_async->nodes_cache_length ] = node_idx; - mcobj_async->nodes_cache_length++; - - mcsync_unlock(mcobj_async->mcsync); -} - -void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status) -{ - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - - if(node->cache_length) { - if(status) - *status = MCOBJECT_ASYNC_STATUS_OK; - - node->cache_length--; - return node->cache[ node->cache_length ]; - } - - if(node->chunk->length >= node->chunk->size) - { - if(node->chunk->next) { - node->chunk = node->chunk->next; - node->chunk->length = 0; - } - else { - mcobject_async_status_t mystatus; - mcobject_async_chunk_t *chunk = mcobject_async_chunk_malloc(mcobj_async, mcobj_async->origin_size, &mystatus); - - if(mystatus) { - if(status) - *status = mystatus; - - return NULL; - } - - chunk->prev = node->chunk; - node->chunk->next = chunk; - - node->chunk = chunk; - } - } - - if(status) - *status = MCOBJECT_ASYNC_STATUS_OK; - - size_t offset = node->chunk->length * mcobj_async->struct_size_sn; - *((size_t*)(&node->chunk->begin[offset])) = node_idx; - - node->chunk->length++; - return &node->chunk->begin[(offset + sizeof(size_t))]; -} - -mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry) -{ - size_t node_idx = *((size_t*)((unsigned char*)entry - sizeof(size_t))); - - if(node_idx >= mcobj_async->nodes_length) - return MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID; - - mcobject_async_node_t *node = &mcobj_async->nodes[node_idx]; - - if(node->cache_length >= node->cache_size) { - size_t new_size = node->cache_size << 1; - - void **tmp = (void**)myhtml_realloc(node->cache, sizeof(void*) * new_size); - - if(tmp) { - node->cache = tmp; - node->cache_size = new_size; - } - else - return MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC; - } - - node->cache[ node->cache_length ] = entry; - node->cache_length++; - - return MCOBJECT_ASYNC_STATUS_OK; -} - - diff --git a/source/myhtml/utils/mcobject_async.h b/source/myhtml/utils/mcobject_async.h deleted file mode 100644 index 8ee1c78..0000000 --- a/source/myhtml/utils/mcobject_async.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCOBJECT_ASYNC_H -#define MyHTML_UTILS_MCOBJECT_ASYNC_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" -#include "myhtml/utils/mcsync.h" - -enum mcobject_async_status { - MCOBJECT_ASYNC_STATUS_OK = 0, - MCOBJECT_ASYNC_STATUS_ERROR_MEMORY_ALLOCATION = 1, - MCOBJECT_ASYNC_STATUS_CHUNK_ERROR_MEMORY_ALLOCATION = 2, - MCOBJECT_ASYNC_STATUS_CHUNK_CACHE_ERROR_MEMORY_ALLOCATION = 3, - MCOBJECT_ASYNC_STATUS_NODES_ERROR_MEMORY_ALLOCATION = 4, - MCOBJECT_ASYNC_STATUS_NODES_ERROR_BAD_NODE_ID = 5, - MCOBJECT_ASYNC_STATUS_CACHE_ERROR_MEMORY_REALLOC = 6 -} -typedef mcobject_async_status_t; - -struct mcobject_async_chunk { - unsigned char *begin; - size_t length; - size_t size; - - struct mcobject_async_chunk *next; - struct mcobject_async_chunk *prev; -} -typedef mcobject_async_chunk_t; - -struct mcobject_async_node { - mcobject_async_chunk_t *chunk; - - void **cache; - size_t cache_size; - size_t cache_length; -} -typedef mcobject_async_node_t; - -struct mcobject_async { - size_t origin_size; - size_t struct_size; - size_t struct_size_sn; - - mcobject_async_chunk_t **chunk_cache; - size_t chunk_cache_size; - size_t chunk_cache_length; - - mcobject_async_chunk_t **chunks; - size_t chunks_pos_size; - size_t chunks_pos_length; - size_t chunks_size; - size_t chunks_length; - - mcobject_async_node_t *nodes; - size_t nodes_length; - size_t nodes_size; - - size_t *nodes_cache; - size_t nodes_cache_length; - size_t nodes_cache_size; - - mcsync_t *mcsync; -} -typedef mcobject_async_t; - -mcobject_async_t * mcobject_async_create(void); -mcobject_async_status_t mcobject_async_init(mcobject_async_t *mcobj_async, size_t chunk_len, size_t obj_size_by_one_chunk, size_t struct_size); - -void mcobject_async_clean(mcobject_async_t *mcobj_async); -mcobject_async_t * mcobject_async_destroy(mcobject_async_t *mcobj_async, int destroy_self); - -size_t mcobject_async_node_add(mcobject_async_t *mcobj_async, mcobject_async_status_t *status); -void mcobject_async_node_clean(mcobject_async_t *mcobj_async, size_t node_idx); -void mcobject_async_node_all_clean(mcobject_async_t *mcobj_async); -void mcobject_async_node_delete(mcobject_async_t *mcobj_async, size_t node_idx); - -void * mcobject_async_malloc(mcobject_async_t *mcobj_async, size_t node_idx, mcobject_async_status_t *status); -mcobject_async_status_t mcobject_async_free(mcobject_async_t *mcobj_async, void *entry); - -mcobject_async_chunk_t * mcobject_async_chunk_malloc(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); -mcobject_async_chunk_t * mcobject_async_chunk_malloc_without_lock(mcobject_async_t *mcobj_async, size_t length, mcobject_async_status_t *status); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* mcobject_async_h */ - - - - diff --git a/source/myhtml/utils/mcsimple.c b/source/myhtml/utils/mcsimple.c deleted file mode 100644 index 8103b21..0000000 --- a/source/myhtml/utils/mcsimple.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) - */ - -#include "myhtml/utils/mcsimple.h" - -mcsimple_t * mcsimple_create(void) -{ - return myhtml_calloc(1, sizeof(mcsimple_t)); -} - -void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size) -{ - mcsimple->struct_size = struct_size; - - mcsimple->list_pos_length_used = 0; - mcsimple->list_pos_length = 0; - mcsimple->list_pos_size = pos_size; - mcsimple->list = (uint8_t**)myhtml_calloc(pos_size, sizeof(uint8_t*)); - - if(mcsimple->list == NULL) { - return; - } - - mcsimple->list_size = list_size * struct_size; - - if((mcsimple_init_list_entries(mcsimple, mcsimple->list_pos_length) == NULL)) { - return; - } -} - -void mcsimple_clean(mcsimple_t *mcsimple) -{ - mcsimple->list_length = 0; - mcsimple->list_pos_length = 0; -} - -mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self) -{ - if(mcsimple == NULL) - return NULL; - - if(mcsimple->list) { - for(size_t i = 0; i < mcsimple->list_pos_length_used; i++) { - if(mcsimple->list[i]) - free(mcsimple->list[i]); - } - - free(mcsimple->list); - } - - if(destroy_self) { - free(mcsimple); - return NULL; - } - - return mcsimple; -} - -uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos) -{ - if(mcsimple->list_pos_length >= mcsimple->list_pos_size) - { - size_t new_size = mcsimple->list_pos_size + 128; - uint8_t **list = (uint8_t**)myhtml_realloc(mcsimple->list, mcsimple->list_pos_size * sizeof(uint8_t*)); - - if(list) { - mcsimple->list = list; - memset(&mcsimple->list[pos], 0, (new_size - mcsimple->list_pos_size) * sizeof(uint8_t*)); - - mcsimple->list_pos_size = new_size; - } - else - return NULL; - } - - mcsimple->list_length = 0; - - if(mcsimple->list[pos] == NULL) { - mcsimple->list_pos_length_used++; - mcsimple->list[pos] = (uint8_t*)myhtml_malloc(mcsimple->list_size * sizeof(uint8_t)); - } - - return mcsimple->list[pos]; -} - -void * mcsimple_malloc(mcsimple_t *mcsimple) -{ - if(mcsimple->list_length >= mcsimple->list_size) - { - mcsimple->list_pos_length++; - if((mcsimple_init_list_entries(mcsimple, mcsimple->list_pos_length) == NULL)) { - return NULL; - } - } - - size_t current = mcsimple->list_length; - mcsimple->list_length += mcsimple->struct_size; - - return &mcsimple->list[mcsimple->list_pos_length][current]; -} - -void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos) -{ - pos *= mcsimple->struct_size; - return &mcsimple->list[ (pos / mcsimple->list_size) ][ (pos % mcsimple->list_size) ]; -} - - diff --git a/source/myhtml/utils/mcsimple.h b/source/myhtml/utils/mcsimple.h deleted file mode 100644 index be972d9..0000000 --- a/source/myhtml/utils/mcsimple.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCSIMPLE_H -#define MyHTML_UTILS_MCSIMPLE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" - -struct mcsimple { - size_t struct_size; - - uint8_t **list; - - size_t list_pos_size; - size_t list_pos_length; - size_t list_pos_length_used; - size_t list_size; - size_t list_length; -} -typedef mcsimple_t; - - -mcsimple_t * mcsimple_create(void); -void mcsimple_init(mcsimple_t *mcsimple, size_t pos_size, size_t list_size, size_t struct_size); -void mcsimple_clean(mcsimple_t *mcsimple); -mcsimple_t * mcsimple_destroy(mcsimple_t *mcsimple, bool destroy_self); - -uint8_t * mcsimple_init_list_entries(mcsimple_t *mcsimple, size_t pos); - -void * mcsimple_malloc(mcsimple_t *mcsimple); -void * mcsimple_get_by_absolute_position(mcsimple_t *mcsimple, size_t pos); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* MyHTML_UTILS_MCSIMPLE_H */ - diff --git a/source/myhtml/utils/mcsync.c b/source/myhtml/utils/mcsync.c deleted file mode 100644 index 58b263b..0000000 --- a/source/myhtml/utils/mcsync.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/mcsync.h" - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && ((defined(__GNUC__) && __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || \ - defined(__ATOMIC_SEQ_CST)) -#define MyHTML_FORCE_SPINLOCK -#endif - -#if defined(MyHTML_FORCE_SPINLOCK) -static int mcsync_atomic_compare_exchange(int* ptr, int compare, int exchange) -{ - return __atomic_compare_exchange_n(ptr, &compare, exchange, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); -} - -static void mcsync_atomic_store(int* ptr, int value) -{ - __atomic_store_n(ptr, 0, __ATOMIC_SEQ_CST); -} -#endif - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && defined(IS_OS_WINDOWS) -static int pthread_mutex_lock(pthread_mutex_t *mutex) -{ - EnterCriticalSection(mutex); - return 0; -} - -static int pthread_mutex_unlock(pthread_mutex_t *mutex) -{ - LeaveCriticalSection(mutex); - return 0; -} - -static int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr) -{ - (void)attr; - InitializeCriticalSection(mutex); - return 0; -} - -static int pthread_mutex_destroy(pthread_mutex_t *mutex) -{ - DeleteCriticalSection(mutex); - return 0; -} -#endif - -mcsync_t * mcsync_create(void) -{ - return calloc(1, sizeof(mcsync_t)); -} - -mcsync_status_t mcsync_init(mcsync_t* mcsync) -{ - mcsync_clean(mcsync); - return MCSYNC_STATUS_OK; -} - -mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self) -{ - if(mcsync == NULL) - return NULL; - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && !defined(MyHTML_FORCE_SPINLOCK) - if(mcsync->mutex) { - pthread_mutex_destroy(mcsync->mutex); - myhtml_free(mcsync->mutex); - } -#endif - - if(destroy_self) - myhtml_free(mcsync); - - return NULL; -} - -void mcsync_clean(mcsync_t* mcsync) -{ - mcsync->spinlock = 0; -} - -mcsync_status_t mcsync_lock(mcsync_t* mcsync) -{ -#if defined(MyHTML_FORCE_SPINLOCK) - while (!mcsync_atomic_compare_exchange(&mcsync->spinlock, 0, 1)) {} -#elif !defined(MyHTML_BUILD_WITHOUT_THREADS) - mcsync_mutex_lock(mcsync); -#endif - - return MCSYNC_STATUS_OK; -} - -mcsync_status_t mcsync_unlock(mcsync_t* mcsync) -{ -#if defined(MyHTML_FORCE_SPINLOCK) - mcsync_atomic_store(&mcsync->spinlock, 0); -#elif !defined(MyHTML_BUILD_WITHOUT_THREADS) - mcsync_mutex_unlock(mcsync); -#endif - - return MCSYNC_STATUS_OK; -} - -mcsync_status_t mcsync_mutex_lock(mcsync_t* mcsync) -{ -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && !defined(MyHTML_FORCE_SPINLOCK) - if(mcsync->mutex == NULL) { - mcsync->mutex = (pthread_mutex_t*)myhtml_malloc(sizeof(pthread_mutex_t)); - - if(mcsync->mutex == NULL) - return MCSYNC_STATUS_ERROR_MEM_ALLOCATE; - - pthread_mutex_init(mcsync->mutex, NULL); - } - - if(pthread_mutex_lock(mcsync->mutex) == 0) - return MCSYNC_STATUS_OK; - else - return MCSYNC_STATUS_NOT_OK; -#else - return MCSYNC_STATUS_NOT_OK; -#endif -} - -mcsync_status_t mcsync_mutex_unlock(mcsync_t* mcsync) -{ -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && !defined(MyHTML_FORCE_SPINLOCK) - if(pthread_mutex_unlock(mcsync->mutex) == 0) - return MCSYNC_STATUS_OK; - else - return MCSYNC_STATUS_NOT_OK; -#else - return MCSYNC_STATUS_NOT_OK; -#endif -} - diff --git a/source/myhtml/utils/mcsync.h b/source/myhtml/utils/mcsync.h deleted file mode 100644 index 671aa1a..0000000 --- a/source/myhtml/utils/mcsync.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCSYNC_H -#define MyHTML_UTILS_MCSYNC_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#include "myhtml/myosi.h" - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) -#if defined(IS_OS_WINDOWS) - typedef CRITICAL_SECTION pthread_mutex_t; - typedef unsigned long pthread_mutexattr_t; -#else -# include -#endif -#endif - -enum mcsync_status { - MCSYNC_STATUS_OK = 0, - MCSYNC_STATUS_NOT_OK = 1, - MCSYNC_STATUS_ERROR_MEM_ALLOCATE = 2 -} -typedef mcsync_status_t; - -struct mcsync { - int spinlock; -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) - pthread_mutex_t *mutex; -#endif -} -typedef mcsync_t; - -mcsync_t * mcsync_create(void); -mcsync_status_t mcsync_init(mcsync_t* mcsync); -void mcsync_clean(mcsync_t* mcsync); -mcsync_t * mcsync_destroy(mcsync_t* mcsync, int destroy_self); - -mcsync_status_t mcsync_lock(mcsync_t* mclock); -mcsync_status_t mcsync_unlock(mcsync_t* mclock); - -mcsync_status_t mcsync_mutex_lock(mcsync_t* mclock); -mcsync_status_t mcsync_mutex_unlock(mcsync_t* mclock); - -#if !defined(MyHTML_BUILD_WITHOUT_THREADS) && defined(IS_OS_WINDOWS) - static int pthread_mutex_lock(pthread_mutex_t *mutex); - static int pthread_mutex_unlock(pthread_mutex_t *mutex); - static int pthread_mutex_init(pthread_mutex_t *m, pthread_mutexattr_t *a); - static int pthread_mutex_destroy(pthread_mutex_t *m); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* mcsync_h */ diff --git a/source/myhtml/utils/mctree.c b/source/myhtml/utils/mctree.c deleted file mode 100644 index 526560c..0000000 --- a/source/myhtml/utils/mctree.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/resources.h" -#include "myhtml/utils/mctree.h" - - -mctree_t * mctree_create(size_t start_size) -{ - mctree_t* mctree = (mctree_t*)myhtml_malloc(sizeof(mctree_t)); - - mctree->nodes_size = start_size + 512; - mctree->nodes_length = start_size + 1; - mctree->nodes = (mctree_node_t*)myhtml_calloc(mctree->nodes_size, sizeof(mctree_node_t)); - - mctree->start_size = start_size; - - return mctree; -} - -void mctree_clean(mctree_t* mctree) -{ - mctree->nodes_length = mctree->start_size + 1; - memset(mctree->nodes, 0, sizeof(mctree_node_t) * mctree->nodes_size); -} - -mctree_t * mctree_destroy(mctree_t* mctree) -{ - if(mctree == NULL) - return NULL; - - if(mctree->nodes) - myhtml_free(mctree->nodes); - - myhtml_free(mctree); - - return NULL; -} - -mctree_index_t __mtree_search_lowercase_to_start(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size) -{ - mctree_node_t* nodes = mctree->nodes; - - while (idx) - { - if(key_size == nodes[idx].str_size) { - if(myhtml_strncasecmp(key, nodes[idx].str, key_size) == 0) { - return idx; - } - - idx = nodes[idx].child; - } - else if(key_size > nodes[idx].str_size) - { - if(key_size < nodes[ nodes[idx].next ].str_size) { - return 0; - } - - idx = nodes[idx].next; - } - else { - if(key_size > nodes[ nodes[idx].prev ].str_size) { - return 0; - } - - idx = nodes[idx].prev; - } - } - - return 0; -} - -mctree_index_t __mtree_search_to_start(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size) -{ - mctree_node_t* nodes = mctree->nodes; - - while (idx) - { - if(key_size == nodes[idx].str_size) { - if(memcmp((const void *)key, (const void *)(nodes[idx].str), key_size) == 0) { - return idx; - } - - idx = nodes[idx].child; - } - else if(key_size > nodes[idx].str_size) - { - if(key_size < nodes[ nodes[idx].next ].str_size) { - return 0; - } - - idx = nodes[idx].next; - } - else { - if(key_size > nodes[ nodes[idx].prev ].str_size) { - return 0; - } - - idx = nodes[idx].prev; - } - } - - return 0; -} - -mctree_index_t mctree_insert_child(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value) -{ - mctree_node_t* nodes = mctree->nodes; - mctree_index_t new_idx = mctree_node_get_free_id(mctree); - - nodes[idx].child = new_idx; - - nodes[new_idx].str = key; - nodes[new_idx].str_size = key_size; - nodes[new_idx].value = value; - - mctree_node_add(mctree); - - return new_idx; -} - -mctree_index_t mctree_insert_after(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value) -{ - mctree_node_t* nodes = mctree->nodes; - mctree_index_t new_idx = mctree_node_get_free_id(mctree); - - if(nodes[idx].next) { - nodes[ nodes[idx].next ].prev = new_idx; - nodes[new_idx].next = nodes[idx].next; - } - - nodes[idx].next = new_idx; - nodes[new_idx].prev = idx; - - nodes[new_idx].str = key; - nodes[new_idx].str_size = key_size; - nodes[new_idx].value = value; - - mctree_node_add(mctree); - - return new_idx; -} - -mctree_index_t mctree_insert_before(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value) -{ - mctree_node_t* nodes = mctree->nodes; - mctree_index_t new_idx = mctree_node_get_free_id(mctree); - - if(nodes[idx].prev) { - nodes[ nodes[idx].prev ].next = new_idx; - nodes[new_idx].prev = nodes[idx].prev; - } - - nodes[idx].prev = new_idx; - nodes[new_idx].next = idx; - - nodes[new_idx].str = key; - nodes[new_idx].str_size = key_size; - nodes[new_idx].value = value; - - mctree_node_add(mctree); - - return new_idx; -} - -mctree_index_t __mtree_insert_to_start(mctree_t* mctree, mctree_index_t idx, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert) -{ - mctree_node_t* nodes = mctree->nodes; - - while (idx) - { - if(key_size == nodes[idx].str_size) { - if(memcmp((const void *)key, (const void *)nodes[idx].str, key_size) == 0) - { - if(value) - nodes[idx].value = value; - - return idx; - } - - if(nodes[idx].child == 0) { - if(b_insert) - b_insert(key, key_size, &value); - - return mctree_insert_child(mctree, idx, key, key_size, value); - } - - idx = nodes[idx].child; - } - else if(key_size > nodes[idx].str_size) - { - if(nodes[idx].next == 0 || key_size < nodes[ nodes[idx].next ].str_size) { - if(b_insert) - b_insert(key, key_size, &value); - - return mctree_insert_after(mctree, idx, key, key_size, value); - } - - idx = nodes[idx].next; - } - else { - if(nodes[idx].prev == 0 || key_size > nodes[ nodes[idx].prev ].str_size) { - if(b_insert) - b_insert(key, key_size, &value); - - return mctree_insert_before(mctree, idx, key, key_size, value); - } - - idx = nodes[idx].prev; - } - } - - return 0; -} - -mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert) -{ - mctree_node_t* start = mctree->nodes; - - if(key_size > 0) { - mctree_index_t idx = mctree_make_first_idx(mctree, key, key_size); - - if(start[idx].child) { - return __mtree_insert_to_start(mctree, start[idx].child, key, key_size, value, b_insert); - } - else { - if(b_insert) - b_insert(key, key_size, &value); - - return mctree_insert_child(mctree, idx, key, key_size, value); - } - } - - return 0; -} - -mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size) -{ - mctree_node_t* start = mctree->nodes; - - if(key_size > 0) { - mctree_index_t idx = mctree_make_first_idx(mctree, key, key_size); - - if(start[idx].child) { - return __mtree_search_to_start(mctree, start[idx].child, key, key_size); - } - } - - return 0; -} - -mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size) -{ - mctree_node_t* start = mctree->nodes; - - if(key_size > 0) { - mctree_index_t idx = mctree_make_first_idx(mctree, key, key_size); - - if(start[idx].child) { - return __mtree_search_lowercase_to_start(mctree, start[idx].child, key, key_size); - } - } - - return 0; -} - - - diff --git a/source/myhtml/utils/mctree.h b/source/myhtml/utils/mctree.h deleted file mode 100644 index bd3054f..0000000 --- a/source/myhtml/utils/mctree.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_MCTREE_H -#define MyHTML_UTILS_MCTREE_H -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "myhtml/myosi.h" -#include "myhtml/utils.h" - -#include -#include -#include - -#define mctree_node_get_free_id(mctree) mctree->nodes_length - -#define mctree_node_clean(mctree, idx) \ - mctree->nodes[idx].str = NULL; \ - mctree->nodes[idx].value = NULL; \ - mctree->nodes[idx].child_count = 0; \ - mctree->nodes[idx].prev = 0; \ - mctree->nodes[idx].next = 0; \ - mctree->nodes[idx].child = 0 - -#define mctree_node_add(mctree) \ - mctree->nodes_length++; \ - if(mctree->nodes_length >= mctree->nodes_size) { \ - mctree->nodes_size = mctree->nodes_length + 4096; \ - mctree->nodes = (mctree_node_t*)myhtml_realloc(mctree->nodes, \ - sizeof(mctree_node_t) * mctree->nodes_size); \ - } \ - mctree_node_clean(mctree, mctree->nodes_length) - -#define mctree_make_first_idx(mctree, key, size) \ - ((myhtml_string_chars_lowercase_map[ (const unsigned char)(key[0]) ] + myhtml_string_chars_lowercase_map[ (const unsigned char)(key[size - 1]) ]) % mctree->start_size) + 1 - - -typedef size_t mctree_index_t; - -struct mctree_node { - const char* str; - size_t str_size; - void* value; - - size_t child_count; - mctree_index_t prev; - mctree_index_t next; - mctree_index_t child; -} -typedef mctree_node_t; - -struct mctree_tree { - mctree_node_t* nodes; - size_t nodes_length; - size_t nodes_size; - - size_t start_size; -} -typedef mctree_t; - -typedef void (*mctree_before_insert_f)(const char* key, size_t key_size, void **value); - - -mctree_t * mctree_create(size_t start_size); -void mctree_clean(mctree_t* mctree); -mctree_t * mctree_destroy(mctree_t* mctree); - -mctree_index_t mctree_insert(mctree_t* mctree, const char* key, size_t key_size, void* value, mctree_before_insert_f b_insert); -mctree_index_t mctree_search(mctree_t* mctree, const char* key, size_t key_size); -mctree_index_t mctree_search_lowercase(mctree_t* mctree, const char* key, size_t key_size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* defined(__mhtml__mtree__) */ diff --git a/source/myhtml/utils/mhash.c b/source/myhtml/utils/mhash.c deleted file mode 100644 index 1929f26..0000000 --- a/source/myhtml/utils/mhash.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - Copyright (C) 2017 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include "myhtml/utils/mhash.h" - -size_t myhtml_utils_mhash_hash(const char* key, size_t key_size, size_t table_size) -{ - size_t hash, i; - - for(hash = i = 0; i < key_size; i++) - { - hash += key[i]; - hash += (hash << 10); - hash ^= (hash >> 6); - } - - hash += (hash << 3); - hash ^= (hash >> 11); - hash += (hash << 15); - - return hash % table_size; -} - -myhtml_utils_mhash_t * myhtml_utils_mhash_create(void) -{ - return myhtml_calloc(1, sizeof(myhtml_utils_mhash_t)); -}; - -myhtml_status_t myhtml_utils_mhash_init(myhtml_utils_mhash_t* mhash, size_t table_size, size_t max_depth) -{ - mhash->mchar_obj = mchar_async_create(128, 4096); - if(mhash->mchar_obj == NULL) - return MyHTML_STATUS_ATTR_ERROR_ALLOCATION; - - mhash->mchar_node = mchar_async_node_add(mhash->mchar_obj); - - if(table_size < 128) - table_size = 128; - - mhash->table = myhtml_calloc(table_size, sizeof(myhtml_utils_mhash_entry_t*)); - if(mhash->table == NULL) - return MyHTML_STATUS_ATTR_ERROR_ALLOCATION; - - if(max_depth < 1) - max_depth = 1; - - mhash->table_max_depth = max_depth; - mhash->table_size = table_size; - - return MyHTML_STATUS_OK; -}; - -void myhtml_utils_mhash_clean(myhtml_utils_mhash_t* mhash) -{ - mchar_async_clean(mhash->mchar_obj); - memset(mhash->table, 0, (sizeof(myhtml_utils_mhash_entry_t*) * mhash->table_size)); -} - -myhtml_utils_mhash_t * myhtml_utils_mhash_destroy(myhtml_utils_mhash_t* mhash, bool self_destroy) -{ - if(mhash == NULL) - return NULL; - - if(mhash->table) { - myhtml_free(mhash->table); - mhash->table = NULL; - } - - if(self_destroy) { - myhtml_free(mhash->table); - return NULL; - } - - return mhash; -} - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_create_entry(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value) -{ - myhtml_utils_mhash_entry_t *entry = (myhtml_utils_mhash_entry_t*) - mchar_async_malloc(mhash->mchar_obj, mhash->mchar_node, sizeof(myhtml_utils_mhash_entry_t)); - - entry->key = mchar_async_malloc(mhash->mchar_obj, mhash->mchar_node, (sizeof(char) * key_size) + 1); - - if(entry->key == NULL) { - mchar_async_free(mhash->mchar_obj, mhash->mchar_node, (char*)entry); - return NULL; - } - - memcpy(entry->key, key, (sizeof(char) * key_size)); - entry->key[key_size] = '\0'; - - entry->key_length = key_size; - entry->value = value; - entry->next = NULL; - - return entry; -} - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_add_with_choice(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size) -{ - if(key == NULL || key_size == 0) - return NULL; - - size_t hash_id = myhtml_utils_mhash_hash(key, key_size, mhash->table_size); - - - myhtml_utils_mhash_entry_t *entry; - - if(mhash->table[hash_id] == NULL) { - /* rebuild table if need */ - if(mhash->table_length >= (mhash->table_size - (mhash->table_size / 4))) { - myhtml_utils_mhash_rebuld(mhash); - } - - mhash->table[hash_id] = myhtml_utils_mhash_create_entry(mhash, key, key_size, NULL); - return mhash->table[hash_id]; - } - - size_t depth = 0; - entry = mhash->table[hash_id]; - - do { - if(entry->key_length == key_size) { - if(strncmp(entry->key, key, key_size) == 0) - return entry; - } - - if(entry->next == NULL) { - entry->next = myhtml_utils_mhash_create_entry(mhash, key, key_size, NULL); - - if(depth > mhash->table_max_depth) { - myhtml_utils_mhash_entry_t *entry_new = entry->next; - myhtml_utils_mhash_rebuld(mhash); - - return entry_new; - } - - return entry->next; - } - - depth++; - entry = entry->next; - } - while(1); -} - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_add(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value) -{ - myhtml_utils_mhash_entry_t *entry = myhtml_utils_mhash_add_with_choice(mhash, key, key_size); - - if(entry) - entry->value = value; - - return entry; -} - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_search(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value) -{ - if(key == NULL || key_size == 0) - return NULL; - - size_t hash_id = myhtml_utils_mhash_hash(key, key_size, mhash->table_size); - - myhtml_utils_mhash_entry_t *entry = mhash->table[hash_id]; - - while(entry) { - if(entry->key_length == key_size) { - if(strncmp(entry->key, key, key_size) == 0) - return entry; - } - - entry = entry->next; - } - - return NULL; -} - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_entry_by_id(myhtml_utils_mhash_t* mhash, size_t id) -{ - if(mhash->table_size > id) - return mhash->table[id]; - - return NULL; -} - -size_t myhtml_utils_mhash_get_table_size(myhtml_utils_mhash_t* mhash) -{ - return mhash->table_size; -} - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_rebuild_add_entry(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, myhtml_utils_mhash_entry_t *ext_entry) -{ - if(key == NULL || key_size == 0) - return NULL; - - ext_entry->next = NULL; - - size_t hash_id = myhtml_utils_mhash_hash(key, key_size, mhash->table_size); - - if(mhash->table[hash_id] == NULL) { - mhash->table[hash_id] = ext_entry; - return ext_entry; - } - - myhtml_utils_mhash_entry_t *entry = mhash->table[hash_id]; - - do { - if(entry->next == NULL) { - entry->next = ext_entry; - break; - } - - entry = entry->next; - } - while(1); - - return ext_entry; -} - -myhtml_utils_mhash_entry_t ** myhtml_utils_mhash_rebuld(myhtml_utils_mhash_t* mhash) -{ - myhtml_utils_mhash_entry_t **table = mhash->table; - size_t size = mhash->table_size; - - mhash->table_size = mhash->table_size << 1; - mhash->table = myhtml_calloc(mhash->table_size, sizeof(myhtml_utils_mhash_entry_t*)); - - if(mhash->table == NULL) { - mhash->table = table; - mhash->table_size = size; - - return NULL; - } - - for(size_t i = 0; i < mhash->table_size; i++) { - myhtml_utils_mhash_entry_t *entry = table[i]; - - while(entry) { - myhtml_utils_mhash_rebuild_add_entry(mhash, entry->key, entry->key_length, entry); - - entry = entry->next; - } - } - - myhtml_free(table); - - return mhash->table; -} - - diff --git a/source/myhtml/utils/mhash.h b/source/myhtml/utils/mhash.h deleted file mode 100644 index c3c8aec..0000000 --- a/source/myhtml/utils/mhash.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright (C) 2017 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef html_mhash_h -#define html_mhash_h - -#include "myhtml/myosi.h" -#include "myhtml/utils/mchar_async.h" - -typedef struct myhtml_utils_mhash_entry myhtml_utils_mhash_entry_t; - -struct myhtml_utils_mhash_entry { - char* key; - size_t key_length; - - void *value; - - myhtml_utils_mhash_entry_t* next; -}; - -struct myhtml_utils_mhash { - mchar_async_t* mchar_obj; - size_t mchar_node; - - myhtml_utils_mhash_entry_t** table; - size_t table_size; - size_t table_length; - - size_t table_max_depth; -} -typedef myhtml_utils_mhash_t; - -myhtml_utils_mhash_t * myhtml_utils_mhash_create(void); -myhtml_status_t myhtml_utils_mhash_init(myhtml_utils_mhash_t* mhash, size_t table_size, size_t depth); -void myhtml_utils_mhash_clean(myhtml_utils_mhash_t* mhash); -myhtml_utils_mhash_t * myhtml_utils_mhash_destroy(myhtml_utils_mhash_t* mhash, bool self_destroy); -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_create_entry(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_add(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_search(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size, void* value); -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_add_with_choice(myhtml_utils_mhash_t* mhash, const char* key, size_t key_size); - -myhtml_utils_mhash_entry_t * myhtml_utils_mhash_entry_by_id(myhtml_utils_mhash_t* mhash, size_t id); -size_t myhtml_utils_mhash_get_table_size(myhtml_utils_mhash_t* mhash); - -myhtml_utils_mhash_entry_t ** myhtml_utils_mhash_rebuld(myhtml_utils_mhash_t* mhash); - -#endif diff --git a/source/myhtml/utils/resources.h b/source/myhtml/utils/resources.h deleted file mode 100644 index beee061..0000000 --- a/source/myhtml/utils/resources.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#ifndef MyHTML_UTILS_RESOURCES_H -#define MyHTML_UTILS_RESOURCES_H -#pragma once - -#include - -#define MyHTML_TOKENIZER_CHAR_OTHER '\000' -#define MyHTML_TOKENIZER_CHAR_A_Z_a_z '\001' -#define MyHTML_TOKENIZER_CHAR_WHITESPACE '\002' - -static const unsigned char myhtml_string_chars_num_map[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -static const unsigned char myhtml_string_chars_hex_map[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x0b, - 0x0c, 0x0d, 0x0e, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -static const unsigned char myhtml_string_chars_lowercase_map[] = { - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, - 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, - 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, - 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, - 0x3f, 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, - 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, - 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, - 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, - 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, - 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, - 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, - 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, - 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, - 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, - 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, - 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, - 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xff -}; - -static const size_t replacement_character[] = { - 65533, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 8364, 129, 8218, 402, 8222, 8230, 8224, - 8225, 710, 8240, 352, 8249, 338, 141, 381, 143, - 144, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, - 8482, 353, 8250, 339, 157, 382, 376 -}; - -static const size_t myhtml_string_alphanumeric_character[] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, - 0x06, 0x07, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, - 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, - 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, - 0x0e, 0x0f, 0x0a, 0x0b, 0x0c, 0x0d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -static const unsigned char myhtml_tokenizer_chars_map[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00 -}; - -static const unsigned char myhtml_string_hex_to_char_map[] = { - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00 -}; - -#endif /* MyHTML_UTILS_RESOURCES_H */ diff --git a/source/myport/posix/Makefile.mk b/source/myport/posix/Makefile.mk new file mode 100644 index 0000000..d1ff5f5 --- /dev/null +++ b/source/myport/posix/Makefile.mk @@ -0,0 +1,9 @@ +myport_dirs := mycore/. mycore/utils +myport_objs := $(call MODEST_UTILS_OBJS,$(call MyPORT_SELECTED_PORT),$(myport_dirs)) + +myport_all: $(myport_objs) + +myport_clean: + rm -f $(myport_objs) + +myport_clone: diff --git a/source/myport/posix/Rules.mk b/source/myport/posix/Rules.mk new file mode 100644 index 0000000..7684fb7 --- /dev/null +++ b/source/myport/posix/Rules.mk @@ -0,0 +1,27 @@ +#******************************* +# For unix and linux see POSIX rules in /Makefile.cfg +#******************* +#******************************* +# Darwin, Mac OS X +#******************* +ifeq ($(OS),Darwin) + MODEST_CLONE_SED_HEADER_COMMAND = find $(INCLUDE_DIR_API) -name "*.h" -exec sed -i '.bak' -E 's/^[ \t]*\#[ \t]*include[ \t]*"([^"]+)"/\#include <\1>/g' {} \; + + MODEST_CFLAGS += -fPIC + MODEST_CFLAGS += $(PROJECT_OPTIMIZATION_LEVEL) -Wno-unused-variable -Wno-unused-function -std=c99 + LIB_NAME_SUFFIX := .dylib + + MODEST_BUILD_SHARED_AFTER += ln -sf $(call MODEST_LIBRARY_NAME_WITH_VERSION) $(call MODEST_LIBRARY) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_SHARED_AFTER += ln -sf $(call MODEST_LIBRARY_NAME_WITH_VERSION) $(call MODEST_LIBRARY_WITH_VERSION_MAJOR) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_SHARED_AFTER += ln -sf $(call MODEST_LIBRARY_NAME_WITH_VERSION) $(call MODEST_LIBRARY_WITH_VERSION_MAJOR_MINOR) $(MODEST_UTILS_NEW_LINE) + + MODEST_BUILD_CLEAN_AFTER += rm -f $(call MODEST_LIBRARY) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_CLEAN_AFTER += rm -f $(call MODEST_LIBRARY_WITH_VERSION_MAJOR) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_CLEAN_AFTER += rm -f $(call MODEST_LIBRARY_WITH_VERSION_MAJOR_MINOR) $(MODEST_UTILS_NEW_LINE) + + # Need set + MODEST_BUILD_OS := $(OS) + # this name eq source/myport/ + MODEST_PORT_NAME := posix +endif +# end of Darwin, Mac OS X diff --git a/source/myport/posix/mycore/io.c b/source/myport/posix/mycore/io.c new file mode 100644 index 0000000..135f101 --- /dev/null +++ b/source/myport/posix/mycore/io.c @@ -0,0 +1,69 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" +#include + +/* FILE */ +FILE * mycore_fopen(const char *filename, const char *mode) +{ + return fopen(filename, mode); +} + +int mycore_fclose(FILE *stream) +{ + return fclose(stream); +} + +size_t mycore_fread(void *buffer, size_t size, size_t count, FILE *stream) +{ + return fread(buffer, size, count, stream); +} + +size_t mycore_fwrite(const void *buffer, size_t size, size_t count, FILE *stream) +{ + return fwrite(buffer, size, count, stream); +} + +int mycore_fflush(FILE *stream) +{ + return fflush(stream); +} + +int mycore_fseek(FILE* stream, long offset, int origin) +{ + return fseek(stream, offset, origin); +} + +long mycore_ftell(FILE* stream) +{ + return ftell(stream); +} + +int mycore_ferror(FILE *stream) +{ + return ferror(stream); +} + +/* setbuf */ +void mycore_setbuf(FILE *stream, char *buffer) +{ + setbuf(stream, buffer); +} diff --git a/source/myport/posix/mycore/memory.c b/source/myport/posix/mycore/memory.c new file mode 100644 index 0000000..4cfd1e0 --- /dev/null +++ b/source/myport/posix/mycore/memory.c @@ -0,0 +1,42 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" + +void * mycore_malloc(size_t size) +{ + return malloc(size); +} + +void * mycore_realloc(void* dst, size_t size) +{ + return realloc(dst, size); +} + +void * mycore_calloc(size_t num, size_t size) +{ + return calloc(num, size); +} + +void * mycore_free(void* dst) +{ + free(dst); + return NULL; +} diff --git a/source/myport/posix/mycore/perf.c b/source/myport/posix/mycore/perf.c new file mode 100644 index 0000000..eff7a5c --- /dev/null +++ b/source/myport/posix/mycore/perf.c @@ -0,0 +1,136 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Authors: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" +#include "mycore/perf.h" + +#ifdef MyCORE_WITH_PERF + +#if MODEST_BUILD_OS == Darwin || MODEST_BUILD_OS == FreeBSD +#include +#elif MODEST_BUILD_OS == Linux +#endif + +struct mycore_perf { + unsigned long long start; + unsigned long long end; + unsigned long long freq; +} +typedef mycore_perf_t; + +void * mycore_perf_create(void) +{ + mycore_perf_t *perf = mycore_calloc(1, sizeof(mycore_perf_t)); + if(perf == NULL) + return NULL; + + perf->freq = mycore_perf_frequency(); + + return perf; +} + +void mycore_perf_clean(void* perf) +{ + memset(perf, 0, sizeof(mycore_perf_t)); +} + +void mycore_perf_destroy(void* perf) +{ + if(perf) + mycore_free(perf); +} + +mycore_status_t myhtml_perf_begin(void* perf) +{ + ((mycore_perf_t*)(perf))->start = mycore_perf_clock(); + return MyCORE_STATUS_OK; +} + +mycore_status_t myhtml_perf_end(void* perf) +{ + ((mycore_perf_t*)(perf))->end = mycore_perf_clock(); + return MyCORE_STATUS_OK; +} + +double myhtml_perf_in_sec(void* perf) +{ + mycore_perf_t *obj_perf = (mycore_perf_t*)perf; + + if(obj_perf->freq) + return ((double)(obj_perf->end - obj_perf->start) / (double)obj_perf->freq); + + return 0.0f; +} + +unsigned long long mycore_perf_clock(void) +{ + unsigned long long x; + + __asm__ volatile ( + "cpuid\n\t" /* cpuid serializes any out-of-order prefetches before executing rdtsc (clobbers ebx, ecx, edx) */ + "rdtsc\n\t" + "shl $32, %%rdx\n\t" + "or %%rdx, %%rax" + : "=a" (x) + : + : "rdx", "ebx", "ecx"); + + return x; +} + +unsigned long long mycore_perf_frequency(void) +{ + unsigned long long freq = 0; + +#if MODEST_BUILD_OS == Darwin && defined(CTL_HW) && defined(HW_CPU_FREQ) + /* OSX kernel: sysctl(CTL_HW | HW_CPU_FREQ) */ + size_t len = sizeof(freq); + int mib[2] = {CTL_HW, HW_CPU_FREQ}; + + if(sysctl(mib, 2, &freq, &len, NULL, 0)) + return 0; + + return freq; + +#elif MODEST_BUILD_OS == Linux + /* Use procfs on linux */ + FILE* fp = fopen("/proc/cpuinfo", "r"); + if(fp == NULL) + return 0; + + /* Find 'CPU MHz :' */ + char buf[1024] = {0}; + double fval = 0.0; + while (fgets(buf, sizeof(buf), fp) != NULL) { + if (sscanf(buf, "cpu MHz : %lf\n", &fval) == 1) { + freq = (unsigned long long)(fval * 1000000ull); + break; + } + } + + fclose(fp); + return freq; + +#else + return freq; +#endif /* MODEST_BUILD_OS == Darwin || Linux */ +} + +#endif /* MyCORE_WITH_PERF */ diff --git a/source/myport/posix/mycore/thread.c b/source/myport/posix/mycore/thread.c new file mode 100644 index 0000000..c1bf95f --- /dev/null +++ b/source/myport/posix/mycore/thread.c @@ -0,0 +1,160 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/mythread.h" +#include "mycore/utils/mcsync.h" + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +#include + +/*********************************************************************************** + * + * For all unix system. POSIX pthread + * + ***********************************************************************************/ +void * mythread_thread_create(mythread_t *mythread, mythread_process_f process_func, void* ctx) +{ + void *thread = mycore_calloc(1, sizeof(pthread_t)); + + if(thread == NULL) + return NULL; + + if(pthread_create(&(*((pthread_t*)thread)), mythread->attr, process_func, ctx) == 0) + return thread; + + return NULL; +} + +mystatus_t mythread_thread_join(mythread_t *mythread, void* thread) +{ + if(pthread_join(*((pthread_t*)thread), NULL) == 0) + return MyCORE_STATUS_OK; + + return MyCORE_STATUS_ERROR; +} + +mystatus_t mythread_thread_cancel(mythread_t *mythread, void* thread) +{ + if(pthread_cancel(*((pthread_t*)thread)) == 0) + return MyCORE_STATUS_OK; + + return MyCORE_STATUS_ERROR; +} + +mystatus_t mythread_thread_destroy(mythread_t *mythread, void* thread) +{ + mycore_free(thread); + return MyCORE_STATUS_OK; +} + +void * mythread_thread_attr_init(mythread_t *mythread) +{ + pthread_attr_t *attr = (pthread_attr_t*)mycore_calloc(1, sizeof(pthread_attr_t)); + + if(attr == NULL) + return NULL; + + mythread->sys_last_error = pthread_attr_init(attr); + if(mythread->sys_last_error) { + mycore_free(attr); + return NULL; + } + + mythread->sys_last_error = pthread_attr_setdetachstate(attr, PTHREAD_CREATE_JOINABLE); + if(mythread->sys_last_error) { + mycore_free(attr); + return NULL; + } + + return attr; +} + +void mythread_thread_attr_clean(mythread_t *mythread, void* attr) +{ + /* some code */ +} + +void mythread_thread_attr_destroy(mythread_t *mythread, void* attr) +{ + if(attr == NULL) + return; + + mythread->sys_last_error = pthread_attr_destroy(attr); + mycore_free(attr); +} + +void * mythread_mutex_create(mythread_t *mythread) +{ + void *mutex = mcsync_mutex_create(); + if(mutex == NULL) + return NULL; + + if(mcsync_mutex_init(mutex)) { + mycore_free(mutex); + return NULL; + } + + return mutex; +} + +mystatus_t mythread_mutex_post(mythread_t *mythread, void* mutex) +{ + return mcsync_mutex_unlock(mutex); +} + +mystatus_t mythread_mutex_wait(mythread_t *mythread, void* mutex) +{ + return mcsync_mutex_lock(mutex); +} + +mystatus_t mythread_mutex_try_wait(mythread_t *mythread, void* mutex) +{ + return mcsync_mutex_try_lock(mutex); +} + +void mythread_mutex_close(mythread_t *mythread, void* mutex) +{ + mcsync_mutex_destroy(mutex); +} + +void * mythread_nanosleep_create(mythread_t* mythread) +{ + return mycore_calloc(1, sizeof(struct timespec)); +} + +void mythread_nanosleep_clean(void* timespec) +{ + memset(timespec, 0, sizeof(struct timespec)); +} + +void mythread_nanosleep_destroy(void* timespec) +{ + mycore_free(timespec); +} + +mystatus_t mythread_nanosleep_sleep(void* timespec) +{ + if(nanosleep(timespec, NULL) == 0) + return MyCORE_STATUS_OK; + + return MyCORE_STATUS_ERROR; +} + +#endif diff --git a/source/myport/posix/mycore/utils/mcsync.c b/source/myport/posix/mycore/utils/mcsync.c new file mode 100644 index 0000000..2e66790 --- /dev/null +++ b/source/myport/posix/mycore/utils/mcsync.c @@ -0,0 +1,149 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mcsync.h" + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +#include + +#if ((defined(__GNUC__) && __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) || defined(__ATOMIC_SEQ_CST)) +#define MyCORE_MCSYNC_SPINLOCK_PRESENT +#endif + +#ifdef MyCORE_MCSYNC_SPINLOCK_PRESENT +static mcsync_status_t mcsync_static_atomic_lock(void* spinlock) +{ + int compare = 0; + while (!__atomic_compare_exchange_n((int*)spinlock, &compare, 1, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {} + + return MCSYNC_STATUS_OK; +} + +static mcsync_status_t mcsync_static_atomic_unlock(void* spinlock) +{ + __atomic_store_n((int*)spinlock, 0, __ATOMIC_SEQ_CST); + + return MCSYNC_STATUS_OK; +} +#endif /* MyCORE_MCSYNC_SPINLOCK_PRESENT */ + +/* spinlock */ +void * mcsync_spin_create(void) +{ + return mycore_calloc(1, sizeof(int)); +} + +mcsync_status_t mcsync_spin_init(void* spinlock) +{ +#ifndef MyCORE_MCSYNC_SPINLOCK_PRESENT + return mcsync_mutex_init(spinlock); +#else + return MCSYNC_STATUS_OK; +#endif +} + +void mcsync_spin_clean(void* spinlock) +{ +#ifdef MyCORE_MCSYNC_SPINLOCK_PRESENT + *((int*)spinlock) = 0; +#endif +} + +void mcsync_spin_destroy(void* spinlock) +{ +#ifdef MyCORE_MCSYNC_SPINLOCK_PRESENT + mycore_free(spinlock); +#else + mcsync_mutex_destroy(spinlock); +#endif +} + +mcsync_status_t mcsync_spin_lock(void* spinlock) +{ +#ifdef MyCORE_MCSYNC_SPINLOCK_PRESENT + return mcsync_static_atomic_lock(spinlock); +#else + return mcsync_mutex_lock(spinlock); +#endif +} + +mcsync_status_t mcsync_spin_unlock(void* spinlock) +{ +#ifdef MyCORE_MCSYNC_SPINLOCK_PRESENT + return mcsync_static_atomic_unlock(spinlock); +#else + return mcsync_mutex_unlock(spinlock); +#endif +} + +/* mutex */ +void * mcsync_mutex_create(void) +{ + void *mutex = mycore_calloc(1, sizeof(pthread_mutex_t)); + if(mutex == NULL) + return NULL; + + return mutex; +} + +mcsync_status_t mcsync_mutex_init(void* mutex) +{ + if(pthread_mutex_init(mutex, NULL)) + return MCSYNC_STATUS_NOT_OK; + + return MCSYNC_STATUS_OK; +} + +void mcsync_mutex_clean(void* mutex) +{ + /* clean function */ +} + +void mcsync_mutex_destroy(void* mutex) +{ + pthread_mutex_destroy(mutex); + mycore_free(mutex); +} + +mcsync_status_t mcsync_mutex_lock(void* mutex) +{ + if(pthread_mutex_lock(mutex) == 0) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +mcsync_status_t mcsync_mutex_try_lock(void* mutex) +{ + if(pthread_mutex_trylock(mutex) == 0) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +mcsync_status_t mcsync_mutex_unlock(void* mutex) +{ + if(pthread_mutex_unlock(mutex) == 0) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +#endif diff --git a/source/myport/windows_nt/Makefile.mk b/source/myport/windows_nt/Makefile.mk new file mode 100644 index 0000000..d1ff5f5 --- /dev/null +++ b/source/myport/windows_nt/Makefile.mk @@ -0,0 +1,9 @@ +myport_dirs := mycore/. mycore/utils +myport_objs := $(call MODEST_UTILS_OBJS,$(call MyPORT_SELECTED_PORT),$(myport_dirs)) + +myport_all: $(myport_objs) + +myport_clean: + rm -f $(myport_objs) + +myport_clone: diff --git a/source/myport/windows_nt/Rules.mk b/source/myport/windows_nt/Rules.mk new file mode 100644 index 0000000..f802892 --- /dev/null +++ b/source/myport/windows_nt/Rules.mk @@ -0,0 +1,21 @@ +#******************************* +# Windows_NT +#******************* +ifeq ($(OS),Windows_NT) + LIB_NAME_SUFFIX := .dll + LIB_NAME_SUFFIX_STATIC := .dll.a + + MODEST_LIBRARY_NAME_WITH_VERSION := lib$(LIB_NAME)-$(PROJECT_VERSION_MAJOR)$(LIB_NAME_SUFFIX) + + MODEST_CFLAGS += -Wno-unused-variable -Wno-unused-function -std=c99 + MODEST_LDFLAGS += -Wl,--out-implib,$(call MODEST_LIBRARY_STATIC) + + MODEST_BUILD_SHARED_AFTER += cp $(call MODEST_LIBRARY_WITH_VERSION) $(BINARY_DIR_BASE) $(MODEST_UTILS_NEW_LINE) + MODEST_BUILD_CLEAN_AFTER += rm -f $(BINARY_DIR_BASE)/$(call MODEST_LIBRARY_NAME_WITH_VERSION) $(MODEST_UTILS_NEW_LINE) + + # Need set + MODEST_BUILD_OS := $(OS) + # this name eq source/myport/ + MODEST_PORT_NAME := windows_nt +endif +# end of Windows_NT diff --git a/source/myport/windows_nt/mycore/io.c b/source/myport/windows_nt/mycore/io.c new file mode 100644 index 0000000..b383cd4 --- /dev/null +++ b/source/myport/windows_nt/mycore/io.c @@ -0,0 +1,71 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" +#include + +/* FILE */ +FILE * mycore_fopen(const char* filename, const char* mode) +{ + return fopen(filename, mode); +} + +int mycore_fclose(FILE *stream) +{ + return fclose(stream); +} + +size_t mycore_fread(void *buffer, size_t size, size_t count, FILE* stream) +{ + return fread(buffer, size, count, stream); +} + +size_t mycore_fwrite(const void* buffer, size_t size, size_t count, FILE* stream) +{ + return fwrite(buffer, size, count, stream); +} + +int mycore_fflush(FILE *stream) +{ + return fflush(stream); +} + +int mycore_fseek(FILE* stream, long offset, int origin) +{ + return fseek(stream, offset, origin); +} + +long mycore_ftell(FILE* stream) +{ + return ftell(stream); +} + +int mycore_ferror(FILE *stream) +{ + return ferror(stream); +} + +/* setbuf */ +void mycore_setbuf(FILE* stream, char* buffer) +{ + setbuf(stream, buffer); +} + + diff --git a/source/myport/windows_nt/mycore/memory.c b/source/myport/windows_nt/mycore/memory.c new file mode 100644 index 0000000..4cfd1e0 --- /dev/null +++ b/source/myport/windows_nt/mycore/memory.c @@ -0,0 +1,42 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" + +void * mycore_malloc(size_t size) +{ + return malloc(size); +} + +void * mycore_realloc(void* dst, size_t size) +{ + return realloc(dst, size); +} + +void * mycore_calloc(size_t num, size_t size) +{ + return calloc(num, size); +} + +void * mycore_free(void* dst) +{ + free(dst); + return NULL; +} diff --git a/source/myport/windows_nt/mycore/perf.c b/source/myport/windows_nt/mycore/perf.c new file mode 100644 index 0000000..7caafdc --- /dev/null +++ b/source/myport/windows_nt/mycore/perf.c @@ -0,0 +1,92 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Authors: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/myosi.h" +#include "mycore/perf.h" + +#ifdef MyCORE_WITH_PERF +#include + +struct mycore_perf { + LARGE_INTEGER start; + LARGE_INTEGER end; + LARGE_INTEGER freq; +} +typedef mycore_perf_t; + +void * mycore_perf_create(void) +{ + mycore_perf_t *perf = mycore_calloc(1, sizeof(mycore_perf_t)); + if(perf == NULL) + return NULL; + + QueryPerformanceFrequency(&perf->freq); + + return perf; +} + +void mycore_perf_clean(void* perf) +{ + memset(perf, 0, sizeof(mycore_perf_t)); +} + +void mycore_perf_destroy(void* perf) +{ + if(perf) + mycore_free(perf); +} + +mycore_status_t myhtml_perf_begin(void* perf) +{ + QueryPerformanceCounter(&((mycore_perf_t*)(perf))->start); + return MyCORE_STATUS_OK; +} + +mycore_status_t myhtml_perf_end(void* perf) +{ + QueryPerformanceCounter(&((mycore_perf_t*)(perf))->end); + return MyCORE_STATUS_OK; +} + +double myhtml_perf_in_sec(void* perf) +{ + mycore_perf_t *obj_perf = (mycore_perf_t*)perf; + + if(obj_perf->freq.QuadPart) + return ((double)(obj_perf->end.QuadPart - obj_perf->start.QuadPart) / (double)obj_perf->freq.QuadPart); + + return 0.0f; +} + +unsigned long long mycore_perf_clock(void) +{ + LARGE_INTEGER x; + QueryPerformanceFrequency(&x); + return (unsigned long long)x.QuadPart; +} + +unsigned long long mycore_perf_frequency(void) +{ + LARGE_INTEGER x; + QueryPerformanceFrequency(&x); + return (unsigned long long)x.QuadPart; +} + +#endif /* MyCORE_WITH_PERF */ diff --git a/source/myport/windows_nt/mycore/thread.c b/source/myport/windows_nt/mycore/thread.c new file mode 100644 index 0000000..cf8a874 --- /dev/null +++ b/source/myport/windows_nt/mycore/thread.c @@ -0,0 +1,131 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/mythread.h" + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +#include + +/*********************************************************************************** + * + * For Windows + * + ***********************************************************************************/ +void * mythread_thread_create(mythread_t *mythread, mythread_process_f process_func, void* ctx) +{ + return CreateThread(NULL, // default security attributes + 0, // use default stack size + (LPTHREAD_START_ROUTINE)process_func, // thread function name + ctx, // argument to thread function + 0, // use default creation flags + NULL); // returns the thread identifier +} + +mystatus_t mythread_thread_join(mythread_t *mythread, void* thread) +{ + if(WaitForSingleObject(thread, INFINITE) == WAIT_OBJECT_0) + return MyCORE_STATUS_OK; + + return MyCORE_STATUS_ERROR; +} + +mystatus_t mythread_thread_cancel(mythread_t *mythread, void* thread) +{ + if(TerminateThread(thread, 0)) + return MyCORE_STATUS_OK; + + return MyCORE_STATUS_ERROR; +} + +mystatus_t mythread_thread_destroy(mythread_t *mythread, void* thread) +{ + if(TerminateThread(thread, 0)) + return MyCORE_STATUS_OK; + + return MyCORE_STATUS_ERROR; +} + +void * mythread_thread_attr_init(mythread_t *mythread) +{ + return (void*)0x01; +} + +void mythread_thread_attr_clean(mythread_t *mythread, void* attr) +{ +} + +void mythread_thread_attr_destroy(mythread_t *mythread, void* attr) +{ +} + +void * mythread_mutex_create(mythread_t *mythread) +{ + void *mutex = mcsync_mutex_create(); + if(mutex == NULL) + return NULL; + + if(mcsync_mutex_init(mutex)) { + mycore_free(mutex); + return NULL; + } + + return mutex; +} + +mystatus_t mythread_mutex_post(mythread_t *mythread, void* mutex) +{ + return mcsync_mutex_unlock(mutex); +} + +mystatus_t mythread_mutex_wait(mythread_t *mythread, void* mutex) +{ + return mcsync_mutex_lock(mutex); +} + +mystatus_t mythread_mutex_try_wait(mythread_t *mythread, void* mutex) +{ + return mcsync_mutex_try_lock(mutex); +} + +void mythread_mutex_close(mythread_t *mythread, void* mutex) +{ + mcsync_mutex_destroy(mutex); +} + +void * mythread_nanosleep_create(mythread_t* mythread) +{ + return (void*)0x01; +} + +void mythread_nanosleep_clean(void* timespec) +{ +} + +void mythread_nanosleep_destroy(void* timespec) +{ +} + +mystatus_t mythread_nanosleep_sleep(void* timespec) +{ + Sleep(0); + return MyCORE_STATUS_OK; +} + +#endif diff --git a/source/myport/windows_nt/mycore/utils/mcsync.c b/source/myport/windows_nt/mycore/utils/mcsync.c new file mode 100644 index 0000000..4062c75 --- /dev/null +++ b/source/myport/windows_nt/mycore/utils/mcsync.c @@ -0,0 +1,117 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "mycore/utils/mcsync.h" + +#ifndef MyCORE_BUILD_WITHOUT_THREADS +#include + +/* spinlock */ +void * mcsync_spin_create(void) +{ + CRITICAL_SECTION *spinlock = mycore_calloc(1, sizeof(CRITICAL_SECTION)); + if(spinlock == NULL) + return NULL; + + if(InitializeCriticalSectionAndSpinCount(spinlock, 0x00000400)) + return spinlock; + + return mycore_free(spinlock); +} + +mcsync_status_t mcsync_spin_init(void* spinlock) +{ + if(spinlock) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +void mcsync_spin_clean(void* spinlock) +{ +} + +void mcsync_spin_destroy(void* spinlock) +{ + DeleteCriticalSection(spinlock); + mycore_free(spinlock); +} + +mcsync_status_t mcsync_spin_lock(void* spinlock) +{ + EnterCriticalSection(spinlock); + return MCSYNC_STATUS_OK; +} + +mcsync_status_t mcsync_spin_unlock(void* spinlock) +{ + LeaveCriticalSection(spinlock); + return MCSYNC_STATUS_OK; +} + +/* mutex */ +void * mcsync_mutex_create(void) +{ + return CreateSemaphore(NULL, 1, 1, NULL); +} + +mcsync_status_t mcsync_mutex_init(void* mutex) +{ + if(mutex == NULL) + return MCSYNC_STATUS_NOT_OK; + + return MCSYNC_STATUS_OK; +} + +void mcsync_mutex_clean(void* mutex) +{ + /* clean function */ +} + +void mcsync_mutex_destroy(void* mutex) +{ + CloseHandle(mutex); +} + +mcsync_status_t mcsync_mutex_lock(void* mutex) +{ + if(WaitForSingleObject(mutex, INFINITE) == WAIT_OBJECT_0) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +mcsync_status_t mcsync_mutex_try_lock(void* mutex) +{ + if(WaitForSingleObject(mutex, 0) != WAIT_FAILED) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +mcsync_status_t mcsync_mutex_unlock(void* mutex) +{ + if(ReleaseSemaphore(mutex, 1, NULL)) + return MCSYNC_STATUS_OK; + + return MCSYNC_STATUS_NOT_OK; +} + +#endif diff --git a/source/myunicode/Makefile.mk b/source/myunicode/Makefile.mk new file mode 100644 index 0000000..e219cf0 --- /dev/null +++ b/source/myunicode/Makefile.mk @@ -0,0 +1,13 @@ +myunicode_dirs := . +myunicode_objs := $(call MODEST_UTILS_OBJS,myunicode,$(myunicode_dirs)) + +myunicode_description := unicode normalization, case work and other +myunicode_dependencies := mycore myport + +myunicode_all: $(myunicode_objs) + +myunicode_clean: + rm -f $(myunicode_objs) + +myunicode_clone: + $(call MODEST_UTILS_HDRS_CLONE,myunicode,$(myunicode_dirs)) diff --git a/source/myunicode/myosi.c b/source/myunicode/myosi.c new file mode 100644 index 0000000..104d2c3 --- /dev/null +++ b/source/myunicode/myosi.c @@ -0,0 +1,36 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myunicode/myosi.h" + +void * myunicode_callback_malloc(size_t size, void* ctx) +{ + return mycore_malloc(size); +} + +void * myunicode_callback_realloc(void* value, size_t size, void* ctx) +{ + return mycore_realloc(value, size); +} + +void * myunicode_callback_free(void* value, void* ctx) +{ + return mycore_free(value); +} diff --git a/source/myunicode/myosi.h b/source/myunicode/myosi.h new file mode 100644 index 0000000..fd25d26 --- /dev/null +++ b/source/myunicode/myosi.h @@ -0,0 +1,35 @@ +/* + Copyright (C) 2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyUNICODE_MYOSI_H +#define MyUNICODE_MYOSI_H +#pragma once + +#include "myhtml/myosi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyUNICODE_MYOSI_H */ diff --git a/source/myurl/Makefile.mk b/source/myurl/Makefile.mk new file mode 100644 index 0000000..079aa5e --- /dev/null +++ b/source/myurl/Makefile.mk @@ -0,0 +1,13 @@ +myurl_dirs := . +myurl_objs := $(call MODEST_UTILS_OBJS,myurl,$(myurl_dirs)) + +myurl_description := URL parser by https://url.spec.whatwg.org/ +myurl_dependencies := mycore myport + +myurl_all: $(myurl_objs) + +myurl_clean: + rm -f $(myurl_objs) + +myurl_clone: + $(call MODEST_UTILS_HDRS_CLONE,myurl,$(myurl_dirs)) diff --git a/source/myurl/host.c b/source/myurl/host.c new file mode 100644 index 0000000..7251187 --- /dev/null +++ b/source/myurl/host.c @@ -0,0 +1,631 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/host.h" +#include "myurl/url.h" +#include "myurl/resources.h" +#include "mycore/utils/resources.h" + +myurl_host_t * myurl_host_create(myurl_t* url) +{ + myurl_host_t *host = url->callback_malloc(sizeof(myurl_host_t), url->callback_ctx); + + if(host) + memset(host, 0, sizeof(myurl_host_t)); + + return host; +} + +mystatus_t myurl_host_init(myurl_t* url) +{ + return MyURL_STATUS_OK; +} + +void myurl_host_clean(myurl_t* url, myurl_host_t* host) +{ + if(host->type == MyURL_HOST_TYPE_DOMAIN) + url->callback_free(host->value.domain.value, url->callback_ctx); + + if(host->type == MyURL_HOST_TYPE_OPAQUE) + url->callback_free(host->value.opaque.value, url->callback_ctx); + + memset(host, 0, sizeof(myurl_host_t)); +} + +myurl_host_t * myurl_host_destroy(myurl_t* url, myurl_host_t* host, bool destroy_self) +{ + if(host == NULL) + return NULL; + + myurl_host_clean(url, host); + + if(destroy_self) { + return url->callback_free(host, url->callback_ctx); + } + + return host; +} + +mystatus_t myurl_host_copy(myurl_t* url, myurl_host_t* host_from, myurl_host_t* host_to) +{ + host_to->type = host_from->type; + + switch (host_from->type) { + case MyURL_HOST_TYPE_DOMAIN: + return myurl_utils_data_copy_set(url, host_from->value.domain.value, host_from->value.domain.length, + &host_to->value.domain.value, &host_to->value.domain.length); + + default: + break; + } + + return MyURL_STATUS_OK; +} + +/* Create Values */ +myurl_host_ipv_t * myurl_host_ipv6_entry_create(myurl_t* url) +{ + myurl_host_ipv_t *ipv = url->callback_malloc(sizeof(myurl_host_ipv_t), url->callback_ctx); + + if(ipv) + memset(ipv, 0, sizeof(myurl_host_ipv_t)); + + return ipv; +} + +/* Parsing */ +mystatus_t myurl_host_parser(myurl_t* url, myurl_host_t* host, const char* data, size_t data_size, bool is_special) +{ + size_t data_length = 0; + + /* 1 */ + if(data[data_length] == '[') { + if(data[ (data_size - 1) ] != ']') { + // parse error + return MyURL_STATUS_ERROR; + } + + data_length++; + + host->type = MyURL_HOST_TYPE_IPv6; + return myurl_host_ipv6_parser(&host->value.ipv, &data[data_length], (data_size - 2)); + } + + /* 2 */ + if(is_special == false) { + host->type = MyURL_HOST_TYPE_OPAQUE; + return myurl_host_opaque_host_parser(url, &host->value.opaque, data, data_size); + } + + /* 3 */ + char *domain = myurl_utils_data_copy(url, data, data_size); + size_t domain_size = myurl_utils_percent_decode_bytes_in_data(domain, data_size); + + /* 4 */ + char* ascii_domain; + size_t ascii_domain_size; + mystatus_t status = myurl_host_domain_to_ascii(url, &ascii_domain, &ascii_domain_size, domain, domain_size, + false, false, MyURL_HOST_IDNA_PROCESSING_OPTION_NONTRANSITIONAL); + /* 5 */ + if(status != MyURL_STATUS_OK) { + // parse error + return status; + } + + /* 6 */ + const unsigned char *u_ascii_domain = (const unsigned char*)ascii_domain; + data_length = 0; + + while(data_length < ascii_domain_size) { + if(myurl_resources_static_map_forbidden_host_code_point[ u_ascii_domain[data_length] ] != 0xff) { + // parse error + return MyURL_STATUS_ERROR; + } + + data_length++; + } + + /* 7 */ + bool failure; + if(myurl_host_ipv4_parser(&host->value.ipv, ascii_domain, ascii_domain_size, &failure) == MyURL_STATUS_OK) { + url->callback_free(ascii_domain, url->callback_ctx); + + host->type = MyURL_HOST_TYPE_IPv4; + return MyURL_STATUS_OK; + } + + if(failure) { + // parse error + url->callback_free(ascii_domain, url->callback_ctx); + return MyURL_STATUS_ERROR; + } + + host->type = MyURL_HOST_TYPE_DOMAIN; + host->value.domain.value = ascii_domain; + host->value.domain.length = ascii_domain_size; + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_host_domain_to_ascii(myurl_t* url, char** return_domain, size_t* return_domain_size, + char* domain, size_t domain_size, + bool UseSTD3ASCIIRules, bool VerifyDnsLength, + myurl_host_idna_processing_option_t opt) +{ + + + + *return_domain = domain; + *return_domain_size = domain_size; + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_host_opaque_host_parser(myurl_t* url, myurl_host_opaque_t* opaque, const char* data, size_t data_size) +{ + // TODO: see this + /* 1 */ + /* If input contains a forbidden host code point excluding "%", validation error, return failure. */ + size_t length = 0, offset = 0; + const unsigned char *u_data = (const unsigned char*)data; + + while(length < data_size) { + if(myurl_resources_static_map_forbidden_host_code_point[ u_data[length] ] != 0xff) { + offset = length; + + while(offset) { + offset--; + + if(data[offset] == '%') { + break; + } + } + + if(offset == 0 && data[offset] != '%') { + // parse error + return MyURL_STATUS_ERROR; + } + } + + length++; + } + + /* 2 */ + length = 0; + char *in_hex_val = myurl_utils_percent_encode(url, data, data_size, myurl_resources_static_map_C0, &length); + + if(in_hex_val == NULL) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 3 */ + opaque->value = in_hex_val; + opaque->length = length; + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_host_ipv4_number_parser(const char* data, size_t data_size, unsigned int* number, bool* validationErrorFlag) +{ + size_t length = 0; + + /* 1 */ + unsigned int r = 10; + + /* 2 */ + if(data_size > 1) { + if(*data == '0' && (data[1] == 'x' || data[1] == 'X')) { + /* 2.1 */ + *validationErrorFlag = true; + + /* 2.2 */ + length += 2; + + /* 2.3 */ + r = 16; + } + else if(*data == '0') { + /* 3.1 */ + *validationErrorFlag = true; + + /* 3.2 */ + length++; + + /* 3.3 */ + r = 8; + } + } + + *number = 0; + + if(r == 10) { + while(length < data_size) { + if(mycore_string_chars_num_map[ (unsigned char)data[length] ] == 0xff) { + return MyURL_STATUS_ERROR; + } + + *number = mycore_string_chars_num_map[ (unsigned char)data[length] ] + *number * r; + + length++; + } + } + else if(r == 16) { + while(length < data_size) { + if(mycore_string_chars_hex_map[ (unsigned char)data[length] ] == 0xff) { + return MyURL_STATUS_ERROR; + } + + *number = mycore_string_chars_hex_map[ (unsigned char)data[length] ] + *number * r; + + length++; + } + } + else { + while(length < data_size) { + if((unsigned char)data[length] < 0x30 || (unsigned char)data[length] > 0x37) { + return MyURL_STATUS_ERROR; + } + + *number = mycore_string_chars_num_map[ (unsigned char)data[length] ] + *number * r; + + length++; + } + } + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_host_ipv4_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size, bool* failure) +{ + if(failure) + *failure = false; + + size_t data_length = 0; + memset(ipv, 0, sizeof(myurl_host_ipv_t)); + + /* 1 */ + bool validationErrorFlag = false; + + /* 2 */ + size_t part_begin = data_length; + size_t part_count = 0; + + while(data_length < data_size) + { + if(data[data_length] == '.') + { + /* 4 */ + if(part_count == 3) { + return MyURL_STATUS_ERROR; + } + + /* 6.1 */ + if((data_length - part_begin) == 0) { + return MyURL_STATUS_ERROR; + } + + if(myurl_host_ipv4_number_parser(&data[part_begin], (data_length - part_begin), &ipv->pieces[part_count], &validationErrorFlag)) { + return MyURL_STATUS_ERROR; + } + + part_begin = data_length + 1; + part_count++; + } + + data_length++; + } + + if(data_length - part_begin) { + if(myurl_host_ipv4_number_parser(&data[part_begin], (data_length - part_begin), &ipv->pieces[part_count], &validationErrorFlag)) { + return MyURL_STATUS_ERROR; + } + + part_count++; + } + + if(part_count == 0) { + return MyURL_STATUS_ERROR; + } + + /* 7 */ +// if(validationErrorFlag) { +// // parse error +// } + + /* 8 */ + for(size_t i = 0; i < part_count; i++) { + if(ipv->pieces[i] > 255) { + // parse error + + /* if not last */ + if(i != (part_count - 1)) { + if(failure) + *failure = true; + + return MyURL_STATUS_ERROR; + } + } + } + + /* 9 */ + if(ipv->pieces[(part_count - 1)] >= mycore_power(256, (5 - part_count))) { + if(failure) + *failure = true; + + return MyURL_STATUS_ERROR; + } + + /* 10 */ + part_count--; + unsigned int ipv4 = ipv->pieces[part_count]; + + /* calc end char count */ + for(size_t i = 0; i < part_count; i++) { + size_t n = mycore_power(256, (3 - i)); + ipv4 += ipv->pieces[i] * n; + } + + ipv->pieces[0] = ipv4; + ipv->type = MyURL_HOST_TYPE_IP_v4; + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_host_ipv6_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size) +{ + size_t data_length = 0; + const unsigned char *u_data = (const unsigned char*)data; + + /* 1 */ + memset(ipv, 0, sizeof(myurl_host_ipv_t)); + /* 2 */ + unsigned int *piece = ipv->pieces; + unsigned int *piece_pointer = ipv->pieces; + /* 3 */ + unsigned int *compress_pointer = NULL; + + ipv->type = MyURL_HOST_TYPE_IP_v6; + + /* 5 */ + if(data[data_length] == ':') { + data_length++; + + /* 5.1 */ + if(data_length >= data_size || data[data_length] != ':') { + return MyURL_STATUS_ERROR; + } + + /* 5.2 */ + data_length++; + + /* 5.3 */ + piece_pointer++; + piece = piece_pointer; + + compress_pointer = piece_pointer; + } + + /* 6 */ + while(data_length < data_size) + { + /* 6.1 */ + if(piece_pointer == &ipv->pieces[8]) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 6.2 */ + if(data[data_length] == ':') { + /* 6.2.1 */ + if(compress_pointer != NULL) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 6.2.2 */ + data_length++; + + piece_pointer++; + piece = piece_pointer; + + compress_pointer = piece_pointer; + continue; + } + + /* 6.3 and 6.4 */ + unsigned int num = 0; + size_t i = 0; + + while((i < 4) && (data_length < data_size)) { + if(mycore_string_chars_hex_map[ u_data[data_length] ] != 0xff) { + num <<= 4; + num |= mycore_string_chars_hex_map[ u_data[data_length] ]; + } + else + break; + + data_length++; + i++; + } + + /* 6.5 */ + if(data_length < data_size) + { + if(data[data_length] == '.') { + /* 6.5.1 */ + if(i == 0) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 6.5.2 */ + data_length -= i; + + /* 6.5.3 */ + if(myurl_host_ipv6_ipv4_parser(ipv, &data[data_length], (data_size - data_length), &piece_pointer)) { + return MyURL_STATUS_ERROR; + } + + break; + } + else if(data[data_length] == ':') { + /* 6.5.1 */ + data_length++; + + /* 6.5.2 */ + if(data_length >= data_size) { + // parse error + return MyURL_STATUS_ERROR; + } + } + else { + // parse error + return MyURL_STATUS_ERROR; + } + } + + /* 6.6 */ + *piece = num; + /* 6.7 */ + piece_pointer++; + piece = piece_pointer; + } + + /* 11 */ + /* 11.1 */ + if(compress_pointer) { + unsigned int swaps = (unsigned int)(piece_pointer - compress_pointer); + size_t i = 7; + + /* 11.2 and 11.3 */ + while(i && swaps > 0) { + unsigned int *tmp = compress_pointer + (swaps - 1); + unsigned int num = *tmp; + + *tmp = ipv->pieces[i]; + ipv->pieces[i] = num; + + swaps--; + i--; + } + + return MyURL_STATUS_OK; + } + + /* 12 */ + if(compress_pointer == NULL && piece_pointer != &ipv->pieces[8]) { + // parse error + return MyURL_STATUS_ERROR; + } + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_host_ipv6_ipv4_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size, unsigned int** piece_pointer) +{ + size_t data_length = 0; + const unsigned char *u_data = (const unsigned char*)data; + + /* 8 */ + if((*piece_pointer - ipv->pieces) > 6) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 9 */ + unsigned int numbersSeen = 0; + + /* 10 */ + while(data_length < data_size) + { + /* 10.1 */ + int value = -1; + + /* 10.2 */ + if(numbersSeen > 0) + { + if(data[data_length] != '.' || numbersSeen >= 4) { + // parse error + return MyURL_STATUS_ERROR; + } + + data_length++; + + if(data_length >= data_size) + return MyURL_STATUS_ERROR; + } + + /* 10.3 */ + if(mycore_string_chars_num_map[ u_data[data_length] ] == 0xff) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 10.4 */ + while(data_length < data_size && mycore_string_chars_num_map[ u_data[data_length] ] != 0xff) + { + /* 10.4.1 */ + unsigned int number = mycore_string_chars_num_map[ u_data[data_length] ]; + + /* 10.4.2 */ + if(value == -1) { + value = (int)number; + } + else if(value == 0) { + // parse error + return MyURL_STATUS_ERROR; + } + else { + value = value * 10 + number; + } + + /* 10.4.3 */ + if(value > 255) { + // parse error + return MyURL_STATUS_ERROR; + } + + /* 10.4.2 */ + data_length++; + } + + /* 10.5 */ + **piece_pointer = **piece_pointer * 0x100 + value; + + /* 10.6 */ + numbersSeen++; + + /* 10.7 */ // maybe: (numbersSeen % 2 == 0) ? + if(numbersSeen == 2 || numbersSeen == 4) { + (*piece_pointer)++; + } + + /* 10.8 */ + if(data_length >= data_size && numbersSeen != 4) { + // parse error + return MyURL_STATUS_ERROR; + } + } + + return MyURL_STATUS_OK; +} + + diff --git a/source/myurl/host.h b/source/myurl/host.h new file mode 100644 index 0000000..a648b5b --- /dev/null +++ b/source/myurl/host.h @@ -0,0 +1,105 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_HOST_H +#define MyURL_HOST_H +#pragma once + +#include "myurl/myosi.h" +#include "myhtml/mystring.h" + +#include "myurl/parser.h" +#include "myurl/utils.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum myurl_host_type { + MyURL_HOST_TYPE_UNDEF = 0x00, + MyURL_HOST_TYPE_DOMAIN = 0x01, + MyURL_HOST_TYPE_IPv4 = 0x02, + MyURL_HOST_TYPE_IPv6 = 0x03, + MyURL_HOST_TYPE_OPAQUE = 0x04, +} +typedef myurl_host_type_t; + +enum myurl_host_ipv_type { + MyURL_HOST_TYPE_IP_UNDEF = 0x00, + MyURL_HOST_TYPE_IP_v4 = 0x01, + MyURL_HOST_TYPE_IP_v6 = 0x02, +} +typedef myurl_host_ipv_type_t; + +enum myurl_host_idna_processing_option { + MyURL_HOST_IDNA_PROCESSING_OPTION_UNDEF = 0x00, + MyURL_HOST_IDNA_PROCESSING_OPTION_TRANSITIONAL = 0x01, + MyURL_HOST_IDNA_PROCESSING_OPTION_NONTRANSITIONAL = 0x02, +} +typedef myurl_host_idna_processing_option_t; + +struct myurl_host_ipv { + unsigned int pieces[9]; + myurl_host_ipv_type_t type; +} +typedef myurl_host_ipv_t; + +struct myurl_host_opaque { + char* value; + size_t length; +} +typedef myurl_host_opaque_t; + +struct myurl_host_domain { + char* value; + size_t length; +} +typedef myurl_host_domain_t; + +struct myurl_host { + union { + myurl_host_ipv_t ipv; + myurl_host_opaque_t opaque; + myurl_host_domain_t domain; + } value; + + myurl_host_type_t type; +} +typedef myurl_host_t; + +myurl_host_t * myurl_host_create(myurl_t* url); +mystatus_t myurl_host_init(myurl_t* url); +void myurl_host_clean(myurl_t* url, myurl_host_t* host); + +myurl_host_t * myurl_host_destroy(myurl_t* url, myurl_host_t* host, bool destroy_self); +mystatus_t myurl_host_copy(myurl_t* url, myurl_host_t* host_from, myurl_host_t* host_to); + +mystatus_t myurl_host_parser(myurl_t* url, myurl_host_t* host, const char* data, size_t data_size, bool is_special); +mystatus_t myurl_host_ipv4_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size, bool* failure); +mystatus_t myurl_host_ipv6_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size); +mystatus_t myurl_host_ipv6_ipv4_parser(myurl_host_ipv_t* ipv, const char* data, size_t data_size, unsigned int** piece_pointer); +mystatus_t myurl_host_opaque_host_parser(myurl_t* url, myurl_host_opaque_t* opaque, const char* data, size_t data_size); +mystatus_t myurl_host_domain_to_ascii(myurl_t* url, char** return_domain, size_t* return_domain_size, char* domain, size_t domain_size, bool UseSTD3ASCIIRules, bool VerifyDnsLength, myurl_host_idna_processing_option_t opt); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_HOST_H */ diff --git a/source/myurl/myosi.c b/source/myurl/myosi.c new file mode 100644 index 0000000..dc8bfee --- /dev/null +++ b/source/myurl/myosi.c @@ -0,0 +1,38 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/myosi.h" +#include "myurl/url.h" + +void * myurl_callback_malloc(size_t size, void* ctx) +{ + return mycore_malloc(size); +} + +void * myurl_callback_realloc(void* value, size_t size, void* ctx) +{ + return mycore_realloc(value, size); +} + +void * myurl_callback_free(void* value, void* ctx) +{ + mycore_free(value); + return NULL; +} diff --git a/source/myurl/myosi.h b/source/myurl/myosi.h new file mode 100644 index 0000000..ae51ee5 --- /dev/null +++ b/source/myurl/myosi.h @@ -0,0 +1,83 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_MYOSI_H +#define MyURL_MYOSI_H +#pragma once + +#include "myhtml/myosi.h" + +#define MyURL_VERSION_MAJOR 0 +#define MyURL_VERSION_MINOR 1 +#define MyURL_VERSION_PATCH 0 + +#define MyURL_VERSION_STRING MyCORE_STR(MyURL_VERSION_MAJOR) MyCORE_STR(.) MyCORE_STR(MyURL_VERSION_MINOR) MyCORE_STR(.) MyCORE_STR(MyURL_VERSION_PATCH) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct myhtml_url myurl_t; +typedef struct myurl_entry myurl_entry_t; + +typedef size_t (*myurl_state_f)(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +typedef void (*myurl_callback_serialization_func_f)(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); + +typedef void * (*myurl_callback_malloc_f)(size_t size, void *ctx); +typedef void * (*myurl_callback_realloc_f)(void* value, size_t size, void *ctx); +typedef void * (*myurl_callback_free_f)(void* value, void *ctx); + +enum myurl_flags { + MyURL_FLAGS_UNDEF = 0x00, + MyURL_FLAGS_AT = 0x01, + MyURL_FLAGS_BRACKET = 0x02, + MyURL_FLAGS_CANNOT_BE_BASE_URL = 0x04 +} +typedef myurl_flags_t; + +/* + See all senments of statuses in modest/myosi.h + for myurl 038888..0388ff; MyURL_STATUS_OK == 0x000000 +*/ +enum myurl_status { + MyURL_STATUS_OK = 0x000000, + MyURL_STATUS_ERROR = 0x038888, + MyURL_STATUS_ERROR_MEMORY_ALLOCATION = 0x038889, + MyURL_STATUS_FAILURE_SCHEME_START = 0x03888a, + MyURL_STATUS_FAILURE_SCHEME_STATE = 0x03888b, + MyURL_STATUS_FAILURE_NO_SCHEME_BASE_NULL_OR_NOT_HASH = 0x03888c, + MyURL_STATUS_FAILURE_AUTHORITY_HOST_AFTER_AUTH = 0x03888d, + MyURL_STATUS_FAILURE_UNEXPECTED_ENDING = 0x03888e, + MyURL_STATUS_FAILURE_BAD_HOSTNAME = 0x03888f, + MyURL_STATUS_FAILURE_BAD_PORT = 0x038890, + MyURL_STATUS_LAST_SEGMENT_ENTRY = 0x0388ff +} +typedef myurl_status_t; + +void * myurl_callback_malloc(size_t size, void* ctx); +void * myurl_callback_realloc(void* value, size_t size, void* ctx); +void * myurl_callback_free(void* value, void* ctx); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_MYOSI_H */ diff --git a/source/myurl/parser.c b/source/myurl/parser.c new file mode 100644 index 0000000..1ef80fc --- /dev/null +++ b/source/myurl/parser.c @@ -0,0 +1,1164 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/url.h" +#include "myurl/parser.h" +#include "myurl/resources.h" +#include "mycore/utils/resources.h" + +static size_t myurl_parser_skip_control_and_space_leading(const char* url, size_t url_size) +{ + size_t i; + const unsigned char *u_url = (const unsigned char*)url; + + for(i = 0; i < url_size; i++) { + /* control */ + if(u_url[i] > 0x1F && + /* space */ + u_url[i] != 0x20 && + /* tab */ + u_url[i] != 0x09 && + /* new line */ + u_url[i] != 0x0A && u_url[i] != 0x0D) + { + break; + } + } + + return i; +} + +static size_t myurl_parser_skip_control_and_space_trailing(const char* url, size_t url_size) +{ + size_t origin_size = url_size; + const unsigned char *u_url = (const unsigned char*)url; + + while(url_size) { + url_size--; + + if(u_url[url_size] > 0x1F && u_url[url_size] != 0x20) { + url_size++; + break; + } + } + + return (origin_size - url_size); +} + +static size_t myurl_parser_skip_newline_and_tab_set(unsigned char* u_data, size_t data_size) +{ + size_t offset = 0; + for(size_t i = 0; i < data_size; i++) + { + if(u_data[i] == 0x09 || u_data[i] == 0x0A) + { + u_data[(i - offset)] = u_data[ (i + 1) ]; + offset++; + } + else + u_data[(i - offset)] = u_data[i]; + } + + u_data[ (data_size - offset) ] = '\0'; + return (data_size - offset); +} + +static size_t myurl_parser_skip_newline_and_tab(myurl_t* url, const char* data, size_t data_size) +{ + const unsigned char *u_data = (const unsigned char*)data; + + for(size_t i = 0; i < data_size; i++) { + if(u_data[i] == 0x09 || u_data[i] == 0x0A) + { + url->copy = myurl_utils_data_copy(url, data, data_size); + + if(url->copy) + return (i + myurl_parser_skip_newline_and_tab_set((unsigned char*)(&url->copy[i]), (data_size - i))); + + return 0; + } + } + + return data_size; +} + +size_t myurl_parser_begin(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_size) +{ + // add check syntax violation + size_t data_length = myurl_parser_skip_control_and_space_leading(data, data_size); + data_size -= myurl_parser_skip_control_and_space_trailing(data, data_size); + + data_size = myurl_parser_skip_newline_and_tab(url, &data[data_length], data_size); + + url->state = myurl_parser_state_scheme_start; + + if(url->copy) { + data = url->copy; + data_length = 0; + } + + if(data_size == 0) { + if(data_length) + data_length = 0; + + /* parse end */ + myurl_state_f prev_state = myurl_parser_state_undef; + + while(data_length == data_size && url->state != prev_state) + { + prev_state = url->state; + data_length = url->state(url, url_entry, url_base, data, data_length, data_size); + } + + if(url->copy) { + url->callback_free(url->copy, url->callback_ctx); + } + + return data_length; + } + + while(data_length < data_size) + { + while(data_length < data_size) { + data_length = url->state(url, url_entry, url_base, data, data_length, data_size); + } + + /* parse end */ + myurl_state_f prev_state = myurl_parser_state_undef; + + while(data_length == data_size && url->state != prev_state) + { + prev_state = url->state; + data_length = url->state(url, url_entry, url_base, data, data_length, data_size); + } + + if(data_length >= data_size) + break; + } + + if(url->copy) { + url->callback_free(url->copy, url->callback_ctx); + } + + return data_length; +} + +size_t myurl_parser_state_undef(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * ~s~cheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_scheme_start(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(data_length < data_size && myurl_parser_alpha(data[data_length])) { + url->state = myurl_parser_state_scheme; + url->begin = data_length; + + data_length++; + } + else if(url->state_override == NULL) { + url->state = myurl_parser_state_no_scheme; + } + else { + // syntax violation, stop parsing + url_entry->status = MyURL_STATUS_FAILURE_SCHEME_START; + return (data_size + 1); + } + + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * ~scheme~:[//[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_scheme(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* END OF FILE */ + if(data_length >= data_size) { + /* 3 */ + if(url->state_override == NULL) { + url->begin = 0; + url->state = myurl_parser_state_no_scheme; + + return myurl_parser_skip_control_and_space_leading(data, data_size); + } + + return myurl_parser_state_undef(url, url_entry, url_base, data, data_length, data_size); + } + + while(data_length < data_size) + { + /* 1 and 4 */ + if(myurl_parser_alphanumeric(data[data_length]) == false && + data[data_length] != '+' && data[data_length] != '-' && data[data_length] != '.') + { + /* 2 */ + if(data[data_length] == ':') + { + const myurl_scheme_entry_t *scheme = myurl_scheme_find_entry(&data[url->begin], (data_length - url->begin)); + myurl_scheme_t *url_entry_scheme = &url_entry->scheme; + + /* 2.1 */ + if(url->state_override) + { + if(scheme == NULL) { + if(url_entry_scheme->type & MyURL_SCHEME_TYPE_SPECIAL) + { + url->state = url->state_override; + return (data_length + 1); // skip ':' + } + } + else if((url_entry_scheme->type & MyURL_SCHEME_TYPE_SPECIAL) != + (scheme->type & MyURL_SCHEME_TYPE_SPECIAL)) + { + url->state = url->state_override; + return (data_length + 1); // skip ':' + } + } + + memset(url_entry_scheme, 0, sizeof(myurl_scheme_t)); + + /* 2.2 */ + if(scheme == NULL) { + if(url_entry_scheme->name) + url->callback_free(url_entry_scheme->name, url->callback_ctx); + + url_entry_scheme->length = (data_length - url->begin); + url_entry_scheme->name = myurl_utils_data_copy(url, &data[url->begin], url_entry_scheme->length); + + if(url_entry_scheme->name == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + } + else { + url_entry_scheme->name = myurl_utils_data_copy(url, scheme->name, scheme->name_length); + if(url_entry_scheme->name == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry_scheme->length = scheme->name_length; + url_entry_scheme->port = scheme->port; + url_entry_scheme->sid = scheme->m_id; + url_entry_scheme->type = scheme->type; + } + + /* 2.3 */ + url->begin = 0; + + data_length++; // skip ':' + + /* 2.4 */ + if(url->state_override) { + url->state = url->state_override; + return data_length; + } + + /* 2.5 */ + if(url_entry_scheme->sid == MyURL_SCHEME_ID_FILE) + { + /* 2.5.1 */ + if(((data_length + 1) < data_size) && + mycore_strncmp((const char*)(&data[data_length]), "//", 2)) + { + // parse error + } + + /* 2.5.2 */ + url->state = myurl_parser_state_file; + } + /* 2.6 */ + else if((url_entry_scheme->type & MyURL_SCHEME_TYPE_SPECIAL) && + url_base != NULL && url_base->scheme.sid == url_entry_scheme->sid && url_base->scheme.type == url_entry_scheme->type) + { + url->state = myurl_parser_state_special_relative_or_authority; + } + /* 2.7 */ + else if(url_entry_scheme->type & MyURL_SCHEME_TYPE_SPECIAL) { + url->state = myurl_parser_state_special_authority_slashes; + } + /* 2.8 */ + else if(data_length < data_size && data[data_length] == '/') { + url->state = myurl_parser_state_path_or_authority; + data_length++; + } + /* 2.9 */ + else { + url_entry->flags |= MyURL_FLAGS_CANNOT_BE_BASE_URL; + url->state = myurl_parser_state_cannot_be_a_base_URL_path; + } + + return data_length; + } + /* 3 */ + else if(url->state_override == NULL) { + url->begin = 0; + url->state = myurl_parser_state_no_scheme; + + return myurl_parser_skip_control_and_space_leading(data, data_size); + } + + /* 4 */ + // syntax violation, return failure + url_entry->status = MyURL_STATUS_FAILURE_SCHEME_STATE; + return (data_size + 1); + } + + data_length++; + } + + if(url->state_override == NULL) { + url->begin = 0; + url->state = myurl_parser_state_no_scheme; + + return myurl_parser_skip_control_and_space_leading(data, data_size); + } + + /* 4 */ + // syntax violation, return failure + url_entry->status = MyURL_STATUS_FAILURE_SCHEME_STATE; + return (data_size + 1); +} + +/* + * //[user:password@]host[:port][/]path[?query][#fragment] + * ~/~/[user:password@]host[:port][/]path[?query][#fragment] + */ +size_t myurl_parser_state_no_scheme(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1 */ + if(url_base == NULL || ((url_base->flags & MyURL_FLAGS_CANNOT_BE_BASE_URL) && + (data_length >= data_size || data[data_length] != '#'))) + { + // syntax violation, return failure + url_entry->status = MyURL_STATUS_FAILURE_NO_SCHEME_BASE_NULL_OR_NOT_HASH; + return (data_size + 1); + } + + /* 2 */ + if((url_base->flags & MyURL_FLAGS_CANNOT_BE_BASE_URL) && data_length < data_size && data[data_length] == '#') + { + if(myurl_scheme_copy(url, &url_base->scheme, &url_entry->scheme) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->query_length = url_base->query_length; + url_entry->flags |= MyURL_FLAGS_CANNOT_BE_BASE_URL; + + if(url_entry->fragment) + url_entry->fragment = url->callback_free(url_entry->fragment, url->callback_ctx); + + url->state = myurl_parser_state_fragment; + + return (data_length + 1); // skip '#' + } + + /* 3 */ + if(url_base->scheme.sid != MyURL_SCHEME_ID_FILE) + url->state = myurl_parser_state_relative; + else + url->state = myurl_parser_state_file; + + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[~//~[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_special_relative_or_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if((data_length + 1) < data_size && data[data_length] == '/' && data[(data_length + 1)] == '/') + { + url->state = myurl_parser_state_special_authority_ignore_slashes; + data_length += 2; + } + else { + // parse error + url->state = myurl_parser_state_relative; + } + + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[~//~[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_path_or_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(data_length < data_size && data[data_length] == '/') { + url->state = myurl_parser_state_authority; + data_length++; + } + else { + url->state = myurl_parser_state_path; + } + + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[//[user:password@]host[:port]][/]path~~[?query][#fragment] + */ +size_t myurl_parser_state_relative(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(myurl_scheme_copy(url, &url_base->scheme, &url_entry->scheme) != MyURL_STATUS_OK) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + /* END OF FILE */ + if(data_length >= data_size) + return myurl_parser_state_relative_end(url, url_entry, url_base, data, data_length, data_size); + + switch (data[data_length]) { + case '/': + url->state = myurl_parser_state_relative_slash; + break; + + case '?': + if(myurl_parser_copy_attr(url, url_base, url_entry, username) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, password) != MyURL_STATUS_OK || + myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->port = url_base->port; + url_entry->port_is_set = url_base->port_is_set; + + myurl_utils_data_set_empty(url, &url_entry->query, &url_entry->query_length); + + url->state = myurl_parser_state_query; + break; + + case '#': + if(myurl_parser_copy_attr(url, url_base, url_entry, username) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, password) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK || + myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->port = url_base->port; + url_entry->port_is_set = url_base->port_is_set; + + myurl_utils_data_set_empty(url, &url_entry->fragment, &url_entry->fragment_length); + + url->state = myurl_parser_state_fragment; + break; + + default: + if((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && data[data_length] == '\\') + { + // parse error + url->state = myurl_parser_state_relative_slash; + break; + } + + if(myurl_parser_copy_attr(url, url_base, url_entry, username) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, password) != MyURL_STATUS_OK || + myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + myurl_path_pop(&url_entry->path); + + url_entry->port = url_base->port; + url_entry->port_is_set = url_base->port_is_set; + + url->state = myurl_parser_state_path; + return data_length; + } + + return (data_length + 1); +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_relative_slash(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(data_length < data_size) + { + if((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && (data[data_length] == '/' || data[data_length] == '\\')) + { + if(data[data_length] == '\\') { + // parse error + } + + url->state = myurl_parser_state_special_authority_ignore_slashes; + return (data_length + 1); + } + else if(data[data_length] == '/') { + url->state = myurl_parser_state_authority; + return (data_length + 1); + } + } + + if(myurl_parser_copy_attr(url, url_base, url_entry, username) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, password) != MyURL_STATUS_OK || + myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->port = url_base->port; + url->state = myurl_parser_state_path; + + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_special_authority_slashes(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if((data_length + 1) < data_size && data[data_length] == '/' && data[(data_length + 1)] == '/') { + data_length += 2; + } + else { + // parse error + } + + url->state = myurl_parser_state_special_authority_ignore_slashes; + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[//~~[user:password@]host[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_special_authority_ignore_slashes(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* END OF FILE */ + if(data_length >= data_size) { + url->begin = 0; + url->state = myurl_parser_state_authority; + return data_length; + } + + while(data_length < data_size) { + if(data[data_length] != '/' && data[data_length] != '\\') + { + url->state = myurl_parser_state_authority; + break; + } + else { + // parse error + } + + data_length++; + } + + return data_length; +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[//[~u~ser:password@]host[:port]][/]path[?query][#fragment] + */ +static char * myurl_parser_state_authority_copy_value(myurl_t* url, myurl_entry_t* url_entry, const char* data, size_t data_length, bool is_password) +{ + size_t length; + char *in_hex_val = myurl_utils_percent_encode(url, data, data_length, myurl_resources_static_map_userinfo, &length); + + if(in_hex_val == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + + if(is_password) { + if(myurl_parser_append_buffer(url, in_hex_val, 0, length, url_entry->password)) { + url->callback_free(in_hex_val, url->callback_ctx); + + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + } + else { + if(myurl_parser_append_buffer(url, in_hex_val, 0, length, url_entry->username)) { + url->callback_free(in_hex_val, url->callback_ctx); + + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return NULL; + } + } + + url->callback_free(in_hex_val, url->callback_ctx); + + return url_entry->username; +} + +size_t myurl_parser_state_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + bool passwordTokenSeenFlag = false; + + while(data_length < data_size) { + /* 1 */ + if(data[data_length] == '@') + { + /* find last at '@' */ + size_t i = data_length; + while(i < data_size) + { + if(data[i] == '@') + data_length = i; + + i++; + } + + /* 1.1 */ + // parse error + + /* 1.2, 1.3 */ + url_entry->flags |= MyURL_FLAGS_AT; + + /* 1.4 */ + i = url->begin; + while(i < data_length) + { + if(data[i] == ':') { + passwordTokenSeenFlag = true; + + if(myurl_parser_state_authority_copy_value(url, url_entry, &data[ url->begin ], (i - url->begin), false) == NULL) + return (data_size + 1); + + url->begin = i = i + 1; + break; + } + + i++; + } + + if(passwordTokenSeenFlag) { + if(myurl_parser_state_authority_copy_value(url, url_entry, &data[ url->begin ], (data_length - url->begin), true) == NULL) + return (data_size + 1); + } + else { + if(myurl_parser_state_authority_copy_value(url, url_entry, &data[ url->begin ], (data_length - url->begin), false) == NULL) + return (data_size + 1); + } + + url->begin = (data_length + 1); + } + else if((data[data_length] == '/' || data[data_length] == '?' || data[data_length] == '#') || + ((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && data[data_length] == '\\')) + { + return myurl_parser_state_authority_end(url, url_entry, url_base, data, data_length, data_size); + } + + data_length++; + } + + /* END OF FILE */ + return myurl_parser_state_authority_end(url, url_entry, url_base, data, data_length, data_size); +} + +/* + * scheme:[//[user:password@]host[:port]][/]path[?query][#fragment] + * scheme:[//[user:password@]~host~[:port]][/]path[?query][#fragment] + */ +size_t myurl_parser_state_host_hostname(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + while(data_length < data_size) + { + /* 1 */ + if(url->state_override && url_entry->scheme.sid == MyURL_SCHEME_ID_FILE) { + url->state = myurl_parser_state_file_host; + return data_length; + } + + /* 2 */ + if(data[data_length] == ':' && (url_entry->flags & MyURL_FLAGS_BRACKET) == 0) { + /* 2.1 */ + if((data_length - url->begin) == 0) { + // parse error + url_entry->status = MyURL_STATUS_FAILURE_UNEXPECTED_ENDING; + return (data_size + 1); + } + + /* 1.2 and 1.3 */ + if(myurl_host_parser(url, &url_entry->host, &data[url->begin], (data_length - url->begin), + (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL))) + { + url_entry->status = MyURL_STATUS_FAILURE_BAD_HOSTNAME; + return (data_size + 1); + } + + /* 1.4 */ + data_length++; + url->begin = 0; + + /* 1.5 */ + if(url->state_override == myurl_parser_state_host_hostname) { + return data_size; + } + + url->state = myurl_parser_state_port; + + return data_length; + } + + /* 3 */ + else if((data[data_length] == '/' || data[data_length] == '?' || data[data_length] == '#') || + ((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && data[data_length] == '\\')) + { + return myurl_parser_state_host_hostname_end(url, url_entry, url_base, data, data_length, data_size); + } + else if(data[data_length] == '[') { + url_entry->flags |= MyURL_FLAGS_BRACKET; + } + else if(data[data_length] == ']') { + url_entry->flags ^= (url_entry->flags & MyURL_FLAGS_BRACKET); + } + + data_length++; + } + + /* END OF FILE */ + return myurl_parser_state_host_hostname_end(url, url_entry, url_base, data, data_length, data_size); +} + +size_t myurl_parser_state_port(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + while(data_length < data_size) + { + /* 1 */ + if(myurl_parser_digit(data[data_length]) == 0) + { + /* 2 */ + if((data[data_length] == '/' || data[data_length] == '?' || data[data_length] == '#') || + ((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && data[data_length] == '\\') || + url->state_override) + { + return myurl_parser_state_port_end(url, url_entry, url_base, data, data_length, data_size); + } + + url_entry->status = MyURL_STATUS_FAILURE_BAD_PORT; + return (data_size + 1); + } + + data_length++; + } + + // EOF code point + return myurl_parser_state_port_end(url, url_entry, url_base, data, data_length, data_size); +} + +size_t myurl_parser_state_file(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1 */ + if(url_entry->scheme.sid != MyURL_SCHEME_ID_FILE) + { + const myurl_scheme_entry_t *scheme = myurl_scheme_find_entry("file", 4); + if(scheme) { + url_entry->scheme.name = myurl_utils_data_copy(url, scheme->name, scheme->name_length); + if(url_entry->scheme.name == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->scheme.length = scheme->name_length; + url_entry->scheme.port = scheme->port; + url_entry->scheme.sid = scheme->m_id; + url_entry->scheme.type = scheme->type; + } + else { + url_entry->status = MyURL_STATUS_FAILURE_SCHEME_STATE; + return (data_size + 1); + } + } + + /* 2 */ + if(data_length < data_size && (data[data_length] == '/' || data[data_length] == '\\')) { + //if(data[data_length] == '\\') { + // // parse error + //} + + url->state = myurl_parser_state_file_slash; + return (data_length + 1); + } + + + /* 3 */ + if(url_base && url_base->scheme.sid == MyURL_SCHEME_ID_FILE) { + /* END OF FILE */ + if(data_length >= data_size) + return myurl_parser_state_file_end(url, url_entry, url_base, data, data_length, data_size); + + if(data[data_length] == '?') { + if(myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + myurl_utils_data_set_empty(url, &url_entry->query, &url_entry->query_length); + + url->state = myurl_parser_state_query; + return (data_length + 1); + } + + if(data[data_length] == '#') { + if(myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + myurl_utils_data_set_empty(url, &url_entry->fragment, &url_entry->fragment_length); + + url->state = myurl_parser_state_fragment; + return (data_length + 1); + } + + /* 3.1 */ + size_t sec_rem = data_length + 2; + if( + /* c and the first code point of remaining are not a Windows drive letter */ + (myurl_utils_is_windows_drive_letter(data, data_length, data_size)) || + + /* remaining consists of one code point */ + (sec_rem == data_size) || + + /* remaining’s second code point is not "/", "\", "?", or "#" */ + ( + sec_rem < data_size && + (data[sec_rem] != '/' && data[sec_rem] != '/' && data[sec_rem] != '?' && data[sec_rem] != '#') + )) + { + if(myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + myurl_path_shorten(&url_entry->path, url_entry->scheme.sid); + } + //else { + // // parse error + //} + } + + /* 4 */ + url->state = myurl_parser_state_path; + return data_length; +} + +size_t myurl_parser_state_file_slash(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1 */ + if(data_length < data_size && (data[data_length] == '/' || data[data_length] == '\\')) { + //if(data[data_length] == '\\') { + // // parse error + //} + + url->state = myurl_parser_state_file_host; + return (data_length + 1); + } + + /* 2 */ + if(url_base && url_base->scheme.sid == MyURL_SCHEME_ID_FILE && url_base->path.list && + myurl_utils_is_windows_drive_letter(url_base->path.list->data, 0, url_base->path.list->length)) + { + /* 2.1 */ + if(myurl_path_append(url, &url_entry->path, url_base->path.list->data, url_base->path.list->length) == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + } + + /* 2.2 */ + url->state = myurl_parser_state_path; + + return data_length; +} + +size_t myurl_parser_state_file_host(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + while(data_length < data_size) + { + /* 1 */ + if((data[data_length] == '/' || data[data_length] == '\\' || data[data_length] == '?' || data[data_length] == '#')) { + return myurl_parser_state_file_host_end(url, url_entry, url_base, data, data_length, data_size); + } + + data_length++; + } + + // EOF code point + return myurl_parser_state_file_host_end(url, url_entry, url_base, data, data_length, data_size); +} + +size_t myurl_parser_state_path_start(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1 */ + if(url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) { + /* 1.1 */ +// if(data[data_length] == '\\') { +// // parse error +// +// } + + /* 1.2 */ + url->state = myurl_parser_state_path; + url->begin = 0; + + /* 1.2 */ + if(data_length >= data_size || (data[data_length] != '/' && data[data_length] != '\\')) { + return data_length; + } + + return data_length + 1; + } + + /* 4 */ + if(data_length >= data_size) + return data_length; + + /* 2, 3 */ + if(url->state_override == NULL) + { + if(data[data_length] == '?') { + myurl_utils_data_set_empty(url, &url_entry->query, &url_entry->query_length); + + url->state = myurl_parser_state_query; + return (data_length + 1); + } + else if(data[data_length] == '#') { + myurl_utils_data_set_empty(url, &url_entry->fragment, &url_entry->fragment_length); + + url->state = myurl_parser_state_fragment; + return (data_length + 1); + } + } + + /* 4 */ + url->state = myurl_parser_state_path; + + if(data[data_length] != '/') + return data_length; + + return (data_length + 1); +} + +size_t myurl_parser_state_path(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + while(data_length < data_size) + { + /* 1 */ + if( + (data[data_length] == '/') || + (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL && data[data_length] == '\\') || + (url->state_override == NULL && (data[data_length] == '?' || data[data_length] == '#')) + ) + { + data_length = myurl_parser_state_path_end(url, url_entry, url_base, data, data_length, data_size); + + if(url->state != myurl_parser_state_path) + return data_length; + + url->begin = data_length; + } + else + data_length++; + + /* 2 */ + /* 2.1 */ + // If c is not a URL code point and not "%", validation error. + //if(data[data_length] == '%') { + // // parse error + //} + + /* 2.2 */ + //if((data_length + 2) < data_size && data[data_length] == '%' && + // (mycore_string_chars_hex_map[ (unsigned char)data[(data_length + 1)] ] == 0xff || + // mycore_string_chars_hex_map[ (unsigned char)data[(data_length + 2)] ] == 0xff)) + //{ + // // parse error + //} + } + + return myurl_parser_state_path_end(url, url_entry, url_base, data, data_length, data_size); +} + +size_t myurl_parser_state_cannot_be_a_base_URL_path(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + while(data_length < data_size) + { + /* 1 */ + if(data[data_length] == '?') + { + /* 3.3 */ + if(url->begin < data_length) { + myurl_parser_state_cannot_be_a_base_URL_path_end(url, url_entry, url_base, data, data_length, data_size); + + if(url_entry->status) + return (data_size + 1); + } + + myurl_utils_data_set_empty(url, &url_entry->query, &url_entry->query_length); + + url->state = myurl_parser_state_query; + url->begin = 0; + + return (data_length + 1); + } + + /* 2 */ + if(data[data_length] == '#') + { + /* 3.3 */ + if(url->begin < data_length) { + myurl_parser_state_cannot_be_a_base_URL_path_end(url, url_entry, url_base, data, data_length, data_size); + + if(url_entry->status) + return (data_size + 1); + } + + myurl_utils_data_set_empty(url, &url_entry->fragment, &url_entry->fragment_length); + + url->state = myurl_parser_state_fragment; + url->begin = 0; + + return (data_length + 1); + } + + /* 3 */ + /* 3.1 */ + // TODO: If c is not EOF code point, not a URL code point, and not "%", validation error. + //if(data[data_length] == '%') { + // // parse error + //} + + /* 3.2 */ + //if((data_length + 2) < data_size && data[data_length] == '%' && + // (mycore_string_chars_hex_map[ (unsigned char)data[(data_length + 1)] ] == 0xff || + // mycore_string_chars_hex_map[ (unsigned char)data[(data_length + 2)] ] == 0xff)) + //{ + // // parse error + //} + + data_length++; + } + + return myurl_parser_state_cannot_be_a_base_URL_path_end(url, url_entry, url_base, data, data_length, data_size); +} + +size_t myurl_parser_state_query(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin == 0) + url->begin = data_length; + + while(data_length < data_size) + { + /* 1 */ + if(url->state_override == NULL && data[data_length] == '#') + { + return myurl_parser_state_query_end(url, url_entry, url_base, data, data_length, data_size); + } + + /* 2 */ + // TODO: If c is not a URL code point and not "%", validation error. + //if(data[data_length] == '%') { + // // parse error + //} + + /* 2.2 */ + //if((data_length + 2) < data_size && data[data_length] == '%' && + // (mycore_string_chars_hex_map[ (unsigned char)data[(data_length + 1)] ] == 0xff || + // mycore_string_chars_hex_map[ (unsigned char)data[(data_length + 2)] ] == 0xff)) + //{ + // // parse error + //} + + data_length++; + } + + // EOF code point + return myurl_parser_state_query_end(url, url_entry, url_base, data, data_length, data_size); +} + +size_t myurl_parser_state_fragment(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1.2, 1.3 */ + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url, &data[ data_length ], (data_size - data_length), + myurl_resources_static_map_C0, &buffer_length); + + if(buffer == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->fragment = buffer; + url_entry->fragment_length = buffer_length; + + return (data_size + 1); +} + + diff --git a/source/myurl/parser.h b/source/myurl/parser.h new file mode 100644 index 0000000..62cf69c --- /dev/null +++ b/source/myurl/parser.h @@ -0,0 +1,103 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_PARSER_H +#define MyURL_PARSER_H +#pragma once + +#include "myurl/myosi.h" +#include "myurl/utils.h" + +#define myurl_parser_digit(onechar) (onechar >= 0x30 && onechar <= 0x39) +#define myurl_parser_alpha_upper(onechar) (onechar >= 0x41 && onechar <= 0x5A) +#define myurl_parser_alpha_lower(onechar) (onechar >= 0x61 && onechar <= 0x7A) +#define myurl_parser_alpha(onechar) (myurl_parser_alpha_upper(onechar) || myurl_parser_alpha_lower(onechar)) + +#define myurl_parser_alphanumeric(onechar) (myurl_parser_digit(onechar) || myurl_parser_alpha(onechar)) + +#define myurl_parser_swap_path(url, base) \ + if(url->path) \ + myurl_utils_data_list_destroy(url->path, true); \ + url->path = base->path + +#define myurl_parser_copy_scheme(parser, to, from) \ + to->scheme.scheme = from->scheme.scheme; \ + myurl_utils_data_copy(parser, &to->scheme.origin, &from->scheme.origin) + +#define myurl_parser_copy_path(parser, to, from) \ + myurl_utils_data_list_copy(parser, to->path, from->path) + +#define myurl_parser_copy_attr(url, from, to, attr) \ + myurl_utils_data_copy_set(url, from->attr, from->attr ## _length, &to->attr, &to->attr ## _length) + +#define myurl_parser_copy_buffer(url, data, data_length, to) \ + myurl_utils_data_copy_set(url, &data[ url->begin ], (data_length - url->begin), &to, &to ## _length) + +#define myurl_parser_append_buffer(url, data, begin, data_length, to) \ + myurl_utils_data_copy_append(url, &data[ begin ], (data_length - begin), &to, &to ## _length) + +#define myurl_parser_is_includes_credentials(url_entry) (url_entry->username_length || url_entry->password_length) + +#ifdef __cplusplus +extern "C" { +#endif + +size_t myurl_parser_begin(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_size); + +size_t myurl_parser_state_undef(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_scheme_start(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_scheme(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_no_scheme(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_special_relative_or_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_or_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_relative(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_relative_slash(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_special_authority_slashes(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_special_authority_ignore_slashes(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_authority(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_host_hostname(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_port(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_slash(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_host(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_start(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_cannot_be_a_base_URL_path(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_query(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_fragment(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); + +/* ends */ +size_t myurl_parser_state_relative_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_authority_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_host_hostname_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_port_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_file_host_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_start_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_path_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_cannot_be_a_base_URL_path_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); +size_t myurl_parser_state_query_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_PARSER_H */ diff --git a/source/myurl/parser_end.c b/source/myurl/parser_end.c new file mode 100644 index 0000000..517a35b --- /dev/null +++ b/source/myurl/parser_end.c @@ -0,0 +1,347 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/url.h" +#include "myurl/parser.h" +#include "myurl/resources.h" +#include "mycore/utils/resources.h" + +size_t myurl_parser_state_relative_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(myurl_parser_copy_attr(url, url_base, url_entry, username) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, password) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK || + myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->port = url_base->port; + url_entry->port_is_set = url_base->port_is_set; + + return data_size; +} + +size_t myurl_parser_state_authority_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if((url_entry->flags & MyURL_FLAGS_AT) && (data_length - url->begin) == 0) { + // parse error + url_entry->status = MyURL_STATUS_FAILURE_AUTHORITY_HOST_AFTER_AUTH; + return (data_size + 1); + } + + data_length -= (data_length - url->begin); + + url->state = myurl_parser_state_host_hostname; + url->begin = 0; + + return data_length; +} + +size_t myurl_parser_state_host_hostname_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 3.1 */ + if((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) && (data_length - url->begin) == 0) { + // parse error + url_entry->status = MyURL_STATUS_FAILURE_UNEXPECTED_ENDING; + return (data_size + 1); + } + + /* 3.2 */ + if(url->state_override && (data_length - url->begin) == 0 && + (myurl_parser_is_includes_credentials(url_entry) || url_entry->port_is_set)) + { + // parse error + return (data_size + 1); + } + + /* 3.3 and 3.4 */ + if(myurl_host_parser(url, &url_entry->host, &data[url->begin], (data_length - url->begin), + (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL))) + { + url_entry->status = MyURL_STATUS_FAILURE_BAD_HOSTNAME; + return (data_size + 1); + } + + /* 3.6 */ + if(url->state_override) + return (data_size + 1); + + /* 3.5 */ + url->state = myurl_parser_state_port; + url->begin = 0; + + return data_length; +} + +size_t myurl_parser_state_port_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 2.1 */ + if((data_length - url->begin)) + { + size_t len = url->begin; + unsigned int port = 0; + + /* 2.1.1 */ + while(len < data_length) + { + if(port > 65535) { + url_entry->status = MyURL_STATUS_FAILURE_BAD_PORT; + return (data_size + 1); + } + + port = mycore_string_chars_num_map[ (unsigned char)data[len] ] + port * 10; + len++; + } + + /* 2.1.3 */ + if(url_entry->scheme.port != port) { + url_entry->port = port; + url_entry->port_is_set = true; + } + } + + /* for all 2.1.4 */ + url->begin = 0; + + /* 2.2 */ + if(url->state_override) + return (data_size + 1); + + /* 2.3 */ + url->state = myurl_parser_state_path_start; + + return data_length; +} + +size_t myurl_parser_state_file_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(myurl_host_copy(url, &url_base->host, &url_entry->host) != MyURL_STATUS_OK || + myurl_path_copy(url, &url_base->path, &url_entry->path) != MyURL_STATUS_OK || + myurl_parser_copy_attr(url, url_base, url_entry, query) != MyURL_STATUS_OK) + { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + return data_size; +} + +size_t myurl_parser_state_file_host_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1.1 */ + if(url->state_override == NULL && myurl_utils_is_windows_drive_letter(data, url->begin, data_size)) { + url->state = myurl_parser_state_path; + return data_length; + } + + /* 1.2 */ + if((data_length <= url->begin)) { + /* 1.2.1 */ + myurl_host_clean(url, &url_entry->host); + + /* 1.2.2 */ + if(url->state_override) + return (data_size + 1); + + /* 1.2.3 */ + url->state = myurl_parser_state_path_start; + return data_length; + } + + /* 1.3 */ + if(myurl_host_parser(url, &url_entry->host, &data[url->begin], (data_length - url->begin), (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL))) { + url_entry->status = MyURL_STATUS_FAILURE_BAD_HOSTNAME; + return (data_size + 1); + } + + /* 1.3.3 */ + if(url_entry->host.type == MyURL_HOST_TYPE_DOMAIN && + url_entry->host.value.domain.length == 9 && + mycore_strncasecmp("localhost", url_entry->host.value.domain.value, url_entry->host.value.domain.length) == 0) + { + myurl_host_clean(url, &url_entry->host); + } + + /* 1.3.5 */ + if(url->state_override) + return (data_size + 1); + + /* 2.1.6 */ + url->begin = 0; + url->state = myurl_parser_state_path_start; + + return data_length; +} + +size_t myurl_parser_state_path_start_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + return data_size; +} + +size_t myurl_parser_state_path_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1.1 */ + //if(url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL && data[data_length] == '\\') { + // // parse error + //} + + /* 1.2 */ + if(myurl_utils_is_double_dot_path_segment(&data[ url->begin ], (data_length - url->begin))) + { + myurl_path_shorten(&url_entry->path, url_entry->scheme.sid); + + if(data_length >= data_size || (data[data_length] != '/' && + (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL && data[data_length] == '\\') == 0)) + { + if(myurl_path_push(url, &url_entry->path, NULL, 0) == NULL) { + url_entry->status = MyURL_STATUS_ERROR; + return (data_size + 1); + } + } + } + + /* 1.3 */ + else if(myurl_utils_is_single_dot_path_segment(&data[ url->begin ], (data_length - url->begin))) + { + if(data_length >= data_size || (data[data_length] != '/' && + (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL && data[data_length] == '\\') == 0)) + { + if(myurl_path_push(url, &url_entry->path, NULL, 0) == NULL) { + url_entry->status = MyURL_STATUS_ERROR; + return (data_size + 1); + } + } + } + + /* 1.4 */ + else { + bool second_replace = false; + /* 1.4.1 */ + if(url_entry->scheme.sid == MyURL_SCHEME_ID_FILE && url_entry->path.length == 0 && + myurl_utils_is_windows_drive_letter(data, url->begin, data_length)) + { + /* 1.4.1.1 */ + //if(url_entry->host.type != MyURL_HOST_TYPE_UNDEF) { + // // parse error + //} + + /* 1.4.1.2 */ + myurl_host_clean(url, &url_entry->host); + second_replace = true; + } + + /* 1.4.2 */ + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url, &data[ url->begin ], (data_length - url->begin), + myurl_resources_static_map_path, &buffer_length); + + if(buffer == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + if(myurl_path_push(url, &url_entry->path, buffer, buffer_length) == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + /* 1.4.1.2 */ + if(second_replace && buffer_length > 1) { + buffer[1] = ':'; + } + } + + /* 1.5 */ + url->begin = 0; + + if(data_length < data_size) { + /* 1.6 */ + if(data[data_length] == '?') { + myurl_utils_data_set_null(url, &url_entry->query, &url_entry->query_length); + url->state = myurl_parser_state_query; + } + /* 1.7 */ + if(data[data_length] == '#') { + myurl_utils_data_set_null(url, &url_entry->fragment, &url_entry->fragment_length); + url->state = myurl_parser_state_fragment; + } + } + + return (data_length + 1); +} + +size_t myurl_parser_state_cannot_be_a_base_URL_path_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + if(url->begin < data_length) { + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url, &data[ url->begin ], (data_length - url->begin), + myurl_resources_static_map_C0, &buffer_length); + + if(buffer == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + if(myurl_path_push(url, &url_entry->path, buffer, buffer_length) == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + } + + return (data_size + 1); +} + +size_t myurl_parser_state_query_end(myurl_t* url, myurl_entry_t* url_entry, myurl_entry_t* url_base, const char* data, size_t data_length, size_t data_size) +{ + /* 1.1 */ + if((url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL) == 0 || + url_entry->scheme.sid == MyURL_SCHEME_ID_WS || + url_entry->scheme.sid == MyURL_SCHEME_ID_WSS) + { + url->encoding = MyENCODING_UTF_8; + } + + /* 1.2, 1.3 */ + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url, &data[ url->begin ], (data_length - url->begin), + myurl_resources_static_map_query_charset, &buffer_length); + + if(buffer == NULL) { + url_entry->status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + return (data_size + 1); + } + + url_entry->query = buffer; + url_entry->query_length = buffer_length; + + /* 1.4 */ + url->begin = 0; + + /* 1.5 */ + myurl_utils_data_set_null(url, &url_entry->fragment, &url_entry->fragment_length); + url->state = myurl_parser_state_fragment; + + return (data_length + 1); +} + + diff --git a/source/myurl/path.c b/source/myurl/path.c new file mode 100644 index 0000000..568e6c4 --- /dev/null +++ b/source/myurl/path.c @@ -0,0 +1,286 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/path.h" +#include "myurl/url.h" + +myurl_path_t * myurl_path_create(myurl_t* url) +{ + myurl_path_t *path = url->callback_malloc(sizeof(myurl_path_t), url->callback_ctx); + + if(path) + memset(path, 0, sizeof(myurl_path_t)); + + return path; +} + +mystatus_t myurl_path_init(myurl_t* url, myurl_path_t* path, size_t begin_size) +{ + if(begin_size == 0) + return MyURL_STATUS_ERROR; + + path->length = 0; + path->size = begin_size; + path->list = url->callback_malloc(sizeof(myurl_path_entry_t) * path->size, url->callback_ctx); + + if(path->list == NULL) + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + memset(path->list, 0, sizeof(myurl_path_entry_t) * path->size); + + return MyURL_STATUS_OK; +} + +void myurl_path_clean(myurl_t* url, myurl_path_t* path) +{ + for(size_t i = 0; i < path->length; i++) { + if(path->list[i].data) { + url->callback_free(path->list[i].data, url->callback_ctx); + } + } + + path->length = 0; +} + +myurl_path_entry_t * myurl_path_entry_destroy(myurl_t* url, myurl_path_entry_t* path, bool destroy_self) +{ + if(path == NULL) + return NULL; + + if(path->data) + url->callback_free(path->data, url->callback_ctx); + + if(destroy_self) { + url->callback_free(path, url->callback_ctx); + return NULL; + } + + return path; +} + +myurl_path_t * myurl_path_destroy(myurl_t* url, myurl_path_t* path, bool destroy_self) +{ + if(path == NULL) + return NULL; + + if(path->list) { + myurl_path_clean(url, path); + url->callback_free(path->list, url->callback_ctx); + } + + if(destroy_self && path) { + return url->callback_free(path, url->callback_ctx); + } + + return path; +} + +myurl_path_entry_t * myurl_path_append(myurl_t* url, myurl_path_t* path, const char* data, size_t length) +{ + if(path->length >= path->size) { + size_t new_size = path->length + 1024; + + myurl_path_entry_t *tmp = url->callback_realloc(path->list, sizeof(myurl_path_entry_t) * new_size, url->callback_ctx); + + if(tmp) { + memset(&tmp[path->length], 0, sizeof(myurl_path_entry_t) * (new_size - path->length)); + + path->list = tmp; + path->size = new_size; + } + else + return NULL; + } + + myurl_path_entry_t *entry = &path->list[ path->length ]; + path->length++; + + if(length) { + entry->data = url->callback_malloc(sizeof(char) * length, url->callback_ctx); + + if(entry->data == NULL) + return NULL; + + memcpy(entry->data, data, sizeof(char) * length); + } + else + entry->data = NULL; + + entry->length = length; + return entry; +} + +myurl_path_entry_t * myurl_path_push(myurl_t* url, myurl_path_t* path, char* data, size_t length) +{ + if(path->length >= path->size) { + size_t new_size = path->length + 32; + + myurl_path_entry_t *tmp = url->callback_realloc(path->list, sizeof(myurl_path_entry_t) * new_size, url->callback_ctx); + + if(tmp) { + memset(&tmp[path->length], 0, sizeof(myurl_path_entry_t) * (new_size - path->length)); + + path->list = tmp; + path->size = new_size; + } + else + return NULL; + } + + myurl_path_entry_t *entry = &path->list[ path->length ]; + path->length++; + + entry->data = data; + entry->length = length; + + return entry; +} + +myurl_path_entry_t * myurl_path_push_to_index(myurl_t* url, myurl_path_t* path, size_t index, char* data, size_t length) +{ + if(index >= path->size) { + myurl_path_entry_t *tmp = url->callback_realloc(path->list, sizeof(myurl_path_entry_t) * index, url->callback_ctx); + + if(tmp) { + memset(&tmp[path->length], 0, sizeof(myurl_path_entry_t) * (index - path->length)); + + path->list = tmp; + path->size = index; + } + else + return NULL; + } + + if(index > path->length) + path->length = index; + + if(path->list[ index ].data) + url->callback_free(path->list[ index ].data, url->callback_ctx); + + path->list[ index ].data = data; + path->list[ index ].length = length; + + return &path->list[ index ]; +} + +myurl_path_entry_t * myurl_path_current(myurl_path_t* path) +{ + if(path->length == 0) + return NULL; + + return &path->list[ (path->length - 1) ]; +} + +myurl_path_entry_t * myurl_path_pop(myurl_path_t* path) +{ + if(path->length == 0) + return NULL; + + path->length--; + + return &path->list[path->length]; +} + +void myurl_path_remove_by_index(myurl_t* url, myurl_path_t* path, size_t index) +{ + if(path->length == 0 || index >= path->length || path->list == NULL) + return; + + myurl_path_entry_destroy(url, &path->list[index], false); + + if((path->length - 1) > index) { + memmove(&path->list[index], &path->list[index + 1], sizeof(myurl_path_entry_t) * (path->length - (path->length - index))); + } + + path->length--; +} + +mystatus_t myurl_path_copy(myurl_t* url, myurl_path_t* path_from, myurl_path_t* path_to) +{ + if(path_from->length >= path_to->size) { + size_t new_size = path_from->length + 2; + + myurl_path_entry_t* tmp = url->callback_realloc(path_to->list, sizeof(myurl_path_entry_t) * new_size, url->callback_ctx); + + if(tmp) { + memset(&tmp[path_to->length], 0, sizeof(myurl_path_entry_t) * (new_size - path_to->length)); + + path_to->list = tmp; + path_to->size = new_size; + } + else + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + } + + myurl_path_entry_t *list_to = path_to->list; + myurl_path_entry_t *list_from = path_from->list; + + if(path_to->length > path_from->length) + { + while(path_to->length > path_from->length) { + path_to->length--; + + if(list_to[path_to->length].data) + url->callback_free( list_to[path_to->length].data, url->callback_ctx ); + } + } + + path_to->length = path_from->length; + + for(size_t i = 0; i < path_from->length; i++) + { + if(list_to[i].data) + { + if(list_to[i].length < list_from[i].length) + list_to[i].data = url->callback_realloc(list_to[i].data, (list_from[i].length + 1), url->callback_ctx); + } + else { + list_to[i].data = url->callback_malloc((list_from[i].length + 1), url->callback_ctx); + } + + if(list_to[i].data == NULL) + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + list_to[i].length = list_from[i].length; + list_to[i].data[ list_to[i].length ] = '\0'; + + if(list_from[i].length) { + memcpy(list_to[i].data, list_from[i].data, sizeof(char) * list_from[i].length); + } + } + + return MyURL_STATUS_OK; +} + +void myurl_path_shorten(myurl_path_t* path, myurl_scheme_id_t scheme_id) +{ + if(path->length == 0) + return; + + if(scheme_id == MyURL_SCHEME_ID_FILE) { + if(path->length == 1 && myurl_utils_is_windows_drive_letter(path->list[0].data, 0, path->list[0].length)) + return; + } + + myurl_path_pop(path); +} + + + diff --git a/source/myurl/path.h b/source/myurl/path.h new file mode 100644 index 0000000..4d8f0c3 --- /dev/null +++ b/source/myurl/path.h @@ -0,0 +1,67 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/myosi.h" +#include "myurl/scheme_const.h" +#include "myurl/utils.h" +#include "myhtml/mystring.h" + +#ifndef MyURL_PATH_H +#define MyURL_PATH_H +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +struct myurl_path_entry { + char* data; + size_t length; +} +typedef myurl_path_entry_t; + +struct myurl_path_t { + myurl_path_entry_t* list; + size_t length; + size_t size; +} +typedef myurl_path_t; + +myurl_path_t * myurl_path_create(myurl_t* url); +mystatus_t myurl_path_init(myurl_t* url, myurl_path_t* path, size_t begin_size); +void myurl_path_clean(myurl_t* url, myurl_path_t* path); +myurl_path_t * myurl_path_destroy(myurl_t* url, myurl_path_t* path, bool destroy_self); + +myurl_path_entry_t * myurl_path_append(myurl_t* url, myurl_path_t* path, const char* data, size_t length); +myurl_path_entry_t * myurl_path_push(myurl_t* url, myurl_path_t* path, char* data, size_t length); +myurl_path_entry_t * myurl_path_push_to_index(myurl_t* url, myurl_path_t* path, size_t index, char* data, size_t length); +myurl_path_entry_t * myurl_path_current(myurl_path_t* path); +myurl_path_entry_t * myurl_path_pop(myurl_path_t* path); +mystatus_t myurl_path_copy(myurl_t* url, myurl_path_t* path_from, myurl_path_t* path_to); + +void myurl_path_remove_by_index(myurl_t* url, myurl_path_t* path, size_t index); + +void myurl_path_shorten(myurl_path_t* path, myurl_scheme_id_t scheme_id); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_PATH_H */ diff --git a/source/myurl/punycode.c b/source/myurl/punycode.c new file mode 100644 index 0000000..5ebfa68 --- /dev/null +++ b/source/myurl/punycode.c @@ -0,0 +1,395 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/punycode.h" + +mystatus_t myurl_punycode_encode_with_callback(const unsigned char* data, size_t data_size, mycore_string_raw_t* str_raw) +{ + size_t i = 0; + size_t cp_count = 0; + + while(i < data_size) { + size_t n = myencoding_ascii_utf_8_length(data[i]); + + if(n == 1) { + str_raw->data[ str_raw->length++ ] = data[i]; + } + else if(n == 0) + return MyURL_STATUS_ERROR; + + cp_count++; + i += n; + } + + if(str_raw->length) { + str_raw->data[ str_raw->length++ ] = MyURL_PUNYCODE_CONST_DELIMITER; + } + + while(i < data_size) { + + } + + return MyURL_STATUS_OK; +} + + +///* +// punycode.c from RFC 3492 +// http://www.nicemice.net/idn/ +// Adam M. Costello +// http://www.nicemice.net/amc/ +// +// This is ANSI C code (C89) implementing Punycode (RFC 3492). +// +// */ +// +// +///************************************************************/ +///* Public interface (would normally go in its own .h file): */ +// +//#include +// +//enum punycode_status { +// punycode_success, +// punycode_bad_input, /* Input is invalid. */ +// punycode_big_output, /* Output would exceed the space provided. */ +// punycode_overflow /* Input needs wider integers to process. */ +//}; +// +//#if UINT_MAX >= (1 << 26) - 1 +//typedef unsigned int punycode_uint; +//#else +//typedef unsigned long punycode_uint; +//#endif +// +//enum punycode_status punycode_encode(punycode_uint input_length, +// const punycode_uint input[], +// const unsigned char case_flags[], +// punycode_uint *output_length, +// char output[] ); +// +///* punycode_encode() converts Unicode to Punycode. The input */ +///* is represented as an array of Unicode code points (not code */ +///* units; surrogate pairs are not allowed), and the output */ +///* will be represented as an array of ASCII code points. The */ +///* output string is *not* null-terminated; it will contain */ +///* zeros if and only if the input contains zeros. (Of course */ +///* the caller can leave room for a terminator and add one if */ +///* needed.) The input_length is the number of code points in */ +///* the input. The output_length is an in/out argument: the */ +///* caller passes in the maximum number of code points that it */ +///* can receive, and on successful return it will contain the */ +///* number of code points actually output. The case_flags array */ +///* holds input_length boolean values, where nonzero suggests that */ +///* the corresponding Unicode character be forced to uppercase */ +///* after being decoded (if possible), and zero suggests that */ +///* it be forced to lowercase (if possible). ASCII code points */ +///* are encoded literally, except that ASCII letters are forced */ +///* to uppercase or lowercase according to the corresponding */ +///* uppercase flags. If case_flags is a null pointer then ASCII */ +///* letters are left as they are, and other code points are */ +///* treated as if their uppercase flags were zero. The return */ +///* value can be any of the punycode_status values defined above */ +///* except punycode_bad_input; if not punycode_success, then */ +///* output_size and output might contain garbage. */ +// +//enum punycode_status punycode_decode(punycode_uint input_length, +// const char input[], +// punycode_uint *output_length, +// punycode_uint output[], +// unsigned char case_flags[] ); +// +///* punycode_decode() converts Punycode to Unicode. The input is */ +///* represented as an array of ASCII code points, and the output */ +///* will be represented as an array of Unicode code points. The */ +///* input_length is the number of code points in the input. The */ +///* output_length is an in/out argument: the caller passes in */ +///* the maximum number of code points that it can receive, and */ +///* on successful return it will contain the actual number of */ +///* code points output. The case_flags array needs room for at */ +///* least output_length values, or it can be a null pointer if the */ +///* case information is not needed. A nonzero flag suggests that */ +///* the corresponding Unicode character be forced to uppercase */ +///* by the caller (if possible), while zero suggests that it be */ +///* forced to lowercase (if possible). ASCII code points are */ +///* output already in the proper case, but their flags will be set */ +///* appropriately so that applying the flags would be harmless. */ +///* The return value can be any of the punycode_status values */ +///* defined above; if not punycode_success, then output_length, */ +///* output, and case_flags might contain garbage. On success, the */ +///* decoder will never need to write an output_length greater than */ +///* input_length, because of how the encoding is defined. */ +// +///**********************************************************/ +///* Implementation (would normally go in its own .c file): */ +// +//#include +// +///*** Bootstring parameters for Punycode ***/ +// +//enum { base = 36, tmin = 1, tmax = 26, skew = 38, damp = 700, +// initial_bias = 72, initial_n = 0x80, delimiter = 0x2D }; +// +///* basic(cp) tests whether cp is a basic code point: */ +//#define basic(cp) ((punycode_uint)(cp) < 0x80) +// +///* delim(cp) tests whether cp is a delimiter: */ +//#define delim(cp) ((cp) == delimiter) +// +///* decode_digit(cp) returns the numeric value of a basic code */ +///* point (for use in representing integers) in the range 0 to */ +///* base-1, or base if cp is does not represent a value. */ +// +//static punycode_uint decode_digit(punycode_uint cp) +//{ +// return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : +// cp - 97 < 26 ? cp - 97 : base; +//} +// +///* encode_digit(d,flag) returns the basic code point whose value */ +///* (when used for representing integers) is d, which needs to be in */ +///* the range 0 to base-1. The lowercase form is used unless flag is */ +///* nonzero, in which case the uppercase form is used. The behavior */ +///* is undefined if flag is nonzero and digit d has no uppercase form. */ +// +//static char encode_digit(punycode_uint d, int flag) +//{ +// return d + 22 + 75 * (d < 26) - ((flag != 0) << 5); +// /* 0..25 map to ASCII a..z or A..Z */ +// /* 26..35 map to ASCII 0..9 */ +//} +// +///* flagged(bcp) tests whether a basic code point is flagged */ +///* (uppercase). The behavior is undefined if bcp is not a */ +///* basic code point. */ +// +//#define flagged(bcp) ((punycode_uint)(bcp) - 65 < 26) +// +///* encode_basic(bcp,flag) forces a basic code point to lowercase */ +///* if flag is zero, uppercase if flag is nonzero, and returns */ +///* the resulting code point. The code point is unchanged if it */ +///* is caseless. The behavior is undefined if bcp is not a basic */ +///* code point. */ +// +//static char encode_basic(punycode_uint bcp, int flag) +//{ +// bcp -= (bcp - 97 < 26) << 5; +// return bcp + ((!flag && (bcp - 65 < 26)) << 5); +//} +// +///*** Platform-specific constants ***/ +// +///* maxint is the maximum value of a punycode_uint variable: */ +//static const punycode_uint maxint = -1; +///* Because maxint is unsigned, -1 becomes the maximum value. */ +// +///*** Bias adaptation function ***/ +// +//static punycode_uint adapt(punycode_uint delta, punycode_uint numpoints, int firsttime) +//{ +// punycode_uint k; +// +// delta = firsttime ? delta / damp : delta >> 1; +// /* delta >> 1 is a faster way of doing delta / 2 */ +// delta += delta / numpoints; +// +// for (k = 0; delta > ((base - tmin) * tmax) / 2; k += base) { +// delta /= base - tmin; +// } +// +// return k + (base - tmin + 1) * delta / (delta + skew); +//} +// +///*** Main encode function ***/ +// +//enum punycode_status punycode_encode(punycode_uint input_length, +// const punycode_uint input[], +// const unsigned char case_flags[], +// punycode_uint *output_length, +// char output[] ) +//{ +// punycode_uint n, delta, h, b, out, max_out, bias, j, m, q, k, t; +// +// /* Initialize the state: */ +// +// n = initial_n; +// delta = out = 0; +// max_out = *output_length; +// bias = initial_bias; +// +// /* Handle the basic code points: */ +// for (j = 0; j < input_length; ++j) { +// if (basic(input[j])) { +// if (max_out - out < 2) return punycode_big_output; +// output[out++] = +// case_flags ? encode_basic(input[j], case_flags[j]) : input[j]; +// } +// /* else if (input[j] < n) return punycode_bad_input; */ +// /* (not needed for Punycode with unsigned code points) */ +// } +// +// h = b = out; +// +// /* h is the number of code points that have been handled, b is the */ +// /* number of basic code points, and out is the number of characters */ +// /* that have been output. */ +// +// if (b > 0) output[out++] = delimiter; +// +// /* Main encoding loop: */ +// +// while (h < input_length) { +// /* All non-basic code points < n have been */ +// /* handled already. Find the next larger one: */ +// +// for (m = maxint, j = 0; j < input_length; ++j) { +// /* if (basic(input[j])) continue; */ +// /* (not needed for Punycode) */ +// if (input[j] >= n && input[j] < m) m = input[j]; +// } +// +// /* Increase delta enough to advance the decoder's */ +// /* state to , but guard against overflow: */ +// +// if (m - n > (maxint - delta) / (h + 1)) return punycode_overflow; +// delta += (m - n) * (h + 1); +// n = m; +// +// for (j = 0; j < input_length; ++j) { +// /* Punycode does not need to check whether input[j] is basic: */ +// if (input[j] < n /* || basic(input[j]) */ ) { +// if (++delta == 0) return punycode_overflow; +// } +// +// if (input[j] == n) { +// /* Represent delta as a generalized variable-length integer: */ +// +// for (q = delta, k = base; ; k += base) { +// if (out >= max_out) return punycode_big_output; +// +// t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */ +// k >= bias + tmax ? tmax : k - bias; +// if (q < t) break; +// output[out++] = encode_digit(t + (q - t) % (base - t), 0); +// q = (q - t) / (base - t); +// } +// +// output[out++] = encode_digit(q, case_flags && case_flags[j]); +// bias = adapt(delta, h + 1, h == b); +// delta = 0; +// ++h; +// } +// } +// +// ++delta, ++n; +// } +// +// *output_length = out; +// return punycode_success; +//} +// +///*** Main decode function ***/ +// +//enum punycode_status punycode_decode(punycode_uint input_length, +// const char input[], +// punycode_uint *output_length, +// punycode_uint output[], +// unsigned char case_flags[] ) +//{ +// punycode_uint n, out, i, max_out, bias, +// b, j, in, oldi, w, k, digit, t; +// +// /* Initialize the state: */ +// +// n = initial_n; +// out = i = 0; +// max_out = *output_length; +// bias = initial_bias; +// +// /* Handle the basic code points: Let b be the number of input code */ +// /* points before the last delimiter, or 0 if there is none, then */ +// /* copy the first b code points to the output. */ +// +// for (b = j = 0; j < input_length; ++j) if (delim(input[j])) b = j; +// if (b > max_out) return punycode_big_output; +// +// for (j = 0; j < b; ++j) { +// if (case_flags) case_flags[out] = flagged(input[j]); +// if (!basic(input[j])) return punycode_bad_input; +// output[out++] = input[j]; +// } +// +// /* Main decoding loop: Start just after the last delimiter if any */ +// /* basic code points were copied; start at the beginning otherwise. */ +// +// for (in = b > 0 ? b + 1 : 0; in < input_length; ++out) { +// +// /* in is the index of the next character to be consumed, and */ +// /* out is the number of code points in the output array. */ +// +// /* Decode a generalized variable-length integer into delta, */ +// /* which gets added to i. The overflow checking is easier */ +// /* if we increase i as we go, then subtract off its starting */ +// /* value at the end to obtain delta. */ +// +// for (oldi = i, w = 1, k = base; ; k += base) { +// if (in >= input_length) return punycode_bad_input; +// digit = decode_digit(input[in++]); +// if (digit >= base) return punycode_bad_input; +// if (digit > (maxint - i) / w) return punycode_overflow; +// i += digit * w; +// t = k <= bias /* + tmin */ ? tmin : /* +tmin not needed */ +// k >= bias + tmax ? tmax : k - bias; +// if (digit < t) break; +// if (w > maxint / (base - t)) return punycode_overflow; +// w *= (base - t); +// } +// +// bias = adapt(i - oldi, out + 1, oldi == 0); +// +// /* i was supposed to wrap around from out+1 to 0, */ +// /* incrementing n each time, so we'll fix that now: */ +// +// if (i / (out + 1) > maxint - n) return punycode_overflow; +// n += i / (out + 1); +// i %= (out + 1); +// +// /* Insert n at position i of the output: */ +// +// /* not needed for Punycode: */ +// /* if (decode_digit(n) <= base) return punycode_invalid_input; */ +// if (out >= max_out) return punycode_big_output; +// +// if (case_flags) { +// memmove(case_flags + i + 1, case_flags + i, out - i); +// +// /* Case of last character determines uppercase flag: */ +// case_flags[i] = flagged(input[in - 1]); +// } +// +// memmove(output + i + 1, output + i, (out - i) * sizeof *output); +// output[i++] = n; +// } +// +// *output_length = out; +// return punycode_success; +//} +// +// diff --git a/source/myurl/punycode.h b/source/myurl/punycode.h new file mode 100644 index 0000000..dad8c73 --- /dev/null +++ b/source/myurl/punycode.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_PUNYCODE_H +#define MyURL_PUNYCODE_H +#pragma once + +#include "myurl/myosi.h" +#include "myhtml/mystring.h" +#include "myencoding/encoding.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum myurl_punycode_const { + MyURL_PUNYCODE_CONST_BASE = 36, + MyURL_PUNYCODE_CONST_TMIN = 1, + MyURL_PUNYCODE_CONST_TMAX = 26, + MyURL_PUNYCODE_CONST_SKEW = 38, + MyURL_PUNYCODE_CONST_DAMP = 700, + MyURL_PUNYCODE_CONST_INITIAL_BIAS = 72, + MyURL_PUNYCODE_CONST_INITIAL_N = 0x80, + MyURL_PUNYCODE_CONST_DELIMITER = 0x2D +}; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_PUNYCODE_H */ diff --git a/source/myurl/resources.h b/source/myurl/resources.h new file mode 100644 index 0000000..ea71527 --- /dev/null +++ b/source/myurl/resources.h @@ -0,0 +1,180 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_RESOURCES_H +#define MyURL_RESOURCES_H +#pragma once + +static const unsigned char myurl_resources_static_map_query_charset[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x00, 0x3d, 0x00, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const unsigned char myurl_resources_static_map_forbidden_host_code_point[] = +{ + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xff, 0x22, 0x23, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0x3e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7b, 0xff, 0x7d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +/* A C0 control is a code point in the range U+0000 to U+001F, inclusive. The C0 control percent-encode set are C0 controls and all code points greater than U+007E. */ +static const unsigned char myurl_resources_static_map_C0[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* The path percent-encode set is the myurl_resources_static_map_path and code points U+0020, '"', "#", "<", ">", "?", "`", "{", and "}". */ +static const unsigned char myurl_resources_static_map_path[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x00, 0x3d, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x00, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x00, 0x7c, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* The userinfo percent-encode set is the myurl_resources_static_map_path and code points "/", ":", ";", "=", "@", "[", "\", "]", "^", and "|". */ +static const unsigned char myurl_resources_static_map_userinfo[] = +{ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x00, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x61, 0x62, 0x63, + 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, + 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +static const char *myurl_resources_static_map_digits = "0123456789abcdefghijklmnopqrstuvwxyz"; + +#endif /* MyURL_RESOURCES_H */ diff --git a/source/myurl/scheme.c b/source/myurl/scheme.c new file mode 100644 index 0000000..a5142c9 --- /dev/null +++ b/source/myurl/scheme.c @@ -0,0 +1,104 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/url.h" +#include "myurl/scheme.h" +#include "myurl/scheme_resources.h" +#include "mycore/utils/resources.h" + +void myurl_scheme_clean(myurl_t* url, myurl_scheme_t* scheme) +{ + if(scheme->name) + url->callback_free(scheme->name, url->callback_ctx); + + memset(scheme, 0, sizeof(myurl_scheme_t)); +} + +myurl_scheme_t * myurl_scheme_destroy(myurl_t* url, myurl_scheme_t* scheme, bool self_destroy) +{ + if(scheme == NULL) + return NULL; + + if(scheme->name) + url->callback_free(scheme->name, url->callback_ctx); + + if(self_destroy) { + url->callback_free(scheme, url->callback_ctx); + return NULL; + } + + return scheme; +} + +const myurl_scheme_entry_t * myurl_scheme_find_entry(const char* name, size_t length) +{ + size_t idx = ((mycore_string_chars_lowercase_map[ (const unsigned char)name[0] ] * + mycore_string_chars_lowercase_map[ (const unsigned char)name[(length - 1)] ] * + length) + % MyURL_SCHEME_STATIC_INDEX_LENGTH) + 1; + + while (myurl_scheme_entry_static_index[idx].name) + { + if(myurl_scheme_entry_static_index[idx].name_length == length) { + if(mycore_strncasecmp(myurl_scheme_entry_static_index[idx].name, name, length) == 0) + return &myurl_scheme_entry_static_index[idx]; + + if(myurl_scheme_entry_static_index[idx].next) + idx = myurl_scheme_entry_static_index[idx].next; + else + return NULL; + } + else if(myurl_scheme_entry_static_index[idx].name_length > length) { + return NULL; + } + else { + idx = myurl_scheme_entry_static_index[idx].next; + } + } + + return NULL; +} + +myurl_scheme_id_t myurl_scheme_id_by_name(const char *name, size_t length) +{ + const myurl_scheme_entry_t *entry = myurl_scheme_find_entry(name, length); + + if(entry) + return entry->m_id; + + return MyURL_SCHEME_ID_UNDEF; +} + +mystatus_t myurl_scheme_copy(myurl_t* url, myurl_scheme_t* from, myurl_scheme_t* to) +{ + memcpy(to, from, sizeof(myurl_scheme_t)); + + if(from->name) { + to->name = myurl_utils_data_copy(url, from->name, from->length); + + if(to->name == NULL) { + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + } + } + + return MyURL_STATUS_OK; +} + + diff --git a/source/myurl/scheme.h b/source/myurl/scheme.h new file mode 100644 index 0000000..08bd520 --- /dev/null +++ b/source/myurl/scheme.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SCHEME_H +#define MyURL_SCHEME_H +#pragma once + +#include "myurl/myosi.h" +#include "myurl/scheme_const.h" +#include "mycore/utils.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum myurl_scheme_type { + MyURL_SCHEME_TYPE_UNDEF = 0x00, + MyURL_SCHEME_TYPE_SPECIAL = 0x01, + MyURL_SCHEME_TYPE_LOCAL = 0x02, + MyURL_SCHEME_TYPE_HTTP_S = 0x04, + MyURL_SCHEME_TYPE_NETWORK = 0x08, + MyURL_SCHEME_TYPE_FETCH = 0x10 +} +typedef myurl_scheme_type_t; + +struct myurl_scheme { + char* name; + size_t length; + size_t port; + + myurl_scheme_id_t sid; + myurl_scheme_type_t type; +} +typedef myurl_scheme_t; + +struct myurl_scheme_entry { + const char* name; + size_t name_length; + + myurl_scheme_id_t m_id; + size_t port; + myurl_scheme_type_t type; + + size_t next; + size_t curr; +} +typedef myurl_scheme_entry_t; + +void myurl_scheme_clean(myurl_t* url, myurl_scheme_t* scheme); +myurl_scheme_t * myurl_scheme_destroy(myurl_t* url, myurl_scheme_t* scheme, bool self_destroy); + +const myurl_scheme_entry_t * myurl_scheme_find_entry(const char* name, size_t length); +myurl_scheme_id_t myurl_scheme_id_by_name(const char *name, size_t length); + +mystatus_t myurl_scheme_copy(myurl_t* url, myurl_scheme_t* from, myurl_scheme_t* to); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_SCHEME_H */ diff --git a/source/myurl/scheme_const.h b/source/myurl/scheme_const.h new file mode 100644 index 0000000..508c1a5 --- /dev/null +++ b/source/myurl/scheme_const.h @@ -0,0 +1,43 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SCHEME_CONST_H +#define MyURL_SCHEME_CONST_H +#pragma once + +enum myurl_scheme_id { + MyURL_SCHEME_ID_UNDEF = 0x0000, + MyURL_SCHEME_ID_ABOUT = 0x0001, + MyURL_SCHEME_ID_BLOB = 0x0002, + MyURL_SCHEME_ID_DATA = 0x0003, + MyURL_SCHEME_ID_FILE = 0x0004, + MyURL_SCHEME_ID_FILESYSTEM = 0x0005, + MyURL_SCHEME_ID_FTP = 0x0006, + MyURL_SCHEME_ID_GOPHER = 0x0007, + MyURL_SCHEME_ID_HTTP = 0x0008, + MyURL_SCHEME_ID_HTTPS = 0x0009, + MyURL_SCHEME_ID_WS = 0x000a, + MyURL_SCHEME_ID_WSS = 0x000b, + MyURL_SCHEME_ID_LAST_ENTRY = 0x000c +} +typedef myurl_scheme_id_t; + + +#endif /* MyURL_SCHEME_CONST_H */ diff --git a/source/myurl/scheme_resources.h b/source/myurl/scheme_resources.h new file mode 100644 index 0000000..d408479 --- /dev/null +++ b/source/myurl/scheme_resources.h @@ -0,0 +1,64 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SCHEME_RESOURCES_H +#define MyURL_SCHEME_RESOURCES_H +#pragma once + +#define MyURL_SCHEME_STATIC_INDEX_LENGTH 31 + +static const myurl_scheme_entry_t myurl_scheme_entry_static_index[] = +{ + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"https", 5, MyURL_SCHEME_ID_HTTPS, 443, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_HTTP_S, 0, 2}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"blob", 4, MyURL_SCHEME_ID_BLOB, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 8}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"file", 4, MyURL_SCHEME_ID_FILE, 0, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_FETCH, 0, 10}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"wss", 3, MyURL_SCHEME_ID_WSS, 443, MyURL_SCHEME_TYPE_SPECIAL, 0, 12}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"filesystem", 10, MyURL_SCHEME_ID_FILESYSTEM, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 15}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"ftp", 3, MyURL_SCHEME_ID_FTP, 21, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_NETWORK, 0, 18}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"data", 4, MyURL_SCHEME_ID_DATA, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 20}, + {"gopher", 6, MyURL_SCHEME_ID_GOPHER, 70, MyURL_SCHEME_TYPE_SPECIAL, 0, 21}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"about", 5, MyURL_SCHEME_ID_ABOUT, 0, MyURL_SCHEME_TYPE_LOCAL|MyURL_SCHEME_TYPE_FETCH, 0, 27}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"ws", 2, MyURL_SCHEME_ID_WS, 80, MyURL_SCHEME_TYPE_SPECIAL, 0, 29}, + {NULL, 0, MyURL_SCHEME_ID_UNDEF, 0, MyURL_SCHEME_TYPE_UNDEF, 0, 0}, + {"http", 4, MyURL_SCHEME_ID_HTTP, 80, MyURL_SCHEME_TYPE_SPECIAL|MyURL_SCHEME_TYPE_HTTP_S, 0, 31}, +}; + + +#endif /* MyURL_SCHEME_RESOURCES_H */ diff --git a/source/myurl/serialization.c b/source/myurl/serialization.c new file mode 100644 index 0000000..b092f33 --- /dev/null +++ b/source/myurl/serialization.c @@ -0,0 +1,221 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/url.h" +#include "myhtml/serialization.h" + +void myurl_serialization_host(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + switch (url_entry->host.type) { + case MyURL_HOST_TYPE_DOMAIN: + callback(url_entry->host.value.domain.value, url_entry->host.value.domain.length, ctx); + break; + + case MyURL_HOST_TYPE_IPv4: { + char digit_buffer[6]; + char buffer[17] = {0}; + + size_t ipv4_length = 12 + 4; + size_t digit_size = 0; + + unsigned int n = url_entry->host.value.ipv.pieces[0]; + + for(size_t i = 0; i < 4; i++) + { + digit_size = myurl_convert_integer_to_data_without_check_buffer(n % 256, digit_buffer); + + if(digit_size <= ipv4_length) { + ipv4_length -= digit_size; + + memcpy(&buffer[ipv4_length], digit_buffer, sizeof(char) * digit_size); + } + + if(ipv4_length && i != 3) { + ipv4_length--; + buffer[ipv4_length] = '.'; + } + + n = (unsigned int)floor((double)n / 256.0f); + } + + callback(&buffer[ipv4_length], (16 - ipv4_length), ctx); + break; + } + + case MyURL_HOST_TYPE_IPv6: { + callback("[", 1, ctx); + + /* 1 */ + unsigned int *pieces = url_entry->host.value.ipv.pieces; + unsigned int *compress_pointer = NULL; + + char buffer[128] = {0}; + + /* 2, 3 */ + for(size_t i = 0; i < 7; i++) { + if(pieces[i] == 0 && pieces[(i + 1)] == 0) { + compress_pointer = &pieces[i]; + break; + } + } + + /* 4 */ + for(size_t i = 0; i < 8; i++) { + /* 4.1 */ + if(compress_pointer == &pieces[i]) { + + + if(i == 0) + callback("::", 2, ctx); + else + callback(":", 1, ctx); + + i++; + while(i < 8) { + if(pieces[i] != 0) { + i--; + break; + } + + i++; + } + } + else { + /* 4.2 */ + size_t len = myurl_convert_integer_to_hex_data_without_check_buffer((long)pieces[i], buffer); + callback(buffer, len, ctx); + + /* 4.3 */ + if(i != 7) + callback(":", 1, ctx); + } + } + + callback("]", 1, ctx); + + break; + } + + case MyURL_HOST_TYPE_OPAQUE: + callback(url_entry->host.value.opaque.value, url_entry->host.value.opaque.length, ctx); + break; + + default: + break; + } +} + +void myurl_serialization_authority(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + if(url_entry->username_length || url_entry->password_length) { + callback(url_entry->username, url_entry->username_length, ctx); + + if(url_entry->password_length) { + callback(":", 1, ctx); + callback(url_entry->password, url_entry->password_length, ctx); + } + } +} + +void myurl_serialization_auth_host_port(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + callback("//", 2, ctx); + + if(url_entry->username_length || url_entry->password_length) { + myurl_serialization_authority(url_entry, callback, ctx); + callback("@", 1, ctx); + } + + myurl_serialization_host(url_entry, callback, ctx); + + if(url_entry->port_is_set) { + callback(":", 1, ctx); + + char return_str[128] = {0}; + size_t length = myurl_convert_integer_to_data_without_check_buffer((long)url_entry->port, return_str); + + callback(return_str, length, ctx); + } +} + +void myurl_serialization_path(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + if(url_entry->flags & MyURL_FLAGS_CANNOT_BE_BASE_URL) { + callback(url_entry->path.list[0].data, url_entry->path.list[0].length, ctx); + } + else { + for(size_t i = 0; i < url_entry->path.length; i++) { + callback("/", 1, ctx); + callback(url_entry->path.list[i].data, url_entry->path.list[i].length, ctx); + } + } +} + +void myurl_serialization_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + if(url_entry->fragment && url_entry->fragment_length) + callback(url_entry->fragment, url_entry->fragment_length, ctx); +} + +void myurl_serialization_without_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + if(url_entry->scheme.name) + callback(url_entry->scheme.name, url_entry->scheme.length, ctx); + + callback(":", 1, ctx); + + if(url_entry->host.type) { + myurl_serialization_auth_host_port(url_entry, callback, ctx); + } + else if(url_entry->scheme.sid == MyURL_SCHEME_ID_FILE) { + callback("//", 2, ctx); + } + + myurl_serialization_path(url_entry, callback, ctx); + + if(url_entry->query != NULL) { + callback("?", 1, ctx); + + if(url_entry->query_length) + callback(url_entry->query, url_entry->query_length, ctx); + } +} + +void myurl_serialization_with_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx) +{ + myurl_serialization_without_fragment(url_entry, callback, ctx); + + if(url_entry->fragment != NULL) { + callback("#", 1, ctx); + + if(url_entry->fragment_length) + callback(url_entry->fragment, url_entry->fragment_length, ctx); + } +} + +void myurl_serialization(myurl_entry_t* url_entry, bool exclude_fragment_flag, mycore_callback_serialize_f callback, void* ctx) +{ + if(exclude_fragment_flag) + myurl_serialization_without_fragment(url_entry, callback, ctx); + else + myurl_serialization_with_fragment(url_entry, callback, ctx); +} + + diff --git a/source/myurl/serialization.h b/source/myurl/serialization.h new file mode 100644 index 0000000..ea25906 --- /dev/null +++ b/source/myurl/serialization.h @@ -0,0 +1,47 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_SERIALIZATION_H +#define MyURL_SERIALIZATION_H +#pragma once + +#include + +#include "myurl/myosi.h" +#include "myurl/utils.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void myurl_serialization_authority(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_host(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_auth_host_port(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_path(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_with_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization_without_fragment(myurl_entry_t* url_entry, mycore_callback_serialize_f callback, void* ctx); +void myurl_serialization(myurl_entry_t* url_entry, bool exclude_fragment_flag, mycore_callback_serialize_f callback, void* ctx); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_SERIALIZATION_H */ diff --git a/source/myurl/url.c b/source/myurl/url.c new file mode 100644 index 0000000..871eafa --- /dev/null +++ b/source/myurl/url.c @@ -0,0 +1,649 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/url.h" +#include "myurl/resources.h" + +myurl_t * myurl_create(void) +{ + return mycore_calloc(1, sizeof(myurl_t)); +} + +mystatus_t myurl_init(myurl_t* url) +{ + url->callback_malloc = myurl_callback_malloc; + url->callback_free = myurl_callback_free; + url->callback_realloc = myurl_callback_realloc; + url->callback_ctx = url; + + return MyURL_STATUS_OK; +} + +void myurl_clean(myurl_t* url) +{ + memset(url, 0, sizeof(myurl_t)); +} + +myurl_t * myurl_destroy(myurl_t* url, bool self_destroy) +{ + if(url == NULL) + return NULL; + + if(self_destroy) { + mycore_free(url); + return NULL; + } + + return url; +} + +/* + * Entry + */ +myurl_entry_t * myurl_entry_create_and_init(myurl_t* url) +{ + myurl_entry_t *entry = url->callback_malloc(sizeof(myurl_entry_t), url->callback_ctx); + if(entry == NULL) + return NULL; + + memset(entry, 0, sizeof(myurl_entry_t)); + + if(myurl_path_init(url, &entry->path, 56) != MyURL_STATUS_OK) { + return url->callback_free(entry, url->callback_ctx); + } + + entry->url_ref = url; + + return entry; +} + +void myurl_entry_clean(myurl_entry_t* url_entry) +{ + myurl_t* url = url_entry->url_ref; + + if(url_entry->username) + url->callback_free(url_entry->username, url->callback_ctx); + + if(url_entry->password) + url->callback_free(url_entry->password, url->callback_ctx); + + if(url_entry->query) + url->callback_free(url_entry->query, url->callback_ctx); + + if(url_entry->fragment) + url->callback_free(url_entry->fragment, url->callback_ctx); + + myurl_host_destroy(url, &url_entry->host, false); + myurl_path_destroy(url, &url_entry->path, false); + myurl_scheme_destroy(url, &url_entry->scheme, false); + + memset(url_entry, 0, sizeof(myurl_entry_t)); + + url_entry->url_ref = url; +} + +myurl_entry_t * myurl_entry_destroy(myurl_entry_t* url_entry, bool self_destroy) +{ + if(url_entry == NULL) + return NULL; + + myurl_entry_clean(url_entry); + + if(self_destroy) { + return url_entry->url_ref->callback_free(url_entry, url_entry->url_ref->callback_ctx); + } + + return url_entry; +} + +/* + * The CODE + */ +myurl_entry_t * myurl_parse(myurl_t* url, const char* data_url, size_t data_url_size, myurl_entry_t* base_url, mystatus_t* status) +{ + myurl_entry_t* entry = myurl_entry_create_and_init(url); + + if(entry == NULL) { + if(status) + *status = MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + return NULL; + } + + myurl_parser_begin(url, entry, base_url, data_url, data_url_size); + + if(status) + *status = entry->status; + + if(entry->status) + return myurl_entry_destroy(entry, true); + + return entry; +} + +/* api */ +/* callback */ +void myurl_callback_memory_set(myurl_t* url, myurl_callback_malloc_f callback_malloc, myurl_callback_realloc_f callback_realloc, myurl_callback_free_f callback_free, void* ctx) +{ + if(callback_malloc) + url->callback_malloc = callback_malloc; + else + url->callback_malloc = myurl_callback_malloc; + + if(callback_realloc) + url->callback_realloc = callback_realloc; + else + url->callback_realloc = myurl_callback_realloc; + + if(callback_free) + url->callback_free = callback_free; + else + url->callback_free = myurl_callback_free; + + if(ctx) + url->callback_ctx = ctx; + else + url->callback_ctx = url; +} + +void * myurl_callback_memory_context(myurl_t* url) +{ + return url->callback_ctx; +} + +/* api entry */ +/* callback for as_string */ +static mystatus_t myurl_entry_host_callback_for_as_string(const char* data, size_t len, void* ctx) +{ + myurl_utils_serialization_ctx_t *obj_ctx = ctx; + + if(obj_ctx->error) + return MyCORE_STATUS_ERROR; + + if((obj_ctx->length + len + 1) >= obj_ctx->size) { + size_t new_size = obj_ctx->length + len + 128; + + char *tmp = obj_ctx->url->callback_realloc(obj_ctx->data, sizeof(char) * new_size, + obj_ctx->url->callback_ctx); + + if(tmp) { + obj_ctx->size = new_size; + obj_ctx->data = tmp; + } + else + obj_ctx->error = true; + } + + memcpy(&obj_ctx->data[ obj_ctx->length ], data, sizeof(char) * len); + obj_ctx->length += len; + + return MyCORE_STATUS_OK; +} + +static char * myurl_as_string(myurl_entry_t* url_entry, size_t *length, myurl_callback_serialization_func_f func) +{ + if(length) + *length = 0; + + if(url_entry->url_ref == NULL) + return NULL; + + myurl_t* url = url_entry->url_ref; + myurl_utils_serialization_ctx_t ctx = {0}; + + ctx.size = 128; + ctx.data = url->callback_malloc(sizeof(char) * ctx.size, url->callback_ctx); + ctx.url = url; + + if(ctx.data == NULL) + return NULL; + + func(url_entry, myurl_entry_host_callback_for_as_string, &ctx); + + if(ctx.error) { + if(ctx.data) + return url->callback_free(ctx.data, url->callback_ctx); + + return NULL; + } + + if(length) + *length = ctx.length; + + ctx.data[ ctx.length ] = '\0'; + + return ctx.data; +} + +mystatus_t myurl_entry_status(myurl_entry_t* url_entry) +{ + return url_entry->status; +} + +myurl_flags_t myurl_entry_flags(myurl_entry_t* url_entry) +{ + return url_entry->flags; +} + +myurl_t * myurl_entry_url(myurl_entry_t* url_entry) +{ + return url_entry->url_ref; +} + +char * myurl_entry_as_string(myurl_entry_t* url_entry, size_t *length) +{ + return myurl_as_string(url_entry, length, myurl_serialization_with_fragment); +} + +/* scheme */ +myurl_scheme_t * myurl_entry_scheme(myurl_entry_t* url_entry) +{ + return &url_entry->scheme; +} + +const char * myurl_entry_scheme_name(myurl_entry_t* url_entry, size_t* length) +{ + if(length) + *length = url_entry->scheme.length; + + return url_entry->scheme.name; +} + +unsigned int myurl_entry_scheme_port(myurl_entry_t* url_entry) +{ + return (unsigned int)url_entry->scheme.port; +} + +myurl_scheme_id_t myurl_entry_scheme_id(myurl_entry_t* url_entry) +{ + return url_entry->scheme.sid; +} + +myurl_scheme_type_t myurl_entry_scheme_type(myurl_entry_t* url_entry) +{ + return url_entry->scheme.type; +} + +/* authority */ +char * myurl_entry_authority_as_string(myurl_entry_t* url_entry, size_t* length) +{ + return myurl_as_string(url_entry, length, myurl_serialization_authority); +} + +const char * myurl_entry_username(myurl_entry_t* url_entry, size_t *length) +{ + if(length) + *length = url_entry->username_length; + + return url_entry->username; +} + +const char * myurl_entry_password(myurl_entry_t* url_entry, size_t *length) +{ + if(length) + *length = url_entry->password_length; + + return url_entry->password; +} + +/* host */ +myurl_host_t * myurl_entry_host(myurl_entry_t* url_entry) +{ + return &url_entry->host; +} + +char * myurl_entry_host_as_string(myurl_entry_t* url_entry, size_t *length) +{ + return myurl_as_string(url_entry, length, myurl_serialization_host); +} + +myurl_host_type_t myurl_entry_host_type(myurl_entry_t* url_entry) +{ + return url_entry->host.type; +} + +const char * myurl_entry_host_domain(myurl_entry_t* url_entry, size_t *length) +{ + if(url_entry->host.type != MyURL_HOST_TYPE_DOMAIN) { + if(length) + *length = 0; + + return NULL; + } + + if(length) + *length = url_entry->host.value.domain.length; + + return url_entry->host.value.domain.value; +} + +const char * myurl_entry_host_opaque(myurl_entry_t* url_entry, size_t *length) +{ + if(url_entry->host.type != MyURL_HOST_TYPE_OPAQUE) { + if(length) + *length = 0; + + return NULL; + } + + if(length) + *length = url_entry->host.value.opaque.length; + + return url_entry->host.value.opaque.value; +} + +unsigned int myurl_entry_host_ipv4(myurl_entry_t* url_entry) +{ + if(url_entry->host.type != MyURL_HOST_TYPE_IPv4) + return 0; + + return url_entry->host.value.ipv.pieces[0]; +} + +unsigned int * myurl_entry_host_ipv6(myurl_entry_t* url_entry) +{ + if(url_entry->host.type != MyURL_HOST_TYPE_IPv6) + return NULL; + + return url_entry->host.value.ipv.pieces; +} + +/* port */ +bool myurl_entry_port_is_defined(myurl_entry_t* url_entry) +{ + return url_entry->port_is_set; +} + +unsigned int myurl_entry_port(myurl_entry_t* url_entry) +{ + return url_entry->port; +} + +/* path */ +myurl_path_t * myurl_entry_path(myurl_entry_t* url_entry) +{ + return &url_entry->path; +} + +char * myurl_entry_path_as_string(myurl_entry_t* url_entry, size_t* length) +{ + return myurl_as_string(url_entry, length, myurl_serialization_path); +} + +size_t myurl_entry_path_length(myurl_entry_t* url_entry) +{ + return url_entry->path.length; +} + +const char * myurl_entry_path_entry(myurl_entry_t* url_entry, size_t index, size_t *length) +{ + if(url_entry->path.length < index) { + if(length) + *length = 0; + + return NULL; + } + + if(length) + *length = url_entry->path.list[index].length; + + return url_entry->path.list[index].data; +} + +/* query */ +const char * myurl_entry_query(myurl_entry_t* url_entry, size_t *length) +{ + if(length) + *length = url_entry->query_length; + + return url_entry->query; +} + +/* fragment */ +const char * myurl_entry_fragment(myurl_entry_t* url_entry, size_t *length) +{ + if(length) + *length = url_entry->fragment_length; + + return url_entry->fragment; +} + +/* + For changes +*/ +/* scheme */ +const char * myurl_entry_scheme_name_set(myurl_entry_t* url_entry, const char* name, size_t length) +{ + if(url_entry->url_ref == NULL) + return NULL; + + myurl_t* url = url_entry->url_ref; + + if(myurl_utils_data_copy_set(url, name, length, &url_entry->scheme.name, &url_entry->scheme.length)) + return NULL; + + return url_entry->scheme.name; +} + +void myurl_entry_scheme_port_set(myurl_entry_t* url_entry, unsigned int port) +{ + url_entry->scheme.port = port; +} + +void myurl_entry_scheme_id_set(myurl_entry_t* url_entry, myurl_scheme_id_t sid) +{ + url_entry->scheme.sid = sid; +} + +void myurl_entry_scheme_type_set(myurl_entry_t* url_entry, myurl_scheme_type_t type) +{ + url_entry->scheme.type = type; +} + +void myurl_entry_scheme_clean(myurl_entry_t* url_entry) +{ + if(url_entry->url_ref) + myurl_scheme_clean(url_entry->url_ref, &url_entry->scheme); +} + +/* authority */ +const char * myurl_entry_username_set(myurl_entry_t* url_entry, const char* username, size_t length) +{ + if(url_entry->url_ref == NULL) + return NULL; + + myurl_t* url = url_entry->url_ref; + + if(myurl_utils_data_copy_set(url, username, length, &url_entry->username, &url_entry->username_length)) + return NULL; + + return url_entry->username; +} + +const char * myurl_entry_password_set(myurl_entry_t* url_entry, const char* password, size_t length) +{ + if(url_entry->url_ref == NULL) + return NULL; + + myurl_t* url = url_entry->url_ref; + + if(myurl_utils_data_copy_set(url, password, length, &url_entry->password, &url_entry->password_length)) + return NULL; + + return url_entry->password; +} + +/* host */ +mystatus_t myurl_entry_host_set(myurl_entry_t* url_entry, const char* host, size_t length) +{ + if(url_entry->url_ref == NULL) + return MyURL_STATUS_ERROR; + + myurl_host_t new_host; + memset(&new_host, 0, sizeof(myurl_host_t)); + + mystatus_t status = myurl_host_parser(url_entry->url_ref, &new_host, host, length, (url_entry->scheme.type & MyURL_SCHEME_TYPE_SPECIAL)); + + if(status) + return status; + + myurl_host_clean(url_entry->url_ref, &url_entry->host); + url_entry->host = new_host; + + return status; +} + +/* port */ +void myurl_entry_port_set(myurl_entry_t* url_entry, unsigned int port) +{ + url_entry->port = port; + url_entry->port_is_set = true; +} + +/* path */ +mystatus_t myurl_entry_path_set(myurl_entry_t* url_entry, const char* path, size_t length) +{ + if(url_entry->url_ref == NULL || path == NULL) + return MyURL_STATUS_ERROR; + + mystatus_t status; + myurl_entry_t *new_entry = myurl_parse(url_entry->url_ref, path, length, url_entry, &status); + + if(new_entry) { + status = myurl_path_copy(url_entry->url_ref, &new_entry->path, &url_entry->path); + + myurl_entry_destroy(new_entry, true); + } + + return status; +} + +mystatus_t myurl_entry_path_append_entry(myurl_entry_t* url_entry, const char* entry, size_t length) +{ + if(url_entry->url_ref == NULL || entry == NULL) + return MyURL_STATUS_ERROR; + + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url_entry->url_ref, entry, length, myurl_resources_static_map_path, &buffer_length); + + if(buffer == NULL) + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + if(myurl_path_push(url_entry->url_ref, &url_entry->path, buffer, buffer_length) == NULL) + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + return MyURL_STATUS_OK; +} + +void myurl_entry_path_pop_entry(myurl_entry_t* url_entry) +{ + myurl_path_pop(&url_entry->path); +} + +mystatus_t myurl_entry_path_replace_entry(myurl_entry_t* url_entry, size_t index, const char* entry, size_t length) +{ + if(url_entry->url_ref == NULL || entry == NULL) + return MyURL_STATUS_ERROR; + + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url_entry->url_ref, entry, length, myurl_resources_static_map_path, &buffer_length); + + if(buffer == NULL) + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + if(myurl_path_push_to_index(url_entry->url_ref, &url_entry->path, index, buffer, buffer_length) == NULL) + return MyURL_STATUS_ERROR_MEMORY_ALLOCATION; + + return MyURL_STATUS_OK; +} + +void myurl_entry_path_remove_entry(myurl_entry_t* url_entry, size_t index) +{ + if(url_entry->url_ref == NULL) + return; + + myurl_path_remove_by_index(url_entry->url_ref, &url_entry->path, index); +} + +void myurl_entry_path_clean(myurl_entry_t* url_entry) +{ + if(url_entry->url_ref == NULL) + return; + + myurl_path_clean(url_entry->url_ref, &url_entry->path); +} + +/* query */ +const char * myurl_entry_query_set(myurl_entry_t* url_entry, const char* query, size_t length) +{ + if(url_entry->url_ref == NULL) + return NULL; + + myurl_t* url = url_entry->url_ref; + + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url, query, length, myurl_resources_static_map_query_charset, &buffer_length); + + if(buffer == NULL) + return NULL; + + if(url_entry->query) + url->callback_free(url_entry->query, url->callback_ctx); + + url_entry->query = buffer; + url_entry->query_length = buffer_length; + + return url_entry->query; +} + +/* fragment */ +const char * myurl_entry_fragment_set(myurl_entry_t* url_entry, const char* fragment, size_t length) +{ + if(url_entry->url_ref == NULL) + return NULL; + + myurl_t* url = url_entry->url_ref; + + size_t buffer_length; + char *buffer = myurl_utils_percent_encode(url, fragment, length, myurl_resources_static_map_C0, &buffer_length); + + if(buffer == NULL) + return NULL; + + if(url_entry->fragment) + url->callback_free(url_entry->fragment, url->callback_ctx); + + url_entry->fragment = buffer; + url_entry->fragment_length = buffer_length; + + return url_entry->fragment; +} + +/* for free char* */ +void myurl_entry_free_string(myurl_entry_t* url_entry, char* string) +{ + if(url_entry->url_ref == NULL) + return; + + if(string) + url_entry->url_ref->callback_free(string, url_entry->url_ref->callback_ctx); +} + + diff --git a/source/myurl/url.h b/source/myurl/url.h new file mode 100644 index 0000000..9877299 --- /dev/null +++ b/source/myurl/url.h @@ -0,0 +1,195 @@ +/* + Copyright (C) 2016-2107 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_H +#define MyURL_H +#pragma once + +#include "myurl/myosi.h" +#include "myhtml/mystring.h" +#include "myurl/scheme.h" +#include "myurl/host.h" +#include "myurl/path.h" +#include "myurl/utils.h" +#include "myurl/serialization.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct myurl_entry { + myurl_scheme_t scheme; + myurl_host_t host; + myurl_path_t path; + + char* username; + size_t username_length; + + char* password; + size_t password_length; + + unsigned int port; + bool port_is_set; + + char* query; + size_t query_length; + + char* fragment; + size_t fragment_length; + + myurl_flags_t flags; + mystatus_t status; + + myurl_t* url_ref; +}; + +struct myhtml_url { + /* parser */ + myurl_state_f state; + myurl_state_f state_override; + myencoding_t encoding; + + /* memory */ + myurl_callback_malloc_f callback_malloc; + myurl_callback_realloc_f callback_realloc; + myurl_callback_free_f callback_free; + void* callback_ctx; + + /* work variables */ + size_t begin; + /* if URL include '\t' or '\n', + then buffer copied removing all '\t' and '\n' */ + char *copy; +}; + +myurl_t * myurl_create(void); +mystatus_t myurl_init(myurl_t* url); +void myurl_clean(myurl_t* url); +myurl_t * myurl_destroy(myurl_t* url, bool self_destroy); + +myurl_entry_t * myurl_parse(myurl_t* url, const char* data_url, size_t data_url_size, myurl_entry_t* base_url, mystatus_t* status); + +myurl_entry_t * myurl_entry_create_and_init(myurl_t* url); +void myurl_entry_clean(myurl_entry_t* url_entry); +myurl_entry_t * myurl_entry_destroy(myurl_entry_t* url_entry, bool self_destroy); + +/* api */ +/* callback */ +void myurl_callback_memory_set(myurl_t* url, myurl_callback_malloc_f callback_malloc, myurl_callback_realloc_f callback_realloc, myurl_callback_free_f callback_free, void* ctx); +void * myurl_callback_memory_context(myurl_t* url); + +/* api entry */ +/* for read */ +mystatus_t myurl_entry_status(myurl_entry_t* url_entry); +myurl_flags_t myurl_entry_flags(myurl_entry_t* url_entry); +myurl_t * myurl_entry_url(myurl_entry_t* url_entry); + +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_as_string(myurl_entry_t* url_entry, size_t *length); + +/* scheme */ +myurl_scheme_t * myurl_entry_scheme(myurl_entry_t* url_entry); +const char * myurl_entry_scheme_name(myurl_entry_t* url_entry, size_t* length); +unsigned int myurl_entry_scheme_port(myurl_entry_t* url_entry); +myurl_scheme_id_t myurl_entry_scheme_id(myurl_entry_t* url_entry); +myurl_scheme_type_t myurl_entry_scheme_type(myurl_entry_t* url_entry); + +/* authority */ +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_authority_as_string(myurl_entry_t* url_entry, size_t* length); + +const char * myurl_entry_username(myurl_entry_t* url_entry, size_t* length); +const char * myurl_entry_password(myurl_entry_t* url_entry, size_t* length); + +/* host */ +myurl_host_t * myurl_entry_host(myurl_entry_t* url_entry); + +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_host_as_string(myurl_entry_t* url_entry, size_t *length); + +myurl_host_type_t myurl_entry_host_type(myurl_entry_t* url_entry); +const char * myurl_entry_host_domain(myurl_entry_t* url_entry, size_t* length); +const char * myurl_entry_host_opaque(myurl_entry_t* url_entry, size_t* length); +unsigned int myurl_entry_host_ipv4(myurl_entry_t* url_entry); +unsigned int * myurl_entry_host_ipv6(myurl_entry_t* url_entry); + +/* port */ +bool myurl_entry_port_is_defined(myurl_entry_t* url_entry); +unsigned int myurl_entry_port(myurl_entry_t* url_entry); + +/* path */ +myurl_path_t * myurl_entry_path(myurl_entry_t* url_entry); + +/* don't forget call 'myurl_entry_free_string' after use */ +char * myurl_entry_path_as_string(myurl_entry_t* url_entry, size_t* length); + +size_t myurl_entry_path_length(myurl_entry_t* url_entry); +const char * myurl_entry_path_entry(myurl_entry_t* url_entry, size_t index, size_t* length); + +/* query */ +const char * myurl_entry_query(myurl_entry_t* url_entry, size_t* length); + +/* fragment */ +const char * myurl_entry_fragment(myurl_entry_t* url_entry, size_t* length); + +/* + For changes +*/ +/* scheme */ +const char * myurl_entry_scheme_name_set(myurl_entry_t* url_entry, const char* name, size_t length); +void myurl_entry_scheme_port_set(myurl_entry_t* url_entry, unsigned int port); +void myurl_entry_scheme_id_set(myurl_entry_t* url_entry, myurl_scheme_id_t sid); +void myurl_entry_scheme_type_set(myurl_entry_t* url_entry, myurl_scheme_type_t type); +void myurl_entry_scheme_clean(myurl_entry_t* url_entry); + +/* authority */ +const char * myurl_entry_username_set(myurl_entry_t* url_entry, const char* username, size_t length); +const char * myurl_entry_password_set(myurl_entry_t* url_entry, const char* password, size_t length); + +/* host */ +mystatus_t myurl_entry_host_set(myurl_entry_t* url_entry, const char* host, size_t length); + +/* port */ +void myurl_entry_port_set(myurl_entry_t* url_entry, unsigned int port); + +/* path */ +mystatus_t myurl_entry_path_set(myurl_entry_t* url_entry, const char* path, size_t length); +mystatus_t myurl_entry_path_append_entry(myurl_entry_t* url_entry, const char* entry, size_t length); +void myurl_entry_path_pop_entry(myurl_entry_t* url_entry); +mystatus_t myurl_entry_path_replace_entry(myurl_entry_t* url_entry, size_t index, const char* entry, size_t length); +void myurl_entry_path_remove_entry(myurl_entry_t* url_entry, size_t index); +void myurl_entry_path_clean(myurl_entry_t* url_entry); + +/* query */ +const char * myurl_entry_query_set(myurl_entry_t* url_entry, const char* query, size_t length); + +/* fragment */ +const char * myurl_entry_fragment_set(myurl_entry_t* url_entry, const char* fragment, size_t length); + +/* for free resources for char* */ +void myurl_entry_free_string(myurl_entry_t* url_entry, char* string); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_H */ + + diff --git a/source/myurl/utils.c b/source/myurl/utils.c new file mode 100644 index 0000000..6c951b9 --- /dev/null +++ b/source/myurl/utils.c @@ -0,0 +1,461 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include "myurl/url.h" +#include "myurl/utils.h" +#include "myurl/resources.h" +#include "mycore/utils/resources.h" + +/* data */ +char * myurl_utils_data_copy(myurl_t* url, const char* data, size_t size) +{ + char *copy = url->callback_malloc(((sizeof(char) * size) + 1), url->callback_ctx); + + if(copy) { + memcpy(copy, data, sizeof(char) * size); + copy[size] = '\0'; + } + + return copy; +} + +mystatus_t myurl_utils_data_copy_set(myurl_t* url, const char* data, size_t size, char** to, size_t* to_length) +{ + if(data == NULL) { + *to = NULL; + *to_length = 0; + + return MyURL_STATUS_OK; + } + + char *copy; + + /* mem */ + if(*to) { + if((*to_length + 1) < size) + copy = url->callback_realloc(*to, (sizeof(char) * (size + 1)), url->callback_ctx); + else + copy = *to; + } + else + copy = url->callback_malloc(((sizeof(char) * size) + 1), url->callback_ctx); + + /* process */ + if(copy) { + *to = copy; + *to_length = size; + + memcpy(copy, data, sizeof(char) * size); + + copy[size] = '\0'; + } + else { + *to_length = 0; + return MyURL_STATUS_ERROR; + } + + return MyURL_STATUS_OK; +} + +mystatus_t myurl_utils_data_copy_append(myurl_t* url, const char* data, size_t size, char** to, size_t* to_length) +{ + if(data == NULL) { + if(*to) + *to = url->callback_free(*to, url->callback_ctx); + + *to = NULL; + *to_length = 0; + + return MyURL_STATUS_OK; + } + + char *copy; + + /* mem */ + if(*to) { + if((*to_length + 1) < size) + copy = url->callback_realloc(*to, (sizeof(char) * (size + *to_length)) + 1, url->callback_ctx); + else + copy = *to; + } + else + copy = url->callback_malloc(((sizeof(char) * size) + 1), url->callback_ctx); + + /* process */ + if(copy) { + *to = copy; + + memcpy(©[ *to_length ], data, sizeof(char) * size); + (*to_length) += size; + + copy[size] = '\0'; + } + else { + *to_length = 0; + return MyURL_STATUS_ERROR; + } + + return MyURL_STATUS_OK; +} + +void myurl_utils_data_set_null(myurl_t* url, char** to, size_t* length) +{ + if(*to) + *to = url->callback_free(*to, url->callback_ctx); + + if(length) + *length = 0; +} + +void myurl_utils_data_set_empty(myurl_t* url, char** to, size_t* length) +{ + if(*to == NULL) + *to = url->callback_malloc(sizeof(char), url->callback_ctx); + + if(length) + *length = 0; + + *to[0] = '\0'; +} + +/* converter */ +char * myurl_utils_percent_encode(myurl_t* url, const char* data, size_t size, const unsigned char* encode_set, size_t* return_length) +{ + size_t new_size = size; + const unsigned char *u_data = (const unsigned char*)data; + + size_t len; + for(len = 0; len < size; len++) { + if(encode_set[ u_data[len] ] == 0x00) + new_size += 2; + } + + char *out = url->callback_malloc((sizeof(char) * new_size) + 1, url->callback_ctx); + if(out == NULL) { + if(return_length) + *return_length = 0; + + return NULL; + } + + char *out_link = out; + + len = 0; + while(len < size) + { + if(encode_set[ u_data[len] ] == 0x00) { + const char *two_hex = mycore_string_char_to_two_hex_value[ u_data[len] ]; + + *out = '%'; out++; + *out = (char)mycore_string_chars_uppercase_map[ (unsigned char)two_hex[0] ]; out++; + *out = (char)mycore_string_chars_uppercase_map[ (unsigned char)two_hex[1] ]; out++; + *out = '\0'; + } + else { + *out = data[len]; + out++; + } + + len++; + } + + *out = '\0'; + + if(return_length) + *return_length = new_size; + + return out_link; +} + +/* converter */ +size_t myurl_utils_percent_decode_bytes_in_data(char* data, size_t size) +{ + unsigned char *u_data = (unsigned char*)data; + unsigned char tmp = '\0'; + + size_t len = 0, offset = 0; + while(len < size) + { + if(u_data[len] == '%' && (len + 2) < size) { + size_t pos = len; + len++; + + if(mycore_string_chars_hex_map[ u_data[len] ] != 0xFF && + mycore_string_chars_hex_map[ u_data[(len + 1)] ] != 0xFF) + { + tmp = mycore_string_chars_hex_map[ u_data[len] ]; + tmp = (tmp << 4) | mycore_string_chars_hex_map[ u_data[(len + 1)] ]; + + u_data[(pos - offset)] = tmp; + + offset += 2; + len++; + } + else { + len--; + + if(offset) + u_data[(len - offset)] = data[len]; + } + + len++; + } + else { + if(offset) + u_data[(len - offset)] = data[len]; + + len++; + } + } + + if(offset) { + size_t new_size = (len - offset); + data[new_size] = '\0'; + + return new_size; + } + + return size; +} + +bool myurl_utils_is_windows_drive_letter(const char* data, size_t length, size_t size) +{ + if(data == NULL) + return false; + + length++; + + if(length >= size) + return false; + + return mycore_string_alpha_character[ (unsigned char)data[(length - 1)] ] != 0xff && + (data[length] == ':' || data[length] == '|'); +} + +bool myurl_utils_is_double_dot_path_segment(const char* data, size_t length) +{ + if(length < 2) + return false; + + if(*data == '.' && data[1] == '.') { + if(length == 2) + return true; + + return false; + } + + if(length < 4) + return false; + + if(*data == '.' && data[1] == '%' && data[2] == '2' && data[3] == 'e') { + if(length == 4) + return true; + + return false; + } + + if(*data == '%' && data[1] == '2' && data[2] == 'e' && data[3] == '.') { + if(length == 4) + return true; + + return false; + } + + if(length != 6) + return false; + + if(*data == '%' && data[1] == '2' && data[2] == 'e' && data[3] == '%' && data[4] == '2' && data[5] == 'e') { + return true; + } + + return false; +} + +bool myurl_utils_is_single_dot_path_segment(const char* data, size_t length) +{ + if(length < 1) + return false; + + if(*data == '.') { + if(length == 1) + return true; + + return false; + } + + if(length != 3) + return false; + + if(*data == '%' && data[1] == '2' && data[2] == 'e') { + return true; + } + + return false; +} + +size_t myurl_convert_integer_to_data_without_check_buffer(long digit, char* return_str) +{ + size_t length = 0; + + if(digit != 0) { + if(digit < 0) { + length++; + digit -= digit; + + return_str[0] = '-'; + } + + /* calc end char count */ + length += (size_t)floor(log10( labs(digit) )) + 1; + } + else { + return_str[0] = '0'; + return_str[1] = '\0'; + + return 1; + } + + for(size_t i = 0; i < length; i++) { + return_str[ ((length - i) - 1) ] = (char)myurl_resources_static_map_digits[ digit % 10 ]; + digit /= 10; + } + + return_str[length] = '\0'; + return length; +} + +size_t myurl_convert_integer_to_hex_data_without_check_buffer(long digit, char* return_str) +{ + size_t length = 0; + + if(digit != 0) { + if(digit < 0) { + length++; + digit -= digit; + + return_str[0] = '-'; + } + + /* calc end char count */ + long tmp_digit = digit; + while(tmp_digit) {length++; tmp_digit /= 16;} + } + else { + return_str[0] = '0'; + return_str[1] = '\0'; + + return 1; + } + + size_t tmp_length = length; + + while(digit) { + unsigned long temp = digit % 16; + + tmp_length--; + if(temp < 10) + return_str[tmp_length] = (char)(temp + 48); + else + return_str[tmp_length] = (char)(temp + 87); + + digit /= 16; + } + + return_str[length] = '\0'; + return length; +} + +//void myurl_utils_data_set(myurl_parser_t* parser, myurl_parser_data_t* parse_data, const unsigned char* data, size_t length) +//{ +// if(parse_data->data == NULL) { +// parse_data->size = (length + 1); +// parse_data->length = length; +// +// parse_data->data = (unsigned char*)mchar_async_malloc(parser->mchar, parser->node_idx, parse_data->size); +// } +// else if(length >= parse_data->size) { +// parse_data->size = (length + 1); +// parse_data->length = length; +// +// parse_data->data = (unsigned char*)mchar_async_realloc(parser->mchar, parser->node_idx, +// (char*)parse_data->data, 0, parse_data->size); +// } +// +// if(data && length) { +// memcpy(parse_data->data, data, sizeof(unsigned char) * length); +// } +// +// parse_data->data[length] = '\0'; +//} +// +//void myurl_utils_data_append(myurl_parser_t* parser, myurl_parser_data_t* parse_data, const unsigned char* data, size_t length) +//{ +// if(parse_data->data == NULL) { +// parse_data->size = (length + 1); +// parse_data->data = (unsigned char*)mchar_async_malloc(parser->mchar, parser->node_idx, parse_data->size); +// } +// else if((parse_data->length + length) >= parse_data->size) { +// parse_data->size = (parse_data->length + length + 1); +// parse_data->data = (unsigned char*)mchar_async_realloc(parser->mchar, parser->node_idx, +// (char*)parse_data->data, 0, parse_data->size); +// } +// +// if(data && length) { +// memcpy(&parse_data->data[parse_data->length], data, sizeof(unsigned char) * length); +// } +// +// parse_data->length = parse_data->length + length; +// parse_data->data[parse_data->length] = '\0'; +//} +// +//void myurl_utils_data_copy(myurl_parser_t* parser, myurl_parser_data_t* to, const myurl_parser_data_t* from) +//{ +// if(to->data == NULL) { +// to->size = (from->length + 1); +// to->length = from->length; +// +// to->data = (unsigned char*)mchar_async_malloc(parser->mchar, parser->node_idx, to->size); +// } +// else if(from->length >= to->size) { +// to->size = (from->length + 1); +// to->length = from->length; +// +// to->data = (unsigned char*)mchar_async_realloc(parser->mchar, parser->node_idx, +// (char*)to->data, 0, to->size); +// } +// +// if(from->data && to->length) { +// memcpy(to->data, from->data, sizeof(unsigned char) * to->length); +// } +// +// to->data[to->length] = '\0'; +//} +// +//void myurl_utils_data_destroy(myurl_parser_t* parser, myurl_parser_data_t* parse_data, bool self_destroy) +//{ +// mchar_async_free(parser->mchar, parser->node_idx, (char*)parse_data->data); +// +// if(self_destroy) { +// mycore_free(parse_data); +// } +//} + + + diff --git a/source/myurl/utils.h b/source/myurl/utils.h new file mode 100644 index 0000000..ab67010 --- /dev/null +++ b/source/myurl/utils.h @@ -0,0 +1,73 @@ +/* + Copyright (C) 2016-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin avl_treet, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#ifndef MyURL_UTILS_H +#define MyURL_UTILS_H +#pragma once + +typedef struct myurl_utils_data_list myurl_utils_data_list_t; + +#include "myurl/myosi.h" +#include "myurl/parser.h" +#include "myhtml/mystring.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct myurl_utils_serialization_ctx { + char* data; + size_t size; + size_t length; + + myurl_t* url; + bool error; +} +typedef myurl_utils_serialization_ctx_t; + +char * myurl_utils_data_copy(myurl_t* url, const char* data, size_t size); +mystatus_t myurl_utils_data_copy_set(myurl_t* url, const char* data, size_t size, char** to, size_t* to_length); +mystatus_t myurl_utils_data_copy_append(myurl_t* url, const char* data, size_t size, char** to, size_t* to_length); +void myurl_utils_data_set_null(myurl_t* url, char** to, size_t* length); +void myurl_utils_data_set_empty(myurl_t* url, char** to, size_t* length); +char * myurl_utils_percent_encode(myurl_t* url, const char* data, size_t size, const unsigned char* encode_set, size_t* return_length); +size_t myurl_utils_percent_decode_bytes_in_data(char* data, size_t size); + +bool myurl_utils_is_windows_drive_letter(const char* data, size_t length, size_t size); +bool myurl_utils_is_double_dot_path_segment(const char* data, size_t length); +bool myurl_utils_is_single_dot_path_segment(const char* data, size_t length); + +size_t myurl_convert_integer_to_data_without_check_buffer(long digit, char* return_str); +size_t myurl_convert_integer_to_hex_data_without_check_buffer(long digit, char* return_str); + +//void myurl_utils_data_set(myurl_parser_t* parser, myurl_parser_data_t* parse_data, const unsigned char* data, size_t length); +//void myurl_utils_data_append(myurl_parser_t* parser, myurl_parser_data_t* parse_data, const unsigned char* data, size_t length); +//void myurl_utils_data_copy(myurl_parser_t* parser, myurl_parser_data_t* to, const myurl_parser_data_t* from); +//void myurl_utils_data_destroy(myurl_parser_t* parser, myurl_parser_data_t* parse_data, bool self_destroy); + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* MyURL_UTILS_H */ diff --git a/test/Makefile b/test/Makefile index b7dc66d..e1a8bf1 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,50 +1,90 @@ TARGET := test -SRCDIR := test +SRCDIR := . CC ?= gcc -LIBS := ../lib/libmodest_static.a -LDLIBS := $(LIBS) -INCLUDE_TMP := include +# ARGS +# +# BINARY_OPTIMIZATION_LEVEL, default -O2 +# MODEST_BUILD_WITHOUT_THREADS, YES or (NO or undefined), default undefined +# -MODEST_OPTIMIZATION_LEVEL ?= -O2 +.DEFAULT_GOAL := all -CFLAGS ?= -Wall -Werror -CFLAGS += $(MODEST_OPTIMIZATION_LEVEL) -Wno-unused-variable -fPIC --std=c99 -I../include +#******************** +# other Makefile +#*************** +BINARY_PATH_RELATIVE := .. +MODEST_SOURCE := $(BINARY_PATH_RELATIVE)/source +include $(BINARY_PATH_RELATIVE)/Makefile.bin.cfg -MODEST_BUILD_WITHOUT_THREADS ?= NO -ifeq ($(MODEST_BUILD_WITHOUT_THREADS),YES) - $(info Build Tests without POSIX Threads) -else - $(info Build Examples with POSIX Threads) - CFLAGS += -pthread -endif +BINARY_TO_DIR := $(BINARY_PATH_RELATIVE)/$(TEST_DIR_BASE) +TEST_DIR_RELATIVE := $(BINARY_PATH_RELATIVE)/$(TEST_DIR) -ifeq ($(OS),Windows_NT) -else - UNAM := $(shell uname -s) - ifeq ($(UNAM),Darwin) - else - CFLAGS += -D_POSIX_C_SOURCE=199309L - endif -endif +#******************** +# Build +#*************** +BINARY_BUILD_MODULES ?= $(dir $(wildcard $(SRCDIR)/*/)) +BINARY_BUILD_MODULES_LIST := $(strip $(foreach dir,$(BINARY_BUILD_MODULES),$(word 2, $(subst $(MODEST_DIR_SEPARATOR), , $(dir))) )) +BINARY_BUILD_MODULES_MAKEFILES_LIST := $(foreach dir,$(BINARY_BUILD_MODULES_LIST),$(dir)/Makefile.mk) -find_files_h = $(wildcard $(dir)/*.h) -find_files_c = $(wildcard $(dir)/*.c) +#******************** +# Targets +#*************** +BINARY_BUILD_MODULES_TARGET := $(BINARY_BUILD_MODULES_LIST) +BINARY_BUILD_MODULES_TARGET_ALL := $(foreach dir,$(BINARY_BUILD_MODULES_TARGET),$(dir)_all) +BINARY_BUILD_MODULES_TARGET_CLEAN := $(foreach dir,$(BINARY_BUILD_MODULES_TARGET),$(dir)_clean) -SUBDIRS := mycss myhtml myhtml/utils -HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) -SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) -#SRCS_FN += $(foreach dir,$(SUBDIRS),$(notdir $(find_files_c))) +#******************** +# Utils +#*************** +define BYNARY_UTILS_NEW_LINE -OBJS := $(patsubst %.c,%,$(SRCS)) -#OBJS_RM := $(patsubst %.c,%,$(SRCS_FN)) -all: $(TARGET) +endef +BINARY_UTILS_OBJS = $(patsubst %.c,%,$(foreach dir,$2,$(wildcard $(SRCDIR)/$1/$(dir)/*.c))) +BINARY_UTILS_CREATE_DIR = mkdir -p $(BINARY_TO_DIR)/$(subst /.,,$1) $(BYNARY_UTILS_NEW_LINE) +BINARY_UTILS_CREATE_DIRS = $(foreach dir,$(BINARY_BUILD_MODULES_LIST),$(foreach path,$($(dir)_dirs),$(call BINARY_UTILS_CREATE_DIR,$(dir)/$(path)))) -$(TARGET): $(OBJS) +#******************** +# Include all modules Makefile.mk +#*************** +include $(BINARY_BUILD_MODULES_MAKEFILES_LIST) -clean: - rm -f $(OBJS) +#******************** +# Set ARGS for flags +#*************** +override CFLAGS += $(BINARY_CFLAGS) +override LDFLAGS += $(BINARY_LDFLAGS) +override LDLIBS += $(BINARY_LIBRARIES) -.PHONY: all \ No newline at end of file +#******************** +# Objects +#*************** +BINARY_BUILD_EXECUTE ?= $(foreach dir,$(BINARY_BUILD_MODULES_TARGET),$($(dir)_objs)) +BINARY_BUILD_EXECUTE_CLEAN := $(foreach path,$(BINARY_BUILD_EXECUTE),$(subst ./,,$(path))) +BINARY_BUILD_EXECUTE_TO_CLEAN := $(foreach path,$(BINARY_BUILD_EXECUTE_CLEAN),rm -f $(BINARY_TO_DIR)/$(path) $(BYNARY_UTILS_NEW_LINE)) +BINARY_BUILD_DIRS_TO_CLEAN := $(foreach path,$(BINARY_BUILD_MODULES_LIST),rm -rf $(BINARY_TO_DIR)/$(path) $(BYNARY_UTILS_NEW_LINE)) +BINARY_BUILD_EXECUTE_COPY := $(foreach path,$(BINARY_BUILD_EXECUTE_CLEAN),cp $(path) $(BINARY_TO_DIR)/$(dir $(path)) $(BYNARY_UTILS_NEW_LINE)) +BINARY_BUILD_EXECUTE_COPY_ALL := $(BINARY_UTILS_CREATE_DIRS) $(BINARY_BUILD_EXECUTE_COPY) +BINARY_BUILD_RUN_ALL_TEST := $(foreach dir,$(BINARY_BUILD_EXECUTE_CLEAN),$(dir) $($(word 1,$(subst /, ,$(dir)))_$(notdir $(dir))) $(BYNARY_UTILS_NEW_LINE)) + +#******************** +# Target options +#*************** +all: build + $(BINARY_BUILD_EXECUTE_COPY_ALL) + +build: $(BINARY_BUILD_EXECUTE_CLEAN) + +clean: $(BINARY_BUILD_MODULES_TARGET_CLEAN) + $(BINARY_BUILD_EXECUTE_TO_CLEAN) + $(BINARY_BUILD_DIRS_TO_CLEAN) + +copy: + $(BINARY_BUILD_EXECUTE_COPY_ALL) + +run: all + $(BINARY_BUILD_RUN_ALL_TEST) + +.PHONY: all copy clean $(BINARY_BUILD_MODULES_TARGET_ALL) diff --git a/test/mycore/Makefile.mk b/test/mycore/Makefile.mk new file mode 100644 index 0000000..8c586ab --- /dev/null +++ b/test/mycore/Makefile.mk @@ -0,0 +1,7 @@ +mycore_dirs := utils +mycore_objs := $(call BINARY_UTILS_OBJS,mycore,$(mycore_dirs)) + +mycore_all: $(mycore_objs) + +mycore_clean: + rm -f $(mycore_objs) diff --git a/test/mycore/data/encoding/detect_meta.html b/test/mycore/data/encoding/detect_meta.html new file mode 100644 index 0000000..e868f3f --- /dev/null +++ b/test/mycore/data/encoding/detect_meta.html @@ -0,0 +1,736 @@ +koi8-r + + +koi8-r + + +koi8-r + + +utf-8 + + +utf-8 + + +windows-1251 + + +windows-1251 + + +utf-8 + + +utf-8 + + +WINDOWS-1252 + + +utf-8 + + +utf-8 + + +utf-8 + + +utf-8 + + +not-determined + + +not-determined + + +not-determined + + +ibm866 + + +ibm866 + + +ibm866 + + +ibm866 + + +ISO-2022-JP + + +ISO-2022-JP + + +EUC-JP + + +not-determined + + +EUC-KR + + +EUC-KR + + +SHIFT_JIS + + + +windows-874 + + +iso-8859-2 + + +iso-8859-3 + + +iso-8859-4 + + +shift_jis + + +iso-8859-5 + + +iso-8859-6 + + +iso-8859-10 + + +iso-8859-3 + + +iso-8859-13 + + +windows-1252 + + +windows-1254 + + +iso-8859-6 + + +iso-8859-7 + + +macintosh + + +iso-8859-8 + + +windows-1251 + + +koi8-u + + +windows-1254 + + +iso-8859-6 + + +iso-8859-4 + + +iso-8859-14 + + +iso-8859-4 + + +iso-8859-10 + + +windows-1252 + + +iso-8859-3 + + +iso-8859-2 + + +iso-8859-2 + + +iso-8859-8 + + +macintosh + + +windows-1253 + + +gbk + + +windows-1258 + + +iso-8859-4 + + +iso-8859-4 + + +iso-8859-5 + + +iso-8859-14 + + +iso-8859-10 + + +iso-8859-6 + + +iso-8859-6 + + +iso-8859-7 + + +windows-1254 + + +iso-8859-2 + + +iso-8859-8 + + +iso-8859-8 + + +iso-8859-8 + + +windows-1254 + + +windows-1252 + + +iso-8859-14 + + +iso-8859-10 + + +windows-1252 + + +shift_jis + + +iso-8859-15 + + +windows-1258 + + +windows-1256 + + +gbk + + +windows-1252 + + +iso-8859-7 + + +euc-jp + + +iso-8859-4 + + +big5 + + +windows-1255 + + +koi8-r + + +windows-1257 + + +windows-874 + + +windows-1251 + + +utf-8 + + +iso-8859-5 + + +iso-8859-7 + + +iso-8859-8 + + +macintosh + + +windows-1250 + + +gbk + + +windows-1252 + + +iso-8859-3 + + +iso-8859-4 + + +iso-8859-5 + + +iso-8859-8 + + +iso-8859-6 + + +iso-8859-8 + + +gbk + + +iso-8859-6 + + +iso-8859-10 + + +windows-874 + + +windows-1252 + + +iso-8859-7 + + +shift_jis + + +iso-8859-5 + + +iso-8859-15 + + +macintosh + + +windows-1252 + + +euc-kr + + +euc-kr + + +utf-8 + + +koi8-r + + +iso-8859-3 + + +windows-1256 + + +x-mac-cyrillic + + +windows-1254 + + +windows-1252 + + +windows-1252 + + +iso-8859-13 + + +big5 + + +windows-1250 + + +euc-kr + + +iso-8859-7 + + +gb18030 + + +euc-jp + + +shift_jis + + +utf-8 + + +utf-8 + + +windows-1255 + + +euc-kr + + +ibm866 + + +big5 + + +koi8-r + + +koi8-r + + +windows-1252 + + +shift_jis + + +shift_jis + + +iso-8859-6 + + +shift_jis + + +windows-1254 + + +iso-8859-6 + + +iso-8859-8 + + +windows-1256 + + +iso-2022-jp + + +ibm866 + + +windows-874 + + +iso-8859-6 + + +iso-8859-2 + + +iso-8859-7 + + +windows-1252 + + +gbk + + +windows-1254 + + +iso-8859-6 + + +iso-8859-8-i + + +euc-kr + + +iso-8859-2 + + +iso-8859-2 + + +windows-1252 + + +euc-kr + + +iso-8859-6 + + +iso-8859-2 + + +windows-874 + + +windows-1252 + + +windows-1252 + + +ibm866 + + +iso-8859-3 + + +iso-8859-3 + + +iso-8859-13 + + +iso-8859-4 + + +windows-1253 + + +iso-8859-5 + + +iso-8859-5 + + +iso-8859-15 + + +iso-8859-6 + + +iso-8859-7 + + +iso-8859-7 + + +iso-8859-10 + + +utf-8 + + +iso-8859-10 + + +euc-kr + + +iso-8859-3 + + +windows-1254 + + +windows-1254 + + +windows-1253 + + +iso-8859-16 + + +windows-1258 + + +iso-8859-8-i + + +iso-8859-8 + + +iso-8859-3 + + +windows-874 + + +euc-kr + + +windows-1252 + + +iso-8859-6 + + +iso-8859-8-i + + +gbk + + +euc-kr + + +x-mac-cyrillic + + +iso-2022-jp + + +iso-8859-2 + + +windows-1252 + + +windows-1254 + + +windows-1257 + + +big5 + + +windows-1250 + + +euc-jp + + +iso-8859-7 + + +iso-8859-7 + + +gbk + + +windows-1251 + + +iso-8859-15 + + +iso-8859-15 + + +euc-kr + + +gbk + + +iso-8859-5 + + +big5 + + +windows-1255 + + +windows-1254 + + +iso-8859-15 + + +koi8-u + + +iso-8859-4 + + +shift_jis + + +windows-1257 + + +utf-8 + + +ibm866 + + +koi8-r + + +iso-8859-8 + + +windows-1254 + + +gbk + + +iso-8859-7 + + +windows-1252 + diff --git a/test/mycore/encoding_detect_meta.c b/test/mycore/encoding_detect_meta.c new file mode 100644 index 0000000..f4712fc --- /dev/null +++ b/test/mycore/encoding_detect_meta.c @@ -0,0 +1,178 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +struct test_res { + char* data; + size_t size; +} +typedef test_res_t; + +test_res_t test_load_file(const char* filename) +{ + FILE *fh = fopen(filename, "rb"); + if(fh == NULL) { + fprintf(stderr, "Can't open file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(fseek(fh, 0L, SEEK_END) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + long size = ftell(fh); + + if(fseek(fh, 0L, SEEK_SET) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(size <= 0) { + fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); + exit(EXIT_FAILURE); + } + + char *file_data = (char*)malloc(size + 1); + if(file_data == NULL) { + fprintf(stderr, "Can't allocate mem for file: %s\n", filename); + exit(EXIT_FAILURE); + } + + size_t nread = fread(file_data, 1, size, fh); + if (nread != size) { + fprintf(stderr, "Could not read %ld bytes (" MyCORE_FMT_Z " bytes done)\n", size, nread); + exit(EXIT_FAILURE); + } + + fclose(fh); + + return (test_res_t){file_data, (size_t)size}; +} + +size_t test_skip_whitespace(const unsigned char *udata, size_t length, size_t data_size) +{ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && udata[length] != 0x0D && udata[length] != 0x20) { + return length; + } + + length++; + } + + return length; +} + +size_t test_skip_not_whitespace(const unsigned char *udata, size_t length, size_t data_size) +{ + while(length < data_size) { + if(udata[length] == 0x09 || udata[length] == 0x0A || udata[length] == 0x0C || udata[length] == 0x0D || udata[length] == 0x20) { + return length; + } + + length++; + } + + return length; +} + +size_t test_find_body_end(const unsigned char *udata, size_t length, size_t data_size) +{ + while((length + 1) < data_size) { + if(udata[length] == 0x0A && udata[(length + 1)] == 0x0A) { + return (length + 1); + } + + length++; + } + + return data_size; +} + +void test_entries(const char* filename) +{ + size_t length = 0; + test_res_t test_data = test_load_file(filename); + + size_t code_begin = 0, code_length = 0; + size_t body_begin = 0; + + myencoding_t encoding; + const unsigned char *udata = (const unsigned char*)test_data.data; + + printf("Test, get encoding from element:\n"); + + while(length < test_data.size) + { + /* Find Encoding in Test Header */ + /* skip ws */ + length = code_begin = test_skip_whitespace(udata, length, test_data.size); + + if(length >= test_data.size) + return; + + /* find ws */ + length = test_skip_not_whitespace(udata, length, test_data.size); + code_length = length - code_begin; + + if(strncmp("not-determined", &test_data.data[code_begin], strlen("not-determined")) == 0) { + encoding = MyENCODING_NOT_DETERMINED; + } + else if(myencoding_by_name(&test_data.data[code_begin], code_length, &encoding) == false) { + fprintf(stderr, "Can't get encoding from test header: %.*s\n", (int)code_length, &test_data.data[code_begin]); + exit(EXIT_FAILURE); + } + + /* Find Test Data */ + /* get begin of body */ + length = body_begin = test_skip_whitespace(udata, length, test_data.size); + + /* get end of body */ + length = test_find_body_end(udata, length, test_data.size); + + myencoding_t find_encoding = myencoding_prescan_stream_to_determine_encoding(&test_data.data[body_begin], (length - body_begin)); + + if(find_encoding != encoding) { + fprintf(stderr, "ERROR! WRONG! ACHTUNG! Header Encoding not equally Encoding after parsing body\n"); + fprintf(stderr, "Header: %.*s\n", (int)code_length, &test_data.data[code_begin]); + fprintf(stderr, "Body: %.*s\n", (int)(length - body_begin), &test_data.data[body_begin]); + + exit(EXIT_FAILURE); + } + + printf("\t%.*s: Ok\n", (int)code_length, &test_data.data[code_begin]); + } +} + +int main(int argc, const char * argv[]) +{ + if (argc < 2) { + printf("Bad ARGV!\nUse: encoding_detect_meta \n"); + exit(EXIT_FAILURE); + } + + test_entries(argv[1]); + + //test_entries("/new/C-git/Modest/test/myhtml/data/encoding/detect_meta.html"); + + return EXIT_SUCCESS; +} diff --git a/test/mycore/utils/avl_tree.c b/test/mycore/utils/avl_tree.c new file mode 100644 index 0000000..a01dc29 --- /dev/null +++ b/test/mycore/utils/avl_tree.c @@ -0,0 +1,798 @@ +/* + Copyright (C) 2015-2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include + +#define test_exit fprintf(stderr, "ERROR! Wrong tree construction!\n"); exit(EXIT_FAILURE); + +mycore_utils_avl_tree_t * avl_tree_create(void) +{ + mycore_utils_avl_tree_t *avl_tree = mycore_utils_avl_tree_create(); + if(avl_tree == NULL) { + fprintf(stderr, "Can't allocate memory for AVL-Tree object\n"); + exit(EXIT_FAILURE); + } + + if(mycore_utils_avl_tree_init(avl_tree)) { + fprintf(stderr, "Can't init AVL-Tree object\n"); + exit(EXIT_FAILURE); + } + + return avl_tree; +} + +void test_for_three(mycore_utils_avl_tree_node_t *find_node) +{ + /* 1 */ + if(find_node->type != 1) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 2 */ + find_node = find_node->parent; + + if(find_node->type != 2) {test_exit} + if(find_node->left == NULL || find_node->left->type != 1) {test_exit} + if(find_node->right == NULL || find_node->right->type != 3) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 3 */ + find_node = find_node->right; + + if(find_node->type != 3) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} +} + +void avl_tree_test_3_0(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + + if(root_node == NULL || root_node->type != 2) {test_exit} + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + test_for_three(find_node); + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_3_1(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + + if(root_node == NULL || root_node->type != 2) {test_exit} + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + test_for_three(find_node); + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_3_2(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + + if(root_node == NULL || root_node->type != 2) {test_exit} + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + test_for_three(find_node); + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_3_3(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + + if(root_node == NULL || root_node->type != 2) {test_exit} + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + test_for_three(find_node); + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_3_4(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + + if(root_node == NULL || root_node->type != 2) {test_exit} + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + test_for_three(find_node); + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_3_5(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + + if(root_node == NULL || root_node->type != 2) {test_exit} + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + test_for_three(find_node); + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_4(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + + /* 1 */ + if(find_node->type != 1) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 2 */ + find_node = find_node->parent; + + if(find_node->type != 2) {test_exit} + if(find_node->left == NULL || find_node->left->type != 1) {test_exit} + if(find_node->right == NULL || find_node->right->type != 3) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 3 */ + find_node = find_node->right; + + if(find_node->type != 3) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right == NULL || find_node->right->type != 4) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 4 */ + find_node = find_node->right; + + if(find_node->type != 4) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_5(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + + /* 1 */ + if(find_node->type != 1) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 2 */ + find_node = find_node->parent; + + if(find_node->type != 2) {test_exit} + if(find_node->left == NULL || find_node->left->type != 1) {test_exit} + if(find_node->right == NULL || find_node->right->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 4 */ + find_node = find_node->right; + + if(find_node->type != 4) {test_exit} + if(find_node->left == NULL || find_node->left->type != 3) {test_exit} + if(find_node->right == NULL || find_node->right->type != 5) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 3 */ + find_node = find_node->left; + + if(find_node->type != 3) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 4) {test_exit} + + /* 5 */ + find_node = find_node->parent->right; + + if(find_node->type != 5) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 4) {test_exit} + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 4); + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_1L(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 1); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 2); + + /* 2 */ + if(find_node->type != 2) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + /* 3 */ + find_node = find_node->parent; + + if(find_node->type != 3) {test_exit} + if(find_node->left == NULL || find_node->left->type != 2) {test_exit} + if(find_node->right == NULL || find_node->right->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 4 */ + find_node = find_node->right; + + if(find_node->type != 4) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_1R(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 4); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + + /* 1 */ + if(find_node->type != 1) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 2 */ + find_node = find_node->parent; + + if(find_node->type != 2) {test_exit} + if(find_node->left == NULL || find_node->left->type != 1) {test_exit} + if(find_node->right == NULL || find_node->right->type != 3) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 3 */ + find_node = find_node->right; + + if(find_node->type != 3) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_2L(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 1); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 2); + + /* 2 */ + if(find_node->type != 2) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + /* 3 */ + find_node = find_node->parent; + + if(find_node->type != 3) {test_exit} + if(find_node->left == NULL || find_node->left->type != 2) {test_exit} + if(find_node->right == NULL || find_node->right->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 4 */ + find_node = find_node->right; + + if(find_node->type != 4) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_2R(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 4); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + + /* 1 */ + if(find_node->type != 1) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 2 */ + find_node = find_node->parent; + + if(find_node->type != 2) {test_exit} + if(find_node->left == NULL || find_node->left->type != 1) {test_exit} + if(find_node->right == NULL || find_node->right->type != 3) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 3 */ + find_node = find_node->right; + + if(find_node->type != 3) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_sub_1L(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 1); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 2); + + /* 2 */ + if(find_node->type != 2) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + /* 3 */ + find_node = find_node->parent; + + if(find_node->type != 3) {test_exit} + if(find_node->left == NULL || find_node->left->type != 2) {test_exit} + if(find_node->right == NULL || find_node->right->type != 4) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} + + /* 4 */ + find_node = find_node->right; + + if(find_node->type != 4) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + /* 5 */ + find_node = find_node->parent->parent; + + if(find_node->type != 5) {test_exit} + if(find_node->left == NULL || find_node->left->type != 3) {test_exit} + if(find_node->right == NULL || find_node->right->type != 6) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 6 */ + find_node = find_node->right; + + if(find_node->type != 6) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right == NULL || find_node->right->type != 7) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} + + /* 7 */ + find_node = find_node->right; + + if(find_node->type != 7) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 6) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_sub_1R(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 7); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 1); + + /* 1 */ + if(find_node->type != 1) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} + + /* 2*/ + find_node = find_node->parent; + + if(find_node->type != 2) {test_exit} + if(find_node->left == NULL || find_node->left->type != 1) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + /* 3 */ + find_node = find_node->parent; + + if(find_node->type != 3) {test_exit} + if(find_node->left == NULL || find_node->left->type != 2) {test_exit} + if(find_node->right == NULL || find_node->right->type != 5) {test_exit} + if(find_node->parent != NULL) {test_exit} + + /* 5 */ + find_node = find_node->right; + + if(find_node->type != 5) {test_exit} + if(find_node->left == NULL || find_node->left->type != 4) {test_exit} + if(find_node->right == NULL || find_node->right->type != 6) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} + + /* 4 */ + find_node = find_node->left; + + if(find_node->type != 4) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} + + /* 6 */ + find_node = find_node->parent->right; + + if(find_node->type != 6) {test_exit} + if(find_node->left != NULL) {test_exit} + if(find_node->right != NULL) {test_exit} + if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_10_0(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 8); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 4); + + if(find_node->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + if(find_node->left->type != 2) {test_exit} + if(find_node->left->left->type != 1) {test_exit} + if(find_node->left->right->type != 3) {test_exit} + + if(find_node->right->type != 7) {test_exit} + if(find_node->right->left->type != 6) {test_exit} + if(find_node->right->right->type != 9) {test_exit} + if(find_node->right->left->left->type != 5) {test_exit} + if(find_node->right->right->right->type != 10) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_10_1(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 8); + mycore_utils_avl_tree_delete(avl_tree, &root_node, 5); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 4); + + if(find_node->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + if(find_node->left->type != 2) {test_exit} + if(find_node->left->left->type != 1) {test_exit} + if(find_node->left->right->type != 3) {test_exit} + + if(find_node->right->type != 7) {test_exit} + if(find_node->right->left->type != 6) {test_exit} + if(find_node->right->right->type != 9) {test_exit} + if(find_node->right->right->right->type != 10) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_10_2(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 8); + mycore_utils_avl_tree_delete(avl_tree, &root_node, 6); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 4); + + if(find_node->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + if(find_node->left->type != 2) {test_exit} + if(find_node->left->left->type != 1) {test_exit} + if(find_node->left->right->type != 3) {test_exit} + + if(find_node->right->type != 7) {test_exit} + if(find_node->right->left->type != 5) {test_exit} + if(find_node->right->right->type != 9) {test_exit} + if(find_node->right->right->right->type != 10) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_10_3(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 9); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 4); + + if(find_node->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + if(find_node->left->type != 2) {test_exit} + if(find_node->left->left->type != 1) {test_exit} + if(find_node->left->right->type != 3) {test_exit} + + if(find_node->right->type != 8) {test_exit} + if(find_node->right->left->type != 6) {test_exit} + if(find_node->right->right->type != 10) {test_exit} + if(find_node->right->left->left->type != 5) {test_exit} + if(find_node->right->left->right->type != 7) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_10_4(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 4); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 3); + + if(find_node->type != 3) {test_exit} + if(find_node->parent != NULL) {test_exit} + + if(find_node->left->type != 2) {test_exit} + if(find_node->left->left->type != 1) {test_exit} + + if(find_node->right->type != 8) {test_exit} + if(find_node->right->left->type != 6) {test_exit} + if(find_node->right->right->type != 9) {test_exit} + if(find_node->right->left->left->type != 5) {test_exit} + if(find_node->right->left->right->type != 7) {test_exit} + if(find_node->right->right->right->type != 10) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +void avl_tree_test_delete_10_5(void) +{ + mycore_utils_avl_tree_t *avl_tree = avl_tree_create(); + mycore_utils_avl_tree_node_t *root_node = NULL; + + mycore_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); + mycore_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); + + mycore_utils_avl_tree_delete(avl_tree, &root_node, 6); + + mycore_utils_avl_tree_node_t *find_node = mycore_utils_avl_tree_search_by_type(avl_tree, root_node, 4); + + if(find_node->type != 4) {test_exit} + if(find_node->parent != NULL) {test_exit} + + if(find_node->left->type != 2) {test_exit} + if(find_node->left->left->type != 1) {test_exit} + if(find_node->left->right->type != 3) {test_exit} + + if(find_node->right->type != 8) {test_exit} + if(find_node->right->left->type != 5) {test_exit} + if(find_node->right->right->type != 9) {test_exit} + if(find_node->right->left->right->type != 7) {test_exit} + if(find_node->right->right->right->type != 10) {test_exit} + + avl_tree = mycore_utils_avl_tree_destroy(avl_tree, true); +} + +int main(int argc, const char * argv[]) +{ + mycore_utils_avl_tree_t *avl_tree = mycore_utils_avl_tree_create(); + + avl_tree_test_3_0(); + avl_tree_test_3_1(); + avl_tree_test_3_2(); + avl_tree_test_3_3(); + avl_tree_test_3_4(); + avl_tree_test_3_5(); + avl_tree_test_4(); + avl_tree_test_5(); + + avl_tree_test_delete_1L(); + avl_tree_test_delete_1R(); + avl_tree_test_delete_2L(); + avl_tree_test_delete_2R(); + + avl_tree_test_delete_sub_1L(); + avl_tree_test_delete_sub_1R(); + + avl_tree_test_delete_10_0(); + avl_tree_test_delete_10_1(); + avl_tree_test_delete_10_2(); + avl_tree_test_delete_10_3(); + avl_tree_test_delete_10_4(); + avl_tree_test_delete_10_5(); + + return EXIT_SUCCESS; +} + + diff --git a/test/mycss/Makefile.mk b/test/mycss/Makefile.mk new file mode 100644 index 0000000..86ccb10 --- /dev/null +++ b/test/mycss/Makefile.mk @@ -0,0 +1,9 @@ +mycss_dirs := . +mycss_objs := $(call BINARY_UTILS_OBJS,mycss,$(mycss_dirs)) + +mycss_all: $(mycss_objs) + +mycss_clean: + rm -f $(mycss_objs) + +mycss_declaration := $(TEST_DIR_RELATIVE)/mycss/data/declaration diff --git a/test/mycss/declaration.c b/test/mycss/declaration.c index dfc46a3..13f74b1 100644 --- a/test/mycss/declaration.c +++ b/test/mycss/declaration.c @@ -90,7 +90,7 @@ test_res_t test_load_file(const char* filename) size_t nread = fread(file_data, 1, size, fh); if (nread != size) { - fprintf(stderr, "Could not read %ld bytes (%zu bytes done)\n", size, nread); + fprintf(stderr, "Could not read %ld bytes (" MyCORE_FORMAT_Z " bytes done)\n", size, nread); exit(EXIT_FAILURE); } @@ -99,29 +99,29 @@ test_res_t test_load_file(const char* filename) return (test_res_t){file_data, (size_t)size}; } -void test_init_str_raw(myhtml_string_raw_t* str, size_t size) +void test_init_str_raw(mycore_string_raw_t* str, size_t size) { str->size = size; str->length = 0; - str->data = (char*)myhtml_malloc(str->size * sizeof(char)); + str->data = (char*)mycore_malloc(str->size * sizeof(char)); if(str->data == NULL) { - fprintf(stderr, "Can't allocation resources for myhtml_string_raw_t object\n"); + fprintf(stderr, "Can't allocation resources for mycore_string_raw_t object\n"); exit(EXIT_FAILURE); } } -void test_reallocate_str(myhtml_string_raw_t *str, size_t size) +void test_reallocate_str(mycore_string_raw_t *str, size_t size) { - str->data = (char*)myhtml_realloc(str->data, size * sizeof(char)); + str->data = (char*)mycore_realloc(str->data, size * sizeof(char)); if(str->data == NULL) { - fprintf(stderr, "Can't reallocation resources for myhtml_string_raw_t object\n"); + fprintf(stderr, "Can't reallocation resources for mycore_string_raw_t object\n"); exit(EXIT_FAILURE); } } -void test_str_set_term(myhtml_string_raw_t *str) +void test_str_set_term(mycore_string_raw_t *str) { if((str->length + 1) >= str->size) test_reallocate_str(str, 64); @@ -129,11 +129,11 @@ void test_str_set_term(myhtml_string_raw_t *str) str->data[ str->length ] = '\0'; } -myhtml_string_raw_t test_combine_to_style(const char* one, size_t one_len, const char* two, size_t two_len) +mycore_string_raw_t test_combine_to_style(const char* one, size_t one_len, const char* two, size_t two_len) { size_t new_size = one_len + two_len; - myhtml_string_raw_t str = {0}; + mycore_string_raw_t str = {0}; test_init_str_raw(&str, (new_size + 2)); memcpy(str.data, one, sizeof(char) * one_len); @@ -239,7 +239,7 @@ test_stat_t test_read_dir(const char* dir_path, test_read_dir_callback_f callbac continue; result_stat.total++; - printf("%zu) %s: ", result_stat.total, ent->d_name); + printf(MyCORE_FORMAT_Z ") %s: ", result_stat.total, ent->d_name); if(callback(path, (strlen(ent->d_name) + path_len + 1), context)) { result_stat.good++; @@ -254,9 +254,9 @@ test_stat_t test_read_dir(const char* dir_path, test_read_dir_callback_f callbac /* test */ bool test_process_elements(test_data_t *test_data, myhtml_collection_t *collection, test_stat_t* result_stat); -myhtml_string_raw_t test_process_result_from_node(test_data_t *test_data, myhtml_tree_node_t *node); -myhtml_string_raw_t test_process_serialize_stype(test_data_t *test_data, const char* style, size_t style_size); -void test_process_serialize_callback(const char* buffer, size_t size, void* ctx); +mycore_string_raw_t test_process_result_from_node(test_data_t *test_data, myhtml_tree_node_t *node); +mycore_string_raw_t test_process_serialize_stype(test_data_t *test_data, const char* style, size_t style_size); +mystatus_t test_process_serialize_callback(const char* buffer, size_t size, void* ctx); bool test_process_callback(const char* filename, size_t filename_len, void* context) { @@ -265,7 +265,7 @@ bool test_process_callback(const char* filename, size_t filename_len, void* cont test_stat_t result_stat = {0}; /* parse html */ - myhtml_status_t status = myhtml_parse(test_data->tree, MyHTML_ENCODING_UTF_8, html_data.data, html_data.size); + myhtml_status_t status = myhtml_parse(test_data->tree, MyENCODING_UTF_8, html_data.data, html_data.size); if(status) { fprintf(stderr, "Could parse HTML from file %s error code %d\n", filename, status); exit(EXIT_FAILURE); @@ -283,12 +283,12 @@ bool test_process_callback(const char* filename, size_t filename_len, void* cont printf("\tResult: "); } - printf("count(%zu) good(%zu) bad(%zu)\n", result_stat.total, result_stat.good, (result_stat.total - result_stat.good)); + printf("count(" MyCORE_FORMAT_Z ") good(" MyCORE_FORMAT_Z ") bad(" MyCORE_FORMAT_Z ")\n", result_stat.total, result_stat.good, (result_stat.total - result_stat.good)); test_data->stat.good += result_stat.good; test_data->stat.total += result_stat.total; - myhtml_free(html_data.data); + mycore_free(html_data.data); return true; } @@ -306,10 +306,10 @@ bool test_process_elements(test_data_t *test_data, myhtml_collection_t *collecti const char* name = myhtml_attribute_value(attr_name, &name_length); const char* value = myhtml_attribute_value(attr_value, &value_length); - myhtml_string_raw_t style = test_combine_to_style(name, name_length, value, value_length); + mycore_string_raw_t style = test_combine_to_style(name, name_length, value, value_length); - myhtml_string_raw_t correct_result = test_process_result_from_node(test_data, node); - myhtml_string_raw_t parse_result = test_process_serialize_stype(test_data, style.data, style.length); + mycore_string_raw_t correct_result = test_process_result_from_node(test_data, node); + mycore_string_raw_t parse_result = test_process_serialize_stype(test_data, style.data, style.length); result_stat->total++; @@ -326,9 +326,9 @@ bool test_process_elements(test_data_t *test_data, myhtml_collection_t *collecti printf("\tBad: name=\"%s\" value=\"%s\" need=\"%s\" result=\"%s\"\n", name, value, correct_result.data, parse_result.data); } - myhtml_string_raw_destroy(&style, false); - myhtml_string_raw_destroy(&correct_result, false); - myhtml_string_raw_destroy(&parse_result, false); + mycore_string_raw_destroy(&style, false); + mycore_string_raw_destroy(&correct_result, false); + mycore_string_raw_destroy(&parse_result, false); mycss_entry_clean_all(test_data->entry); } @@ -336,11 +336,11 @@ bool test_process_elements(test_data_t *test_data, myhtml_collection_t *collecti return true; } -myhtml_string_raw_t test_process_result_from_node(test_data_t *test_data, myhtml_tree_node_t *node) +mycore_string_raw_t test_process_result_from_node(test_data_t *test_data, myhtml_tree_node_t *node) { - myhtml_string_raw_t str = {0}; + mycore_string_raw_t str = {0}; - if(myhtml_serialization_node_buffer(node->child, &str) == false) { + if(myhtml_serialization_node_buffer(node->child, &str)) { fprintf(stderr, "Could serialization HTML node\n"); exit(EXIT_FAILURE); } @@ -348,13 +348,13 @@ myhtml_string_raw_t test_process_result_from_node(test_data_t *test_data, myhtml return str; } -myhtml_string_raw_t test_process_serialize_stype(test_data_t *test_data, const char* style, size_t style_size) +mycore_string_raw_t test_process_serialize_stype(test_data_t *test_data, const char* style, size_t style_size) { - myhtml_string_raw_t str; + mycore_string_raw_t str; test_init_str_raw(&str, 4096); mycss_status_t status; - mycss_declaration_entry_t *declaration = mycss_declaration_parse(test_data->entry->declaration, MyHTML_ENCODING_UTF_8, style, style_size, &status); + mycss_declaration_entry_t *declaration = mycss_declaration_parse(test_data->entry->declaration, MyENCODING_UTF_8, style, style_size, &status); if(status) { fprintf(stderr, "Could parse CSS Style (%d): %s\n", status, style); @@ -367,15 +367,17 @@ myhtml_string_raw_t test_process_serialize_stype(test_data_t *test_data, const c return str; } -void test_process_serialize_callback(const char* buffer, size_t size, void* ctx) +mystatus_t test_process_serialize_callback(const char* buffer, size_t size, void* ctx) { - myhtml_string_raw_t *str = (myhtml_string_raw_t*)ctx; + mycore_string_raw_t *str = (mycore_string_raw_t*)ctx; if((str->length + size) >= str->size) test_reallocate_str(str, 4096); memcpy(&str->data[ str->length ], buffer, sizeof(char) * size); str->length += size; + + return MyCORE_STATUS_OK; } int main(int argc, const char * argv[]) @@ -398,7 +400,7 @@ int main(int argc, const char * argv[]) test_read_dir(argv[1], test_process_callback, &test_data); size_t bad_count = (test_data.stat.total - test_data.stat.good); - printf("\nTotal: %zu; Good: %zu; Bad: %zu\n", test_data.stat.total, test_data.stat.good, bad_count); + printf("\nTotal: " MyCORE_FORMAT_Z "; Good: " MyCORE_FORMAT_Z "; Bad: " MyCORE_FORMAT_Z "\n", test_data.stat.total, test_data.stat.good, bad_count); test_declaration_destroy_myhtml(test_data.tree); test_declaration_destroy_mycss(test_data.entry); diff --git a/test/myencoding/Makefile.mk b/test/myencoding/Makefile.mk new file mode 100644 index 0000000..fa4ab02 --- /dev/null +++ b/test/myencoding/Makefile.mk @@ -0,0 +1,9 @@ +myencoding_dirs := . +myencoding_objs := $(call BINARY_UTILS_OBJS,myencoding,$(myencoding_dirs)) + +myencoding_all: $(myencoding_objs) + +myencoding_clean: + rm -f $(myencoding_objs) + +myencoding_encoding_detect_meta := $(TEST_DIR_RELATIVE)/myencoding/data/encoding/detect_meta.html diff --git a/test/myencoding/data/encoding/detect_meta.html b/test/myencoding/data/encoding/detect_meta.html new file mode 100644 index 0000000..e868f3f --- /dev/null +++ b/test/myencoding/data/encoding/detect_meta.html @@ -0,0 +1,736 @@ +koi8-r + + +koi8-r + + +koi8-r + + +utf-8 + + +utf-8 + + +windows-1251 + + +windows-1251 + + +utf-8 + + +utf-8 + + +WINDOWS-1252 + + +utf-8 + + +utf-8 + + +utf-8 + + +utf-8 + + +not-determined + + +not-determined + + +not-determined + + +ibm866 + + +ibm866 + + +ibm866 + + +ibm866 + + +ISO-2022-JP + + +ISO-2022-JP + + +EUC-JP + + +not-determined + + +EUC-KR + + +EUC-KR + + +SHIFT_JIS + + + +windows-874 + + +iso-8859-2 + + +iso-8859-3 + + +iso-8859-4 + + +shift_jis + + +iso-8859-5 + + +iso-8859-6 + + +iso-8859-10 + + +iso-8859-3 + + +iso-8859-13 + + +windows-1252 + + +windows-1254 + + +iso-8859-6 + + +iso-8859-7 + + +macintosh + + +iso-8859-8 + + +windows-1251 + + +koi8-u + + +windows-1254 + + +iso-8859-6 + + +iso-8859-4 + + +iso-8859-14 + + +iso-8859-4 + + +iso-8859-10 + + +windows-1252 + + +iso-8859-3 + + +iso-8859-2 + + +iso-8859-2 + + +iso-8859-8 + + +macintosh + + +windows-1253 + + +gbk + + +windows-1258 + + +iso-8859-4 + + +iso-8859-4 + + +iso-8859-5 + + +iso-8859-14 + + +iso-8859-10 + + +iso-8859-6 + + +iso-8859-6 + + +iso-8859-7 + + +windows-1254 + + +iso-8859-2 + + +iso-8859-8 + + +iso-8859-8 + + +iso-8859-8 + + +windows-1254 + + +windows-1252 + + +iso-8859-14 + + +iso-8859-10 + + +windows-1252 + + +shift_jis + + +iso-8859-15 + + +windows-1258 + + +windows-1256 + + +gbk + + +windows-1252 + + +iso-8859-7 + + +euc-jp + + +iso-8859-4 + + +big5 + + +windows-1255 + + +koi8-r + + +windows-1257 + + +windows-874 + + +windows-1251 + + +utf-8 + + +iso-8859-5 + + +iso-8859-7 + + +iso-8859-8 + + +macintosh + + +windows-1250 + + +gbk + + +windows-1252 + + +iso-8859-3 + + +iso-8859-4 + + +iso-8859-5 + + +iso-8859-8 + + +iso-8859-6 + + +iso-8859-8 + + +gbk + + +iso-8859-6 + + +iso-8859-10 + + +windows-874 + + +windows-1252 + + +iso-8859-7 + + +shift_jis + + +iso-8859-5 + + +iso-8859-15 + + +macintosh + + +windows-1252 + + +euc-kr + + +euc-kr + + +utf-8 + + +koi8-r + + +iso-8859-3 + + +windows-1256 + + +x-mac-cyrillic + + +windows-1254 + + +windows-1252 + + +windows-1252 + + +iso-8859-13 + + +big5 + + +windows-1250 + + +euc-kr + + +iso-8859-7 + + +gb18030 + + +euc-jp + + +shift_jis + + +utf-8 + + +utf-8 + + +windows-1255 + + +euc-kr + + +ibm866 + + +big5 + + +koi8-r + + +koi8-r + + +windows-1252 + + +shift_jis + + +shift_jis + + +iso-8859-6 + + +shift_jis + + +windows-1254 + + +iso-8859-6 + + +iso-8859-8 + + +windows-1256 + + +iso-2022-jp + + +ibm866 + + +windows-874 + + +iso-8859-6 + + +iso-8859-2 + + +iso-8859-7 + + +windows-1252 + + +gbk + + +windows-1254 + + +iso-8859-6 + + +iso-8859-8-i + + +euc-kr + + +iso-8859-2 + + +iso-8859-2 + + +windows-1252 + + +euc-kr + + +iso-8859-6 + + +iso-8859-2 + + +windows-874 + + +windows-1252 + + +windows-1252 + + +ibm866 + + +iso-8859-3 + + +iso-8859-3 + + +iso-8859-13 + + +iso-8859-4 + + +windows-1253 + + +iso-8859-5 + + +iso-8859-5 + + +iso-8859-15 + + +iso-8859-6 + + +iso-8859-7 + + +iso-8859-7 + + +iso-8859-10 + + +utf-8 + + +iso-8859-10 + + +euc-kr + + +iso-8859-3 + + +windows-1254 + + +windows-1254 + + +windows-1253 + + +iso-8859-16 + + +windows-1258 + + +iso-8859-8-i + + +iso-8859-8 + + +iso-8859-3 + + +windows-874 + + +euc-kr + + +windows-1252 + + +iso-8859-6 + + +iso-8859-8-i + + +gbk + + +euc-kr + + +x-mac-cyrillic + + +iso-2022-jp + + +iso-8859-2 + + +windows-1252 + + +windows-1254 + + +windows-1257 + + +big5 + + +windows-1250 + + +euc-jp + + +iso-8859-7 + + +iso-8859-7 + + +gbk + + +windows-1251 + + +iso-8859-15 + + +iso-8859-15 + + +euc-kr + + +gbk + + +iso-8859-5 + + +big5 + + +windows-1255 + + +windows-1254 + + +iso-8859-15 + + +koi8-u + + +iso-8859-4 + + +shift_jis + + +windows-1257 + + +utf-8 + + +ibm866 + + +koi8-r + + +iso-8859-8 + + +windows-1254 + + +gbk + + +iso-8859-7 + + +windows-1252 + diff --git a/test/myencoding/encoding_detect_meta.c b/test/myencoding/encoding_detect_meta.c new file mode 100644 index 0000000..24a8b68 --- /dev/null +++ b/test/myencoding/encoding_detect_meta.c @@ -0,0 +1,178 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) +*/ + +#include +#include + +struct test_res { + char* data; + size_t size; +} +typedef test_res_t; + +test_res_t test_load_file(const char* filename) +{ + FILE *fh = fopen(filename, "rb"); + if(fh == NULL) { + fprintf(stderr, "Can't open file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(fseek(fh, 0L, SEEK_END) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + long size = ftell(fh); + + if(fseek(fh, 0L, SEEK_SET) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(size <= 0) { + fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); + exit(EXIT_FAILURE); + } + + char *file_data = (char*)malloc(size + 1); + if(file_data == NULL) { + fprintf(stderr, "Can't allocate mem for file: %s\n", filename); + exit(EXIT_FAILURE); + } + + size_t nread = fread(file_data, 1, size, fh); + if (nread != size) { + fprintf(stderr, "Could not read %ld bytes (" MyCORE_FORMAT_Z " bytes done)\n", size, nread); + exit(EXIT_FAILURE); + } + + fclose(fh); + + return (test_res_t){file_data, (size_t)size}; +} + +size_t test_skip_whitespace(const unsigned char *udata, size_t length, size_t data_size) +{ + while(length < data_size) { + if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && udata[length] != 0x0D && udata[length] != 0x20) { + return length; + } + + length++; + } + + return length; +} + +size_t test_skip_not_whitespace(const unsigned char *udata, size_t length, size_t data_size) +{ + while(length < data_size) { + if(udata[length] == 0x09 || udata[length] == 0x0A || udata[length] == 0x0C || udata[length] == 0x0D || udata[length] == 0x20) { + return length; + } + + length++; + } + + return length; +} + +size_t test_find_body_end(const unsigned char *udata, size_t length, size_t data_size) +{ + while((length + 1) < data_size) { + if(udata[length] == 0x0A && udata[(length + 1)] == 0x0A) { + return (length + 1); + } + + length++; + } + + return data_size; +} + +void test_entries(const char* filename) +{ + size_t length = 0; + test_res_t test_data = test_load_file(filename); + + size_t code_begin = 0, code_length = 0; + size_t body_begin = 0; + + myencoding_t encoding; + const unsigned char *udata = (const unsigned char*)test_data.data; + + printf("Test, get encoding from element:\n"); + + while(length < test_data.size) + { + /* Find Encoding in Test Header */ + /* skip ws */ + length = code_begin = test_skip_whitespace(udata, length, test_data.size); + + if(length >= test_data.size) + return; + + /* find ws */ + length = test_skip_not_whitespace(udata, length, test_data.size); + code_length = length - code_begin; + + if(strncmp("not-determined", &test_data.data[code_begin], strlen("not-determined")) == 0) { + encoding = MyENCODING_NOT_DETERMINED; + } + else if(myencoding_by_name(&test_data.data[code_begin], code_length, &encoding) == false) { + fprintf(stderr, "Can't get encoding from test header: %.*s\n", (int)code_length, &test_data.data[code_begin]); + exit(EXIT_FAILURE); + } + + /* Find Test Data */ + /* get begin of body */ + length = body_begin = test_skip_whitespace(udata, length, test_data.size); + + /* get end of body */ + length = test_find_body_end(udata, length, test_data.size); + + myencoding_t find_encoding = myencoding_prescan_stream_to_determine_encoding(&test_data.data[body_begin], (length - body_begin)); + + if(find_encoding != encoding) { + fprintf(stderr, "ERROR! WRONG! ACHTUNG! Header Encoding not equally Encoding after parsing body\n"); + fprintf(stderr, "Header: %.*s\n", (int)code_length, &test_data.data[code_begin]); + fprintf(stderr, "Body: %.*s\n", (int)(length - body_begin), &test_data.data[body_begin]); + + exit(EXIT_FAILURE); + } + + printf("\t%.*s: Ok\n", (int)code_length, &test_data.data[code_begin]); + } +} + +int main(int argc, const char * argv[]) +{ + if (argc < 2) { + printf("Bad ARGV!\nUse: encoding_detect_meta \n"); + exit(EXIT_FAILURE); + } + + test_entries(argv[1]); + + //test_entries("/new/C-git/Modest/test/myhtml/data/encoding/detect_meta.html"); + + return EXIT_SUCCESS; +} diff --git a/test/myhtml/Makefile.mk b/test/myhtml/Makefile.mk new file mode 100644 index 0000000..f6fc0c7 --- /dev/null +++ b/test/myhtml/Makefile.mk @@ -0,0 +1,7 @@ +myhtml_dirs := . +myhtml_objs := $(call BINARY_UTILS_OBJS,myhtml,$(myhtml_dirs)) + +myhtml_all: $(myhtml_objs) + +myhtml_clean: + rm -f $(myhtml_objs) diff --git a/test/myhtml/commoncrawl.c b/test/myhtml/commoncrawl.c new file mode 100644 index 0000000..bbba386 --- /dev/null +++ b/test/myhtml/commoncrawl.c @@ -0,0 +1,294 @@ +/* + Copyright (C) 2016 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + For HTML Pages from: http://commoncrawl.org/ +*/ + +#include +#include +//#include +//#include +//#include +// +//#include +// +//#define DIE(msg, ...) do { fprintf(stderr, msg, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0) +// +//static myhtml_tree_t* global_tree; +// +//#define total_count_size 20 +//static size_t total_count[total_count_size]; +// +//typedef void (*process_state_f)(const char* data, size_t filename_size); +//typedef void (*parser_state_f)(const char* data, size_t filename_size, size_t count); +// +//void print_total_count(void) +//{ +// size_t total = 0; +// for(size_t i = 0; i < 7; i++) +// total += total_count[i]; +// +// printf("Total: %zu\n" ,total); +// +// printf("\t0-100: %zu\n", total_count[0]); +// printf("\t100-1000: %zu\n", total_count[1]); +// printf("\t1000-5000: %zu\n", total_count[2]); +// printf("\t5000-10000: %zu\n", total_count[3]); +// printf("\t10000-50000: %zu\n", total_count[4]); +// printf("\t50000-100000: %zu\n", total_count[5]); +// printf("\t100000 and up: %zu\n", total_count[6]); +//} +// +//void listdir(const char *name, process_state_f callback) +//{ +// memset(total_count, 0, sizeof(size_t) * total_count_size); +// +// DIR *dir; +// struct dirent *entry; +// +// if(!(dir = opendir(name))) +// return; +// if(!(entry = readdir(dir))) +// return; +// +// do { +// if(entry->d_type == DT_DIR) { +// char path[2048]; +// +// int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); +// path[len] = '\0'; +// +// if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) +// continue; +// +// listdir(path, callback); +// } +// else { +// char path[2048]; +// +// int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); +// path[len] = '\0'; +// +// if(path[ (len - 3) ] == '.' && path[ (len - 2) ] == 'g' && path[ (len - 1) ] == 'z') { +// callback(path, len); +// } +// } +// } +// while ((entry = readdir(dir))); +// +// closedir(dir); +//} +// +//void read_loaded(const char *filename, const char *db_dir, process_state_f callback) +//{ +// memset(total_count, 0, sizeof(size_t) * total_count_size); +// +// FILE *fh = fopen(filename, "rb"); +// if(fh == NULL) { +// fprintf(stderr, "Can't open html file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// fseek(fh, 0L, SEEK_END); +// long size = ftell(fh); +// fseek(fh, 0L, SEEK_SET); +// +// char *data = (char*)malloc(size + 1); +// if(data == NULL) { +// fprintf(stderr, "Can't allocate mem for html file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// size_t nread = fread(data, 1, size, fh); +// if (nread != size) { +// fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", size, nread); +// exit(EXIT_FAILURE); +// } +// +// fclose(fh); +// +// if(size < 0) +// size = 0; +// +// size_t from = 0; +// char path[2048]; +// +// for(size_t i = 0; i < size; i++) { +// if(data[i] == '\n') { +// int len = snprintf(path, sizeof(path)-1, "%s/%.*s", db_dir, (int)(i - from), &data[from]); +// path[len] = '\0'; +// +// callback(path, len); +// +// from = i + 1; +// } +// } +// +// free(data); +//} +// +//void process(const char* filename, size_t filename_size, parser_state_f parser) +//{ +// FILE *fh = fopen(filename, "rb"); +// if(fh == NULL) { +// fprintf(stderr, "Can't open html file: %s\n", filename); +// exit(EXIT_FAILURE); +// } +// +// fseek(fh, 0L, SEEK_SET); +// +// const char *ct = "Content-Length:"; +// size_t ct_size = strlen(ct); +// +// char * line = NULL; +// long get_size = 0; +// ssize_t read = 0; +// +// size_t count = 0, read_len = 0; +// +// while ((read = getline(&line, &read_len, fh)) != -1) { +// +// if(strncmp(ct, line, ct_size) == 0) { +// size_t i; +// +// for(i = ct_size; i < read_len; i++) +// if(line[i] != '\n' && line[i] != '\r' && line[i] != ' ') +// break; +// +// get_size = strtol(&line[i], NULL, 0); +// } +// else if(get_size && line[0] == '\r' && line[1] == '\n') { +// long head_begin = ftell(fh) + 2; +// long end = head_begin + get_size; +// +// while ((read = getline(&line, &read_len, fh)) != -1) { +// //printf("%.*s", (int)read_len, line); +// +// if(line[0] == '\r' && line[1] == '\n') +// break; +// } +// +// long head_end = ftell(fh); +// +// size_t html_length = (end - head_end); +// char *html = malloc(html_length + 1); +// +// size_t nread = fread(html, 1, html_length, fh); +// if (nread != html_length) { +// fprintf(stderr, "could not read %ld bytes (%zu bytes done)\n", html_length, nread); +// exit(EXIT_FAILURE); +// } +// +// count++; +// parser(html, html_length, count); +// +// get_size = 0; +// free(html); +// } +// } +// +// fclose(fh); +//} +// +//void html_parser(const char* html, size_t html_length, size_t count) +//{ +// if((count % 1000) == 0) { +// printf("\t%zu\n", count); +// } +// +// myencoding_t encoding = 0; +// //myhtml_encoding_detect(html, html_length, &encoding); +// +// // parse html +// myhtml_status_t status = myhtml_parse(global_tree, encoding, html, html_length); +// if(status != MyHTML_STATUS_OK) { +// fprintf(stderr, "Can't parse:\n%.*s\n", (int)html_length, html); +// exit(EXIT_FAILURE); +// } +// +// if(html_length < 100) +// total_count[0]++; +// else if(html_length >= 100 && html_length < 1000) +// total_count[1]++; +// else if(html_length >= 1000 && html_length < 5000) +// total_count[2]++; +// else if(html_length >= 5000 && html_length < 10000) +// total_count[3]++; +// else if(html_length >= 10000 && html_length < 50000) +// total_count[4]++; +// else if(html_length >= 50000 && html_length < 100000) +// total_count[5]++; +// else if(html_length >= 100000) +// total_count[6]++; +// +// //myhtml_tree_print_node_children(global_tree, global_tree->document, stdout, 0); +//} +// +//void process_unpack(const char* filename, size_t filename_size) +//{ +// char command[2048]; +// snprintf(command, sizeof(command)-1, "gzip -k -d %s", filename); +// +// printf("Unzip %s\n", filename); +// +// system(command); +// +// char new_path[2048]; +// size_t new_path_size = (filename_size - 3); +// +// snprintf(new_path, sizeof(new_path)-1, "%.*s", (int)new_path_size, filename); +// +// printf("Process %s:\n", new_path); +// process(new_path, new_path_size, html_parser); +// printf("\n"); +// +// unlink(new_path); +//} +// +//static void usage(void) +//{ +// fprintf(stderr, "commoncrawl \n"); +//} +// +int main(int argc, const char * argv[]) +{ +// if (argc != 2) { +// usage(); +// return 0; +// } +// +// // basic init +// myhtml_t* myhtml = myhtml_create(); +// myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); +// +// // first tree init +// global_tree = myhtml_tree_create(); +// myhtml_tree_init(global_tree, myhtml); +// +// listdir(argv[1], process_unpack); +// +// // release resources +// myhtml_tree_destroy(global_tree); +// myhtml_destroy(myhtml); +// +// print_total_count(); + + return 0; +} + + diff --git a/test/myhtml/data/encoding/detect_meta.html b/test/myhtml/data/encoding/detect_meta.html deleted file mode 100644 index e868f3f..0000000 --- a/test/myhtml/data/encoding/detect_meta.html +++ /dev/null @@ -1,736 +0,0 @@ -koi8-r - - -koi8-r - - -koi8-r - - -utf-8 - - -utf-8 - - -windows-1251 - - -windows-1251 - - -utf-8 - - -utf-8 - - -WINDOWS-1252 - - -utf-8 - - -utf-8 - - -utf-8 - - -utf-8 - - -not-determined - - -not-determined - - -not-determined - - -ibm866 - - -ibm866 - - -ibm866 - - -ibm866 - - -ISO-2022-JP - - -ISO-2022-JP - - -EUC-JP - - -not-determined - - -EUC-KR - - -EUC-KR - - -SHIFT_JIS - - - -windows-874 - - -iso-8859-2 - - -iso-8859-3 - - -iso-8859-4 - - -shift_jis - - -iso-8859-5 - - -iso-8859-6 - - -iso-8859-10 - - -iso-8859-3 - - -iso-8859-13 - - -windows-1252 - - -windows-1254 - - -iso-8859-6 - - -iso-8859-7 - - -macintosh - - -iso-8859-8 - - -windows-1251 - - -koi8-u - - -windows-1254 - - -iso-8859-6 - - -iso-8859-4 - - -iso-8859-14 - - -iso-8859-4 - - -iso-8859-10 - - -windows-1252 - - -iso-8859-3 - - -iso-8859-2 - - -iso-8859-2 - - -iso-8859-8 - - -macintosh - - -windows-1253 - - -gbk - - -windows-1258 - - -iso-8859-4 - - -iso-8859-4 - - -iso-8859-5 - - -iso-8859-14 - - -iso-8859-10 - - -iso-8859-6 - - -iso-8859-6 - - -iso-8859-7 - - -windows-1254 - - -iso-8859-2 - - -iso-8859-8 - - -iso-8859-8 - - -iso-8859-8 - - -windows-1254 - - -windows-1252 - - -iso-8859-14 - - -iso-8859-10 - - -windows-1252 - - -shift_jis - - -iso-8859-15 - - -windows-1258 - - -windows-1256 - - -gbk - - -windows-1252 - - -iso-8859-7 - - -euc-jp - - -iso-8859-4 - - -big5 - - -windows-1255 - - -koi8-r - - -windows-1257 - - -windows-874 - - -windows-1251 - - -utf-8 - - -iso-8859-5 - - -iso-8859-7 - - -iso-8859-8 - - -macintosh - - -windows-1250 - - -gbk - - -windows-1252 - - -iso-8859-3 - - -iso-8859-4 - - -iso-8859-5 - - -iso-8859-8 - - -iso-8859-6 - - -iso-8859-8 - - -gbk - - -iso-8859-6 - - -iso-8859-10 - - -windows-874 - - -windows-1252 - - -iso-8859-7 - - -shift_jis - - -iso-8859-5 - - -iso-8859-15 - - -macintosh - - -windows-1252 - - -euc-kr - - -euc-kr - - -utf-8 - - -koi8-r - - -iso-8859-3 - - -windows-1256 - - -x-mac-cyrillic - - -windows-1254 - - -windows-1252 - - -windows-1252 - - -iso-8859-13 - - -big5 - - -windows-1250 - - -euc-kr - - -iso-8859-7 - - -gb18030 - - -euc-jp - - -shift_jis - - -utf-8 - - -utf-8 - - -windows-1255 - - -euc-kr - - -ibm866 - - -big5 - - -koi8-r - - -koi8-r - - -windows-1252 - - -shift_jis - - -shift_jis - - -iso-8859-6 - - -shift_jis - - -windows-1254 - - -iso-8859-6 - - -iso-8859-8 - - -windows-1256 - - -iso-2022-jp - - -ibm866 - - -windows-874 - - -iso-8859-6 - - -iso-8859-2 - - -iso-8859-7 - - -windows-1252 - - -gbk - - -windows-1254 - - -iso-8859-6 - - -iso-8859-8-i - - -euc-kr - - -iso-8859-2 - - -iso-8859-2 - - -windows-1252 - - -euc-kr - - -iso-8859-6 - - -iso-8859-2 - - -windows-874 - - -windows-1252 - - -windows-1252 - - -ibm866 - - -iso-8859-3 - - -iso-8859-3 - - -iso-8859-13 - - -iso-8859-4 - - -windows-1253 - - -iso-8859-5 - - -iso-8859-5 - - -iso-8859-15 - - -iso-8859-6 - - -iso-8859-7 - - -iso-8859-7 - - -iso-8859-10 - - -utf-8 - - -iso-8859-10 - - -euc-kr - - -iso-8859-3 - - -windows-1254 - - -windows-1254 - - -windows-1253 - - -iso-8859-16 - - -windows-1258 - - -iso-8859-8-i - - -iso-8859-8 - - -iso-8859-3 - - -windows-874 - - -euc-kr - - -windows-1252 - - -iso-8859-6 - - -iso-8859-8-i - - -gbk - - -euc-kr - - -x-mac-cyrillic - - -iso-2022-jp - - -iso-8859-2 - - -windows-1252 - - -windows-1254 - - -windows-1257 - - -big5 - - -windows-1250 - - -euc-jp - - -iso-8859-7 - - -iso-8859-7 - - -gbk - - -windows-1251 - - -iso-8859-15 - - -iso-8859-15 - - -euc-kr - - -gbk - - -iso-8859-5 - - -big5 - - -windows-1255 - - -windows-1254 - - -iso-8859-15 - - -koi8-u - - -iso-8859-4 - - -shift_jis - - -windows-1257 - - -utf-8 - - -ibm866 - - -koi8-r - - -iso-8859-8 - - -windows-1254 - - -gbk - - -iso-8859-7 - - -windows-1252 - diff --git a/test/myhtml/encoding_detect_meta.c b/test/myhtml/encoding_detect_meta.c deleted file mode 100644 index 69d694b..0000000 --- a/test/myhtml/encoding_detect_meta.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - Copyright (C) 2015-2017 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include -#include - -struct test_res { - char* data; - size_t size; -} -typedef test_res_t; - -test_res_t test_load_file(const char* filename) -{ - FILE *fh = fopen(filename, "rb"); - if(fh == NULL) { - fprintf(stderr, "Can't open file: %s\n", filename); - exit(EXIT_FAILURE); - } - - if(fseek(fh, 0L, SEEK_END) != 0) { - fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); - exit(EXIT_FAILURE); - } - - long size = ftell(fh); - - if(fseek(fh, 0L, SEEK_SET) != 0) { - fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); - exit(EXIT_FAILURE); - } - - if(size <= 0) { - fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); - exit(EXIT_FAILURE); - } - - char *file_data = (char*)malloc(size + 1); - if(file_data == NULL) { - fprintf(stderr, "Can't allocate mem for file: %s\n", filename); - exit(EXIT_FAILURE); - } - - size_t nread = fread(file_data, 1, size, fh); - if (nread != size) { - fprintf(stderr, "Could not read %ld bytes (%zu bytes done)\n", size, nread); - exit(EXIT_FAILURE); - } - - fclose(fh); - - return (test_res_t){file_data, (size_t)size}; -} - -size_t test_skip_whitespace(const unsigned char *udata, size_t length, size_t data_size) -{ - while(length < data_size) { - if(udata[length] != 0x09 && udata[length] != 0x0A && udata[length] != 0x0C && udata[length] != 0x0D && udata[length] != 0x20) { - return length; - } - - length++; - } - - return length; -} - -size_t test_skip_not_whitespace(const unsigned char *udata, size_t length, size_t data_size) -{ - while(length < data_size) { - if(udata[length] == 0x09 || udata[length] == 0x0A || udata[length] == 0x0C || udata[length] == 0x0D || udata[length] == 0x20) { - return length; - } - - length++; - } - - return length; -} - -size_t test_find_body_end(const unsigned char *udata, size_t length, size_t data_size) -{ - while((length + 1) < data_size) { - if(udata[length] == 0x0A && udata[(length + 1)] == 0x0A) { - return (length + 1); - } - - length++; - } - - return data_size; -} - -void test_entries(const char* filename) -{ - size_t length = 0; - test_res_t test_data = test_load_file(filename); - - size_t code_begin = 0, code_length = 0; - size_t body_begin = 0; - - myhtml_encoding_t encoding; - const unsigned char *udata = (const unsigned char*)test_data.data; - - printf("Test, get encoding from element:\n"); - - while(length < test_data.size) - { - /* Find Encoding in Test Header */ - /* skip ws */ - length = code_begin = test_skip_whitespace(udata, length, test_data.size); - - if(length >= test_data.size) - return; - - /* find ws */ - length = test_skip_not_whitespace(udata, length, test_data.size); - code_length = length - code_begin; - - if(strncmp("not-determined", &test_data.data[code_begin], strlen("not-determined")) == 0) { - encoding = MyHTML_ENCODING_NOT_DETERMINED; - } - else if(myhtml_encoding_by_name(&test_data.data[code_begin], code_length, &encoding) == false) { - fprintf(stderr, "Can't get encoding from test header: %.*s\n", (int)code_length, &test_data.data[code_begin]); - exit(EXIT_FAILURE); - } - - /* Find Test Data */ - /* get begin of body */ - length = body_begin = test_skip_whitespace(udata, length, test_data.size); - - /* get end of body */ - length = test_find_body_end(udata, length, test_data.size); - - myhtml_encoding_t find_encoding = myhtml_encoding_prescan_stream_to_determine_encoding(&test_data.data[body_begin], (length - body_begin)); - - if(find_encoding != encoding) { - fprintf(stderr, "ERROR! WRONG! ACHTUNG! Header Encoding not equally Encoding after parsing body\n"); - fprintf(stderr, "Header: %.*s\n", (int)code_length, &test_data.data[code_begin]); - fprintf(stderr, "Body: %.*s\n", (int)(length - body_begin), &test_data.data[body_begin]); - - exit(EXIT_FAILURE); - } - - printf("\t%.*s: Ok\n", (int)code_length, &test_data.data[code_begin]); - } -} - -int main(int argc, const char * argv[]) -{ - if (argc < 2) { - printf("Bad ARGV!\nUse: encoding_detect_meta \n"); - exit(EXIT_FAILURE); - } - - test_entries(argv[1]); - - //test_entries("/new/C-git/Modest/test/myhtml/data/encoding/detect_meta.html"); - - return EXIT_SUCCESS; -} diff --git a/test/myhtml/utils/avl_tree.c b/test/myhtml/utils/avl_tree.c deleted file mode 100644 index fee0aff..0000000 --- a/test/myhtml/utils/avl_tree.c +++ /dev/null @@ -1,798 +0,0 @@ -/* - Copyright (C) 2015-2016 Alexander Borisov - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - Author: lex.borisov@gmail.com (Alexander Borisov) -*/ - -#include - -#define test_exit fprintf(stderr, "ERROR! Wrong tree construction!\n"); exit(EXIT_FAILURE); - -myhtml_utils_avl_tree_t * avl_tree_create(void) -{ - myhtml_utils_avl_tree_t *avl_tree = myhtml_utils_avl_tree_create(); - if(avl_tree == NULL) { - fprintf(stderr, "Can't allocate memory for AVL-Tree object\n"); - exit(EXIT_FAILURE); - } - - if(myhtml_utils_avl_tree_init(avl_tree)) { - fprintf(stderr, "Can't init AVL-Tree object\n"); - exit(EXIT_FAILURE); - } - - return avl_tree; -} - -void test_for_three(myhtml_utils_avl_tree_node_t *find_node) -{ - /* 1 */ - if(find_node->type != 1) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 2 */ - find_node = find_node->parent; - - if(find_node->type != 2) {test_exit} - if(find_node->left == NULL || find_node->left->type != 1) {test_exit} - if(find_node->right == NULL || find_node->right->type != 3) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 3 */ - find_node = find_node->right; - - if(find_node->type != 3) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} -} - -void avl_tree_test_3_0(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - - if(root_node == NULL || root_node->type != 2) {test_exit} - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - test_for_three(find_node); - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_3_1(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - - if(root_node == NULL || root_node->type != 2) {test_exit} - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - test_for_three(find_node); - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_3_2(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - - if(root_node == NULL || root_node->type != 2) {test_exit} - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - test_for_three(find_node); - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_3_3(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - - if(root_node == NULL || root_node->type != 2) {test_exit} - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - test_for_three(find_node); - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_3_4(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - - if(root_node == NULL || root_node->type != 2) {test_exit} - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - test_for_three(find_node); - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_3_5(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - - if(root_node == NULL || root_node->type != 2) {test_exit} - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - test_for_three(find_node); - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_4(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - - /* 1 */ - if(find_node->type != 1) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 2 */ - find_node = find_node->parent; - - if(find_node->type != 2) {test_exit} - if(find_node->left == NULL || find_node->left->type != 1) {test_exit} - if(find_node->right == NULL || find_node->right->type != 3) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 3 */ - find_node = find_node->right; - - if(find_node->type != 3) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right == NULL || find_node->right->type != 4) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 4 */ - find_node = find_node->right; - - if(find_node->type != 4) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_5(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - - /* 1 */ - if(find_node->type != 1) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 2 */ - find_node = find_node->parent; - - if(find_node->type != 2) {test_exit} - if(find_node->left == NULL || find_node->left->type != 1) {test_exit} - if(find_node->right == NULL || find_node->right->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 4 */ - find_node = find_node->right; - - if(find_node->type != 4) {test_exit} - if(find_node->left == NULL || find_node->left->type != 3) {test_exit} - if(find_node->right == NULL || find_node->right->type != 5) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 3 */ - find_node = find_node->left; - - if(find_node->type != 3) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 4) {test_exit} - - /* 5 */ - find_node = find_node->parent->right; - - if(find_node->type != 5) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 4) {test_exit} - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 4); - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_1L(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 1); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 2); - - /* 2 */ - if(find_node->type != 2) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - /* 3 */ - find_node = find_node->parent; - - if(find_node->type != 3) {test_exit} - if(find_node->left == NULL || find_node->left->type != 2) {test_exit} - if(find_node->right == NULL || find_node->right->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 4 */ - find_node = find_node->right; - - if(find_node->type != 4) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_1R(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 4); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - - /* 1 */ - if(find_node->type != 1) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 2 */ - find_node = find_node->parent; - - if(find_node->type != 2) {test_exit} - if(find_node->left == NULL || find_node->left->type != 1) {test_exit} - if(find_node->right == NULL || find_node->right->type != 3) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 3 */ - find_node = find_node->right; - - if(find_node->type != 3) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_2L(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 1); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 2); - - /* 2 */ - if(find_node->type != 2) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - /* 3 */ - find_node = find_node->parent; - - if(find_node->type != 3) {test_exit} - if(find_node->left == NULL || find_node->left->type != 2) {test_exit} - if(find_node->right == NULL || find_node->right->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 4 */ - find_node = find_node->right; - - if(find_node->type != 4) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_2R(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 4); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - - /* 1 */ - if(find_node->type != 1) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 2 */ - find_node = find_node->parent; - - if(find_node->type != 2) {test_exit} - if(find_node->left == NULL || find_node->left->type != 1) {test_exit} - if(find_node->right == NULL || find_node->right->type != 3) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 3 */ - find_node = find_node->right; - - if(find_node->type != 3) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_sub_1L(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 1); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 2); - - /* 2 */ - if(find_node->type != 2) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - /* 3 */ - find_node = find_node->parent; - - if(find_node->type != 3) {test_exit} - if(find_node->left == NULL || find_node->left->type != 2) {test_exit} - if(find_node->right == NULL || find_node->right->type != 4) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} - - /* 4 */ - find_node = find_node->right; - - if(find_node->type != 4) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - /* 5 */ - find_node = find_node->parent->parent; - - if(find_node->type != 5) {test_exit} - if(find_node->left == NULL || find_node->left->type != 3) {test_exit} - if(find_node->right == NULL || find_node->right->type != 6) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 6 */ - find_node = find_node->right; - - if(find_node->type != 6) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right == NULL || find_node->right->type != 7) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} - - /* 7 */ - find_node = find_node->right; - - if(find_node->type != 7) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 6) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_sub_1R(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 7); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 1); - - /* 1 */ - if(find_node->type != 1) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 2) {test_exit} - - /* 2*/ - find_node = find_node->parent; - - if(find_node->type != 2) {test_exit} - if(find_node->left == NULL || find_node->left->type != 1) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - /* 3 */ - find_node = find_node->parent; - - if(find_node->type != 3) {test_exit} - if(find_node->left == NULL || find_node->left->type != 2) {test_exit} - if(find_node->right == NULL || find_node->right->type != 5) {test_exit} - if(find_node->parent != NULL) {test_exit} - - /* 5 */ - find_node = find_node->right; - - if(find_node->type != 5) {test_exit} - if(find_node->left == NULL || find_node->left->type != 4) {test_exit} - if(find_node->right == NULL || find_node->right->type != 6) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 3) {test_exit} - - /* 4 */ - find_node = find_node->left; - - if(find_node->type != 4) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} - - /* 6 */ - find_node = find_node->parent->right; - - if(find_node->type != 6) {test_exit} - if(find_node->left != NULL) {test_exit} - if(find_node->right != NULL) {test_exit} - if(find_node->parent == NULL || find_node->parent->type != 5) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_10_0(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 8); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 4); - - if(find_node->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - if(find_node->left->type != 2) {test_exit} - if(find_node->left->left->type != 1) {test_exit} - if(find_node->left->right->type != 3) {test_exit} - - if(find_node->right->type != 7) {test_exit} - if(find_node->right->left->type != 6) {test_exit} - if(find_node->right->right->type != 9) {test_exit} - if(find_node->right->left->left->type != 5) {test_exit} - if(find_node->right->right->right->type != 10) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_10_1(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 8); - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 5); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 4); - - if(find_node->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - if(find_node->left->type != 2) {test_exit} - if(find_node->left->left->type != 1) {test_exit} - if(find_node->left->right->type != 3) {test_exit} - - if(find_node->right->type != 7) {test_exit} - if(find_node->right->left->type != 6) {test_exit} - if(find_node->right->right->type != 9) {test_exit} - if(find_node->right->right->right->type != 10) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_10_2(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 8); - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 6); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 4); - - if(find_node->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - if(find_node->left->type != 2) {test_exit} - if(find_node->left->left->type != 1) {test_exit} - if(find_node->left->right->type != 3) {test_exit} - - if(find_node->right->type != 7) {test_exit} - if(find_node->right->left->type != 5) {test_exit} - if(find_node->right->right->type != 9) {test_exit} - if(find_node->right->right->right->type != 10) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_10_3(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 9); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 4); - - if(find_node->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - if(find_node->left->type != 2) {test_exit} - if(find_node->left->left->type != 1) {test_exit} - if(find_node->left->right->type != 3) {test_exit} - - if(find_node->right->type != 8) {test_exit} - if(find_node->right->left->type != 6) {test_exit} - if(find_node->right->right->type != 10) {test_exit} - if(find_node->right->left->left->type != 5) {test_exit} - if(find_node->right->left->right->type != 7) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_10_4(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 4); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 3); - - if(find_node->type != 3) {test_exit} - if(find_node->parent != NULL) {test_exit} - - if(find_node->left->type != 2) {test_exit} - if(find_node->left->left->type != 1) {test_exit} - - if(find_node->right->type != 8) {test_exit} - if(find_node->right->left->type != 6) {test_exit} - if(find_node->right->right->type != 9) {test_exit} - if(find_node->right->left->left->type != 5) {test_exit} - if(find_node->right->left->right->type != 7) {test_exit} - if(find_node->right->right->right->type != 10) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -void avl_tree_test_delete_10_5(void) -{ - myhtml_utils_avl_tree_t *avl_tree = avl_tree_create(); - myhtml_utils_avl_tree_node_t *root_node = NULL; - - myhtml_utils_avl_tree_add(avl_tree, &root_node, 1, (void*)(1)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 2, (void*)(2)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 3, (void*)(3)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 4, (void*)(4)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 5, (void*)(5)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 6, (void*)(6)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 7, (void*)(7)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 8, (void*)(8)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 9, (void*)(9)); - myhtml_utils_avl_tree_add(avl_tree, &root_node, 10, (void*)(10)); - - myhtml_utils_avl_tree_delete(avl_tree, &root_node, 6); - - myhtml_utils_avl_tree_node_t *find_node = myhtml_utils_avl_tree_search_by_type(avl_tree, root_node, 4); - - if(find_node->type != 4) {test_exit} - if(find_node->parent != NULL) {test_exit} - - if(find_node->left->type != 2) {test_exit} - if(find_node->left->left->type != 1) {test_exit} - if(find_node->left->right->type != 3) {test_exit} - - if(find_node->right->type != 8) {test_exit} - if(find_node->right->left->type != 5) {test_exit} - if(find_node->right->right->type != 9) {test_exit} - if(find_node->right->left->right->type != 7) {test_exit} - if(find_node->right->right->right->type != 10) {test_exit} - - avl_tree = myhtml_utils_avl_tree_destroy(avl_tree, true); -} - -int main(int argc, const char * argv[]) -{ - myhtml_utils_avl_tree_t *avl_tree = myhtml_utils_avl_tree_create(); - - avl_tree_test_3_0(); - avl_tree_test_3_1(); - avl_tree_test_3_2(); - avl_tree_test_3_3(); - avl_tree_test_3_4(); - avl_tree_test_3_5(); - avl_tree_test_4(); - avl_tree_test_5(); - - avl_tree_test_delete_1L(); - avl_tree_test_delete_1R(); - avl_tree_test_delete_2L(); - avl_tree_test_delete_2R(); - - avl_tree_test_delete_sub_1L(); - avl_tree_test_delete_sub_1R(); - - avl_tree_test_delete_10_0(); - avl_tree_test_delete_10_1(); - avl_tree_test_delete_10_2(); - avl_tree_test_delete_10_3(); - avl_tree_test_delete_10_4(); - avl_tree_test_delete_10_5(); - - return EXIT_SUCCESS; -} - - diff --git a/test/myurl/Makefile.mk b/test/myurl/Makefile.mk new file mode 100644 index 0000000..d2ca170 --- /dev/null +++ b/test/myurl/Makefile.mk @@ -0,0 +1,9 @@ +myurl_dirs := . +myurl_objs := $(call BINARY_UTILS_OBJS,myurl,$(myurl_dirs)) + +myurl_all: $(myurl_objs) + +myurl_clean: + rm -f $(myurl_objs) + +myurl_url := $(TEST_DIR_RELATIVE)/myurl/data diff --git a/test/myurl/data/fragment.test b/test/myurl/data/fragment.test new file mode 100644 index 0000000..aa2b563 --- /dev/null +++ b/test/myurl/data/fragment.test @@ -0,0 +1,25 @@ +type 1 + +%URL:http://example.com#hash +%EXPECT:http://example.com/#hash + +%URL:http://example.com/#hash +%EXPECT:http://example.com/#hash + +%URL:http://example.com/path#hash +%EXPECT:http://example.com/path#hash + +%URL:http://example.com/path/#hash +%EXPECT:http://example.com/path/#hash + +%URL:http://example.com/path/#hash万 +%EXPECT:http://example.com/path/#hash%E4%B8%87 + +%URL:http://example.com/path/#ha万sh +%EXPECT:http://example.com/path/#ha%E4%B8%87sh + +%URL:http://example.com/?abc#hash +%EXPECT:http://example.com/?abc#hash + +%URL:http://example.com/?abc#hash-link +%EXPECT:http://example.com/?abc#hash-link diff --git a/test/myurl/data/hostname.test b/test/myurl/data/hostname.test new file mode 100644 index 0000000..b03f849 --- /dev/null +++ b/test/myurl/data/hostname.test @@ -0,0 +1,19 @@ +type 1 + +%URL:http://example.com/ +%EXPECT:http://example.com/ + +%URL:http://example.com./ +%EXPECT:http://example.com./ + +%URL:http://. +%EXPECT:http://./ + +%URL:http://./ +%EXPECT:http://./ + +%URL:https://a. +%EXPECT:https://a./ + +%URL:http://+-****/ +%EXPECT:http://+-****/ diff --git a/test/myurl/data/ipv4.test b/test/myurl/data/ipv4.test new file mode 100644 index 0000000..a08640d --- /dev/null +++ b/test/myurl/data/ipv4.test @@ -0,0 +1,161 @@ +type 2 + +%URL:http://./ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://./ + +%URL:http://. +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://./ + +%URL:http://192.168.0.1/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.168.0.1/ + +%URL:http://192.168.0.1 +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.168.0.1/ + +%URL:http://0xC0.0Xa8.0x0.0x1/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.168.0.1/ + +%URL:http://0xC0.0Xa8.0x0.0x1 +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.168.0.1/ + +%URL:http://192.168.9.com/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://192.168.9.com/ + +%URL:http://19a.168.0.1/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://19a.168.0.1/ + +%URL:http://0308.0250.00.01/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://0308.0250.00.01/ + +%URL:http://0xCG.0xA8.0x0.0x1/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://0xCG.0xA8.0x0.0x1/ + +%URL:http://0300.0250.00.01/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.168.0.1/ + +%URL:http://192.168.0.1./ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://192.168.0.1./ + +%URL:http://192.168.0.1. text/ +%EXPECT: + +%URL:http://192.168.0.1.text/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://192.168.0.1.text/ + +%URL:http://192.168.0.1../ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://192.168.0.1../ + +%URL:http://example.com../ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://example.com../ + +%URL:http://0x100.0.0.0/ +%EXPECT: + +%URL:http://192.168..1/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://192.168..1/ + +%URL:http://0x100.0/ +%EXPECT: + +%URL:http://0x100.0.0/ +%EXPECT: + +%URL:http://0x100.0.0.0/ +%EXPECT: + +%URL:http://0.0x100.0.0/ +%EXPECT: + +%URL:http://0.0.0x100.0/ +%EXPECT: + +%URL:http://0.0.0.0x100/ +%EXPECT: + +%URL:http://0.0.0x10000/ +%EXPECT: + +%URL:http://0.0x1000000/ +%EXPECT: + +%URL:http://0xFF.0/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://255.0.0.0/ + +%URL:http://0xFF.0.0.0/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://255.0.0.0/ + +%URL:http://0.0xFF.0.0/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://0.255.0.0/ + +%URL:http://0.0.0xFF.0/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://0.0.255.0/ + +%URL:http://0.0.0.0xFF/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://0.0.0.255/ + +%URL:http://0.0.0xFFFF/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://0.0.255.255/ + +%URL:http://0xFFFFFFFF/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://255.255.255.255/ + +%URL:http://276.256.0xf1a2.077777/ +%EXPECT: + +%URL:http://192.168.0.257/ +%EXPECT: + +%URL:http://192.168.0.256/ +%EXPECT: + +%URL:http://192.015052000001/ +%EXPECT: + +%URL:http://0X12C0a80001/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.168.0.1/ + +%URL:http://276.1.2/ +%EXPECT: + +%URL:http://0000000000000300.0x00000000000000fF.00000000000000001/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://192.255.0.1/ + +%URL:http://0000000000000300.0xffffffffFFFFFFFF.3022415481470977/ +%EXPECT: + +%URL:http://00000000000000000001/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://0.0.0.1/ + +%URL:http://0.0.0.000000000000000000z/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://0.0.0.000000000000000000z/ + +%URL:http://0.00.0x.0x0/ +%DOMAIN_TYPE:IPv4 +%EXPECT:http://0.0.0.0/ diff --git a/test/myurl/data/ipv6.test b/test/myurl/data/ipv6.test new file mode 100644 index 0000000..7cfc85d --- /dev/null +++ b/test/myurl/data/ipv6.test @@ -0,0 +1,176 @@ +type 2 + +%URL:http://[/ +%EXPECT: + +%URL:http://[:/ +%EXPECT: + +%URL:http://]/ +%DOMAIN_TYPE:DOMAIN +%EXPECT:http://]/ + +%URL:http://[:]/ +%EXPECT: + +%URL:http://2001:db8::1/ +%EXPECT: + +%URL:http://[2001:db8::1/ +%EXPECT: + +%URL:http://2001:db8::1]/ +%EXPECT: + +%URL:http://[::]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[::]/ + +%URL:http://[::1]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[::1]/ + +%URL:http://[1::.]/ +%EXPECT: + +%URL:http://[::1.]/ +%EXPECT: + +%URL:http://[::192.168.0.1.]/ +%EXPECT: + +%URL:http://[::ffff:192.168.0.1]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[::ffff:c0a8:1]/ + +%URL:http://[000:01:02:003:004:5:6:007.]/ +%EXPECT: + +%URL:http://[000:01:02:003:004:5:6:007]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[0:1:2:3:4:5:6:7]/ + +%URL:http://[A:b:c:DE:fF:0:1:aC.]/ +%EXPECT: + +%URL:http://[A:b:c:DE:fF:0:1:aC]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[a:b:c:de:ff:0:1:ac]/ + +%URL:http://[A:b:c:DE:fF:0:1::]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[a:b:c:de:ff:0:1:0]/ + +%URL:http://[1:0:0:2::3:0]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[1::2:0:0:3:0]/ + +%URL:http://[1::2:0:0:3:0]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[1::2:0:0:3:0]/ + +%URL:http://[::eeee:192.168.0.1]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[::eeee:c0a8:1]/ + +%URL:http://[::eeee:192.168.0.1.]/ +%EXPECT: + +%URL:http://[2001::192.168.0.1]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[2001::c0a8:1]/ + +%URL:http://[1:2:192.168.0.1:5:6]/ +%EXPECT: + +%URL:http://[::ffff:192.1.2]/ +%EXPECT: + +%URL:http://[::ffff:0xC0.0Xa8.0x0.0x1]/ +%EXPECT: + +%URL:http://[0:0::0:0:8]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[::8]/ + +%URL:http://[2001:db8::1]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[2001:db8::1]/ + +%URL:http://[2001:db8::1]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[2001:db8::1]/ + +%URL:http://[2001::db8::1]/ +%EXPECT: + +%URL:http://[2001:db8:::1]/ +%EXPECT: + +%URL:http://[:::]/ +%EXPECT: + +%URL:http://[2001::.com]/ +%EXPECT: + +%URL:http://[::192.168.0.0.1]/ +%EXPECT: + +%URL:http://[::ffff:192.168.0.0.1]/ +%EXPECT: + +%URL:http://[1:2:3:4:5:6:7:8:9]/ +%EXPECT: + +%URL:http://[0:0:0:0:0:0:0:192.168.0.1]/ +%EXPECT: + +%URL:http://[1:2:3:4:5:6::192.168.0.1]/ +%EXPECT: + +%URL:http://[1:2:3:4:5:6::8]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[1:2:3:4:5:6:0:8]/ + +%URL:http://[1:2:3:4:5:6:7:8:]/ +%EXPECT: + +%URL:http://[1:2:3:4:5:6:192.168.0.1:]/ +%EXPECT: + +%URL:http://[-1:2:3:4:5:6:7:8]/ +%EXPECT: + +%URL:http://[1::%1]/ +%EXPECT: + +%URL:http://[1::%eth0]/ +%EXPECT: + +%URL:http://[1::%]/ +%EXPECT: + +%URL:http://[%]/ +%EXPECT: + +%URL:http://[::%:]/ +%EXPECT: + +%URL:http://[:0:0::0:0:8]/ +%EXPECT: + +%URL:http://[0:0::0:0:8:]/ +%EXPECT: + +%URL:http://[:0:0::0:0:8:]/ +%EXPECT: + +%URL:http://[::192.168..1]/ +%EXPECT: + +%URL:http://[::1 hello]/ +%EXPECT: + +%URL:http://[2001:db8::]/ +%DOMAIN_TYPE:IPv6 +%EXPECT:http://[2001:db8::]/ diff --git a/test/myurl/data/mailto.test b/test/myurl/data/mailto.test new file mode 100644 index 0000000..ed7c0ab --- /dev/null +++ b/test/myurl/data/mailto.test @@ -0,0 +1,28 @@ +type 1 + +%URL:mailto:addr1 +%EXPECT:mailto:addr1 + +%URL:mailto:addr1@foo.com +%EXPECT:mailto:addr1@foo.com + +%URL:mailto:addr1 +%EXPECT:mailto:addr1 + +%URL:mailto:addr1?to=jon +%EXPECT:mailto:addr1?to=jon + +%URL:mailto:addr1,addr2 +%EXPECT:mailto:addr1,addr2 + +%URL:mailto:addr1, addr2 +%EXPECT:mailto:addr1, addr2 + +%URL:mailto:addr1%2caddr2 +%EXPECT:mailto:addr1%2caddr2 + +%URL:mailto:������ +%EXPECT:mailto:%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD + +%URL:mailto:addr1? +%EXPECT:mailto:addr1? diff --git a/test/myurl/data/miscellaneous.test b/test/myurl/data/miscellaneous.test new file mode 100644 index 0000000..089571c --- /dev/null +++ b/test/myurl/data/miscellaneous.test @@ -0,0 +1,43 @@ +type 1 + +%URL:http://user%40example.com/ +%EXPECT:http://user@example.com/ + +%URL:http://user%3Ainfo%40/ +%EXPECT:http://user:info@/ + +%URL:http://user@/ +%EXPECT: + +%URL:$:foo/bar +%EXPECT: + +%URL:mailto::foo@bar.com +%EXPECT:mailto::foo@bar.com + +%URL:html://lastmac@12345:example.com +%EXPECT: + +%URL:html://lastmac:12345@example.com +%EXPECT:html://lastmac:12345@example.com + +%URL:html://lastmac:1@2345@example.com +%EXPECT:html://lastmac:1%402345@example.com + +%URL:html://lastmac:1@2345@@example.com +%EXPECT:html://lastmac:1%402345%40@example.com + +%URL:html://lastmac:@1@2345@@example.com +%EXPECT:html://lastmac:%401%402345%40@example.com + +%URL:html://:@1@2345@@example.com +%EXPECT:html://:%401%402345%40@example.com + +%URL:html://:@example.com +%EXPECT:html://example.com + +%URL:html://lastmac:@example.com +%EXPECT:html://lastmac@example.com + +%URL:html://lastmac:::::123@example.com +%EXPECT:html://lastmac:%3A%3A%3A%3A123@example.com diff --git a/test/myurl/data/path.test b/test/myurl/data/path.test new file mode 100644 index 0000000..4a8b3ca --- /dev/null +++ b/test/myurl/data/path.test @@ -0,0 +1,183 @@ +type 1 + +%URL:http://example.com +%EXPECT:http://example.com/ + +%URL:http://example.com/ +%EXPECT:http://example.com/ + +%URL:http://example.com/a +%EXPECT:http://example.com/a + +%URL:http://example.com/a/ +%EXPECT:http://example.com/a/ + +%URL:http://example.com/a/b/c +%EXPECT:http://example.com/a/b/c + +%URL:http://example.com/a/b/c/ +%EXPECT:http://example.com/a/b/c/ + +%URL:http://example.com/././c +%EXPECT:http://example.com/c + +%URL:http://example.com/././.c +%EXPECT:http://example.com/.c + +%URL:http://www.example.com/a/. +%EXPECT:http://www.example.com/a/ + +%URL:http://www.example.com/a/./ +%EXPECT:http://www.example.com/a/ + +%URL:http://www.example.com/a/b/.. +%EXPECT:http://www.example.com/a/ + +%URL:http://www.example.com/foo/bar/../ +%EXPECT:http://www.example.com/foo/ + +%URL:http://www.example.com/a/..bar +%EXPECT:http://www.example.com/a/..bar + +%URL:http://www.example.com/a/b/../ton +%EXPECT:http://www.example.com/a/ton + +%URL:http://www.example.com/a/b/../d/../../g +%EXPECT:http://www.example.com/g + +%URL:http://www.example.com/a/../../.. +%EXPECT:http://www.example.com/ + +%URL:http://www.example.com/a/../../../e +%EXPECT:http://www.example.com/e + +%URL:http://www.example.com/a/%2e +%EXPECT:http://www.example.com/a/ + +%URL:http://www.example.com////../.. +%EXPECT:http://www.example.com// + +%URL:http://www.example.com/a/b//../.. +%EXPECT:http://www.example.com/a/ + +%URL:http://www.example.com/a/b//.. +%EXPECT:http://www.example.com/a/b/ + +%URL:http://www.example.com/a/b/.. +%EXPECT:http://www.example.com/a/ + +%URL:http://www.example.com/(%28:%3A%29) +%EXPECT:http://www.example.com/(%28:%3A%29) + +%URL:http://www.example.com/%3A%3a%3C%3c +%EXPECT:http://www.example.com/%3A%3a%3C%3c + +%URL:http://www.example.com/万abc +%EXPECT:http://www.example.com/%E4%B8%87abc + +%URL:http://example.com/a/万 +%EXPECT:http://example.com/a/%E4%B8%87 + +%URL:http://example.com/a/万/ +%EXPECT:http://example.com/a/%E4%B8%87/ + +%URL:http://example.com/a/万/c/ +%EXPECT:http://example.com/a/%E4%B8%87/c/ + +%URL:http://example.com/ a / b / c / +%EXPECT:http://example.com/%20a%20%20/%20%20b%20/%20%20c%20/ + +%URL:http://example.com/a +/ +b/c/ + +%EXPECT:http://example.com/a/b/c/ + +%URL:http://example.com/ +a +/ +b/c +/ + +%EXPECT:http://example.com/a/b/c/ + +%URL:http://example.com/a/b\c/d\e/f +%EXPECT:http://example.com/a/b/c/d/e/f + +%URL:http://example.com\a\b\c\ +%EXPECT:http://example.com/a/b/c/ + +%URL:http://example.com\a\b\c +%EXPECT:http://example.com/a/b/c + +%URL:http://example.com\a +%EXPECT:http://example.com/a + +%URL:http://example.com\a/ +%EXPECT:http://example.com/a/ + +%URL:http://example.com\ +%EXPECT:http://example.com/ + +%URL:file:C:\example\ +%EXPECT:file:///C:/example/ + +%URL:file:///C:\example\ +%EXPECT:file:///C:/example/ + +%URL:file:///C:\example\\\\\\\\ +%EXPECT:file:///C:/example//////// + +%URL:file:///C:\\\\\\\\example\\\\\\\\ +%EXPECT:file:///C:////////example//////// + +%URL:file:///C|\\\\\\\\example\\\\\\\\ +%EXPECT:file:///C:////////example//////// + +%URL:file://C|\\\\\\\\example\\\\\\\\ +%EXPECT:file:///C:////////example//////// + +%URL:file://C:\example\ +%EXPECT:file:///C:/example/ + +%URL:file://C:\example\\\\\\\\ +%EXPECT:file:///C:/example//////// + +%URL:file://C:\\\\\\\\example\\\\\\\\ +%EXPECT:file:///C:////////example//////// + +%URL:file:///user/data/ +%EXPECT:file:///user/data/ + +%URL:file://user/data/ +%EXPECT:file://user/data/ + +%URL:file://user/data +%EXPECT:file://user/data + +%URL:file:/user/data +%EXPECT:file:///user/data + +%URL:file:/user +%EXPECT:file:///user + +%URL:file:/ +%EXPECT:file:/// + +%URL:file: +%EXPECT:file:/// + +%URL:file +%EXPECT: + +%URL:file://localhost/C:/foo +%EXPECT:file:///C:/foo + +%URL:file://localhost/foo +%EXPECT:file:///foo + +%URL:\\\\another\\path +%EXPECT: + +%URL:file:///C:/foo +%EXPECT:file:///C:/foo diff --git a/test/myurl/data/port.test b/test/myurl/data/port.test new file mode 100644 index 0000000..7f857af --- /dev/null +++ b/test/myurl/data/port.test @@ -0,0 +1,34 @@ +type 1 + +%URL:http://www.example.com:hahaha/ +%EXPECT: + +%URL:http://www.example.com: hah aha/ +%EXPECT: + +%URL:http://www.example.com:-1/ +%EXPECT: + +%URL:http://www.example.com:-1/ +%EXPECT: + +%URL:http://www.example.com:123/ +%EXPECT:http://www.example.com:123/ + +%URL:http://www.example.com:80/ +%EXPECT:http://www.example.com/ + +%URL:http://www.example.com:/ +%EXPECT:http://www.example.com/ + +%URL:http://www.example.com:/ +%EXPECT:http://www.example.com/ + +%URL:http://www.example.com:15615156165165165/ +%EXPECT: + +%URL:https://www.example.com:443/ +%EXPECT:https://www.example.com/ + +%URL:https://www.example.com:442/ +%EXPECT:https://www.example.com:442/ diff --git a/test/myurl/data/query.test b/test/myurl/data/query.test new file mode 100644 index 0000000..2b8959d --- /dev/null +++ b/test/myurl/data/query.test @@ -0,0 +1,26 @@ +type 1 + +%URL:http://example.com?abc +%EXPECT:http://example.com/?abc + +%URL:http://example.com/?abc +%EXPECT:http://example.com/?abc + +%URL:http://example.com/?key=value +%EXPECT:http://example.com/?key=value + +%URL:http://example.com/?key=value&hohoho=hahaha +%EXPECT:http://example.com/?key=value&hohoho=hahaha + +%URL:http://example.com/?key=val ue +%EXPECT:http://example.com/?key=val%20ue + +%URL:http://example.com/?key=val万ue +%EXPECT:http://example.com/?key=val%E4%B8%87ue + +%URL:http://example.com/?key=v +al万u e +%EXPECT:http://example.com/?key=val%E4%B8%87ue + +%URL:http://example.com/?abc#hash +%EXPECT:http://example.com/?abc#hash diff --git a/test/myurl/data/relative.test b/test/myurl/data/relative.test new file mode 100644 index 0000000..99dc39e --- /dev/null +++ b/test/myurl/data/relative.test @@ -0,0 +1,208 @@ +type 3 + +%URL:/path +%BASE:http://example.com/ +%EXPECT:http://example.com/path + +%URL:/path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/path/ + +%URL:../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/path/ + +%URL:/../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/path/ + +%URL:../../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/path/ + +%URL:/../../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/path/ + +%URL:/../../../../../../../../../../../../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/path/ + +%URL:a/b/c/../../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/a/path/ + +%URL:a/b/c/../../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/a/path/ + +%URL:a/b/c/./../path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/a/b/path/ + +%URL:a/b/c/././path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/a/b/c/path/ + +%URL:a/b/../c/././././././././path/ +%BASE:http://example.com/ +%EXPECT:http://example.com/a/c/path/ + +%URL:a/b/../c/././././././././ +%BASE:http://example.com/ +%EXPECT:http://example.com/a/c/ + +%URL:a/b/../c/./././././././. +%BASE:http://example.com/ +%EXPECT:http://example.com/a/c/ + +%URL:a/b/../c/./././././././. +%BASE:http://example.com/ +%EXPECT:http://example.com/a/c/ + +%URL:a/b/../c +%BASE:http://example.com/../../ +%EXPECT:http://example.com/a/c + +%URL:/path/ +%BASE:http://example.com/?key=value&a=1 +%EXPECT:http://example.com/path/ + +%URL:/path/ +%BASE:http://example.com/?key=value&a=1 +%EXPECT:http://example.com/path/ + +%URL:/path/?b=2 +%BASE:http://example.com/?key=value&a=1 +%EXPECT:http://example.com/path/?b=2 + +%URL:/path/ +%BASE:http://example.com/#hash +%EXPECT:http://example.com/path/ + +%URL:/path/#myhash +%BASE:http://example.com/#hash +%EXPECT:http://example.com/path/#myhash + +%URL: /path/ +%BASE:http://example.com +%EXPECT:http://example.com/path/ + +%URL: . +%BASE:http://example.com/path +%EXPECT:http://example.com/ + +%URL: + + + +%BASE:http://example.com/ +%EXPECT:http://example.com/ + +%URL:http:/path +%BASE:http://host/a +%EXPECT:http://host/path + +%URL:HTTP:/path +%BASE:http://host/a +%EXPECT:http://host/path + +%URL:HTTP:path +%BASE:http://host/a +%EXPECT:http://host/path + +%URL:HTTP:path +%BASE:http://host/a/ +%EXPECT:http://host/a/path + +%URL:HTTP:path/ +%BASE:http://host/a/ +%EXPECT:http://host/a/path/ + +%URL:httg:/myhost +%BASE:http://host/a +%EXPECT:httg:/myhost + +%URL:https:/myhost +%BASE:http://host/a +%EXPECT:https://myhost/ + +%URL:/b/../c +%BASE:http://host/a?b#c +%EXPECT:http://host/c + +%URL:bc/de?query#ref +%BASE:http://host/a/ +%EXPECT:http://host/a/bc/de?query#ref + +%URL:.. +%BASE:http://host/a/ +%EXPECT:http://host/ + +%URL:./.. +%BASE:http://host/a/ +%EXPECT:http://host/ + +%URL:../. +%BASE:http://host/a/ +%EXPECT:http://host/ + +%URL:../../../foo +%BASE:http://host/a?query#ref +%EXPECT:http://host/foo + +%URL:? +%BASE:http://host/a?x=y#z +%EXPECT:http://host/a? + +%URL:?foo=bar#com +%BASE:http://host/a?x=y#z +%EXPECT:http://host/a?foo=bar#com + +%URL:#ref +%BASE:http://host/a +%EXPECT:http://host/a#ref + +%URL:# +%BASE:http://host/a#b +%EXPECT:http://host/a# + +%URL:#bye +%BASE:http://host/a?foo=bar#hello +%EXPECT:http://host/a?foo=bar#bye + +%URL:baz.html +%BASE:data:foobar +%EXPECT: + +%URL:data:baz +%BASE:data:foobar +%EXPECT:data:baz + +%URL:data:/base +%BASE:data:foobar +%EXPECT:data:/base + +%URL:./asd:fgh +%BASE:http://foo/bar +%EXPECT:http://foo/asd:fgh + +%URL: hello world +%BASE:http://foo/bar +%EXPECT:http://foo/hello%20world + +%URL:///another/path +%BASE:http://host/a +%EXPECT:http://another/path + +%URL:// +%BASE:http://host/a +%EXPECT: + +%URL:\\/another/path +%BASE:http://host/a +%EXPECT:http://another/path + +%URL:/\\Another\\path +%BASE:http://host/a +%EXPECT:http://Another//path diff --git a/test/myurl/data/relative_win.test b/test/myurl/data/relative_win.test new file mode 100644 index 0000000..f1297c4 --- /dev/null +++ b/test/myurl/data/relative_win.test @@ -0,0 +1,77 @@ +type 3 + +%URL:http://host/ +%BASE:file:///C:/foo +%EXPECT:http://host/ + +%URL:bar +%BASE:file:///C:/foo +%EXPECT:file:///C:/bar + +%URL:../../../bar.html +%BASE:file:///C:/foo +%EXPECT:file:///bar.html + +%URL:/../bar.html +%BASE:file:///C:/foo +%EXPECT:file:///C:/bar.html + +%URL:\\\\another\\path +%BASE:http://host/a +%EXPECT:http://another//path + +%URL://c:/foo +%BASE:file:///C:/something +%EXPECT:file:///c:/foo + +%URL://localhost/c:/foo +%BASE:file:///C:/something +%EXPECT:file:///c:/foo + +%URL:c: +%BASE:file:///C:/foo +%EXPECT:c: + +%URL:c:/foo +%BASE:file:///C:/foo +%EXPECT:c:/foo + +%URL:c:\\foo +%BASE:http://host/a +%EXPECT:c:\\foo + +%URL:/z:/bar +%BASE:file:///C:/foo +%EXPECT:file:///C:/z:/bar + +%URL:/bar +%BASE:file:///C:/foo +%EXPECT:file:///C:/bar + +%URL:/bar +%BASE:file://localhost/C:/foo +%EXPECT:file:///C:/bar + +%URL:/bar +%BASE:file:///localhost/C:/foo +%EXPECT:file:///bar + +%URL:/bar +%BASE:file:///localhost/C:/foo +%EXPECT:file:///bar + +%URL:bar +%BASE:file:///localhost/C:/foo +%EXPECT:file:///localhost/C:/bar + +%URL:/bar +%BASE:file:///C:/foo/com/ +%EXPECT:file:///C:/bar + +%URL://somehost/path +%BASE:file:///C:/something +%EXPECT:file://somehost/path + +%URL:/\\//somehost/path +%BASE:file:///C:/something +%EXPECT:file://///somehost/path diff --git a/test/myurl/data/scheme.test b/test/myurl/data/scheme.test new file mode 100644 index 0000000..4385b8c --- /dev/null +++ b/test/myurl/data/scheme.test @@ -0,0 +1,100 @@ +type 1 + +%URL:http://example.com/ +%EXPECT:http://example.com/ + +%URL:HTTP://example.com/ +%EXPECT:http://example.com/ + +%URL:hTtP://example.com/ +%EXPECT:http://example.com/ + +%URL:https://example.com/ +%EXPECT:https://example.com/ + +%URL:blob:d3958f5c-0777-0845-9dcf-2cb28783acaf +%EXPECT:blob:d3958f5c-0777-0845-9dcf-2cb28783acaf + +%URL:wss://example.com/ +%EXPECT:wss://example.com/ + +%URL:ws://example.com/ +%EXPECT:ws://example.com/ + +%URL:filesystem:/new/god/of/war +%EXPECT:filesystem:/new/god/of/war + +%URL:ftp://example.com/ +%EXPECT:ftp://example.com/ + +%URL:data:image/gif;base64,R01 +%EXPECT:data:image/gif;base64,R01 + +%URL:gopher://example.com/ +%EXPECT:gopher://example.com/ + +%URL:about:blank +%EXPECT:about:blank + +%URL:about:blanksdfsdfsfd/dsfsfsf/564ytry/ +%EXPECT:about:blanksdfsdfsfd/dsfsfsf/564ytry/ + +%URL:about:blanksdfsdfsfd/dsfsfsf/564ytry +%EXPECT:about:blanksdfsdfsfd/dsfsfsf/564ytry + +%URL:http:///////example.com/ +%EXPECT:http://example.com/ + +%URL:http:/fdf/example.com/ +%EXPECT:http://fdf/example.com/ + +%URL:http:fdf/example.com/ +%EXPECT:http://fdf/example.com/ + +%URL:httpss://example.com/ +%EXPECT:httpss://example.com/ + +%URL:://example.com/ +%EXPECT: + +%URL:/example.com/ +%EXPECT: + +%URL://example.com/ +%EXPECT: + +%URL:http//example.com/ +%EXPECT: + +%URL:MySCHEMA://example.com/ +%EXPECT:MySCHEMA://example.com/ + +%URL:http://example.com +%EXPECT:http://example.com/ + +%URL:http +%EXPECT: + +%URL:http: +%EXPECT: + +%URL:http:// +%EXPECT: + +%URL:http://. +%EXPECT:http://./ + +%URL:http://.. +%EXPECT:http://../ + +%URL:http://a. +%EXPECT:http://a./ + +%URL:万://a. +%EXPECT: + +%URL:htt万://a. +%EXPECT: + +%URL:-://a. +%EXPECT: diff --git a/test/myurl/url.c b/test/myurl/url.c new file mode 100644 index 0000000..96369e2 --- /dev/null +++ b/test/myurl/url.c @@ -0,0 +1,514 @@ +/* + Copyright (C) 2015-2017 Alexander Borisov + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + Author: lex.borisov@gmail.com (Alexander Borisov) + */ + +#include +#include +#include +#include + +#include +#include +#include + +struct test_res { + char* data; + size_t size; +} +typedef test_res_t; + +struct test_pos { + size_t begin; + size_t length; +} +typedef test_pos_t; + +enum test_type { + TEST_TYPE_UNDEF = 0x00, + TEST_TYPE_FIRST = '1', + TEST_TYPE_SECOND = '2', + TEST_TYPE_THIRD = '3', + TEST_TYPE_FOURTH = '4' +}; + +static mchar_async_t* MCharOBJ = NULL; +static size_t MCharOBJNode = 0; + +test_pos_t test_get_value(const char *data, size_t* length, size_t data_size, const char* some); + +test_res_t test_load_file(const char* filename) +{ + FILE *fh = fopen(filename, "rb"); + if(fh == NULL) { + fprintf(stderr, "Can't open file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(fseek(fh, 0L, SEEK_END) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + long size = ftell(fh); + + if(fseek(fh, 0L, SEEK_SET) != 0) { + fprintf(stderr, "Can't set position (fseek) in file: %s\n", filename); + exit(EXIT_FAILURE); + } + + if(size <= 0) { + fprintf(stderr, "Can't get file size or file is empty: %s\n", filename); + exit(EXIT_FAILURE); + } + + char *file_data = (char*)malloc(size + 1); + if(file_data == NULL) { + fprintf(stderr, "Can't allocate mem for file: %s\n", filename); + exit(EXIT_FAILURE); + } + + size_t nread = fread(file_data, 1, size, fh); + if (nread != size) { + fprintf(stderr, "Could not read %ld bytes (%zu bytes done)\n", size, nread); + exit(EXIT_FAILURE); + } + + fclose(fh); + + return (test_res_t){file_data, (size_t)size}; +} + +mystatus_t test_serialization_callback(const char* data, size_t len, void* ctx) +{ + mycore_string_t *str = ctx; + mycore_string_append(str, data, len); + + return MyCORE_STATUS_OK; +} + +myurl_entry_t * test_parse_url(const char *data, size_t length, myurl_entry_t* base_url) +{ + myurl_t *url = myurl_create(); + if(url == NULL) { + fprintf(stderr, "Could create url object\n"); + exit(EXIT_FAILURE); + } + + if(myurl_init(url)) { + fprintf(stderr, "Could init url object\n"); + exit(EXIT_FAILURE); + } + + myurl_entry_t *url_entry = myurl_parse(url, data, length, base_url, NULL); + + if(url_entry == NULL) { + myurl_destroy(url, true); + return NULL; + } + + return url_entry; +} + +void test_destroy_url(myurl_entry_t* entry_url) +{ + if(entry_url) { + myurl_t *url = entry_url->url_ref; + myurl_entry_destroy(entry_url, true); + myurl_destroy(url, true); + } +} + +myurl_host_type_t test_host_type_from_data(const char *data, size_t length) +{ + if(strncmp("IPv4", data, length) == 0) { + return MyURL_HOST_TYPE_IPv4; + } + else if(strncmp("IPv6", data, length) == 0) { + return MyURL_HOST_TYPE_IPv6; + } + else if(strncmp("DOMAIN", data, length) == 0) { + return MyURL_HOST_TYPE_DOMAIN; + } + else if(strncmp("OPAQUE", data, length) == 0) { + return MyURL_HOST_TYPE_OPAQUE; + } + + return MyURL_HOST_TYPE_UNDEF; +} + +myurl_host_type_t test_get_domain_type(const char *data, size_t* length, size_t data_size) +{ + test_pos_t domain_type = test_get_value(data, length, data_size, "%DOMAIN_TYPE:"); + myurl_host_type_t domain_type_int = test_host_type_from_data(&data[domain_type.begin], domain_type.length); + + return domain_type_int; +} + +test_pos_t test_get_value(const char *data, size_t* length, size_t data_size, const char* some) +{ + test_pos_t pos = {0}; + size_t some_len = strlen(some); + + size_t len = *length + some_len; + + if(len >= data_size) + return pos; + + if(strncmp(some, &data[ *length ], some_len)) + return pos; + + pos.begin = len; + + while(len < data_size) { + if(data[len] == '%') + { + size_t bpos = len; + bpos++; + + while(bpos < data_size) { + if((bpos - 1) > len && (data[bpos] < 'A' || data[bpos] > 'Z') && data[bpos] != '_') { + if(data[bpos] == ':') { + if(strncmp("%URL", &data[len], 4) == 0) + pos.length = ((len - pos.begin) - 2); + else + pos.length = ((len - pos.begin) - 1); + + *length = len; + return pos; + } + + break; + } + + bpos++; + } + } + + len++; + } + + *length = len; + pos.length = ((len - pos.begin) - 1); + + return pos; +} + +/* FIRST */ +bool test_for_type_first_entry(const char *data, size_t* length, size_t data_size) +{ + test_pos_t url = test_get_value(data, length, data_size, "%URL:"); + if(url.length == 0) + return true; + + //printf("%.*s\n", (int)url.length, &data[ url.begin ]); + + myurl_entry_t *url_entry = test_parse_url(&data[ url.begin ], url.length, NULL); + + /* get expected */ + test_pos_t expect = test_get_value(data, length, data_size, "%EXPECT:"); + if(expect.length == 0) { + if(url_entry == NULL) + return true; + } + + if(url_entry == NULL) { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tResult:\n"); + fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); + + test_destroy_url(url_entry); + return true; + } + + mycore_string_t cmp_str = {0}; + mycore_string_init(MCharOBJ, MCharOBJNode, &cmp_str, 1024); + + myurl_serialization(url_entry, false, test_serialization_callback, &cmp_str); + + /* compare */ + if(cmp_str.length != expect.length || strncmp(cmp_str.data, &data[expect.begin], cmp_str.length)) + { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tResult: %.*s\n", (int)cmp_str.length, cmp_str.data); + fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); + + mycore_string_destroy(&cmp_str, false); + test_destroy_url(url_entry); + return true; + } + + mycore_string_destroy(&cmp_str, false); + test_destroy_url(url_entry); + + return true; +} + +bool test_for_type_first(const char *data, size_t length, size_t data_size) +{ + while(length < data_size) { + if(test_for_type_first_entry(data, &length, data_size) == false) + return false; + } + + return true; +} + +/* SECOND */ +bool test_for_type_second_entry(const char *data, size_t* length, size_t data_size) +{ + test_pos_t url = test_get_value(data, length, data_size, "%URL:"); + if(url.length == 0) + return true; + + /* get domain_type */ + myurl_host_type_t domain_type = test_get_domain_type(data, length, data_size); + + //printf("%.*s\n", (int)url.length, &data[ url.begin ]); + + myurl_entry_t *url_entry = test_parse_url(&data[ url.begin ], url.length, NULL); + + /* get expected */ + test_pos_t expect = test_get_value(data, length, data_size, "%EXPECT:"); + if(expect.length == 0) { + if(url_entry == NULL) + return true; + } + + if(url_entry == NULL) { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tResult:\n"); + fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); + + test_destroy_url(url_entry); + return true; + } + + if(url_entry->host.type != domain_type) { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tDomain Type: %d\n", url_entry->host.type); + fprintf(stderr, "\tDomain Ip Version Type: %d\n", url_entry->host.value.ipv.type); + fprintf(stderr, "\tExpect Domain Type: %d\n\n", domain_type); + + test_destroy_url(url_entry); + return true; + } + + mycore_string_t cmp_str = {0}; + mycore_string_init(MCharOBJ, MCharOBJNode, &cmp_str, 1024); + + myurl_serialization(url_entry, false, test_serialization_callback, &cmp_str); + + /* compare */ + if(cmp_str.length != expect.length || strncmp(cmp_str.data, &data[expect.begin], cmp_str.length)) + { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tResult: %.*s\n", (int)cmp_str.length, cmp_str.data); + fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); + + mycore_string_destroy(&cmp_str, false); + test_destroy_url(url_entry); + return true; + } + + mycore_string_destroy(&cmp_str, false); + test_destroy_url(url_entry); + + return true; +} + +bool test_for_type_second(const char *data, size_t length, size_t data_size) +{ + while(length < data_size) { + if(test_for_type_second_entry(data, &length, data_size) == false) + return false; + } + + return true; +} + +/* THIRD */ +bool test_for_type_third_entry(const char *data, size_t* length, size_t data_size) +{ + test_pos_t url = test_get_value(data, length, data_size, "%URL:"); + if(url.length == 0) + return true; + + /* get base */ + test_pos_t base = test_get_value(data, length, data_size, "%BASE:"); + if(base.length == 0) + return true; + + myurl_entry_t *base_entry = test_parse_url(&data[ base.begin ], base.length, NULL); + myurl_entry_t *url_entry = test_parse_url(&data[ url.begin ], url.length, base_entry); + + /* get expected */ + test_pos_t expect = test_get_value(data, length, data_size, "%EXPECT:"); + if(expect.length == 0) { + if(url_entry == NULL) + return true; + } + + if(url_entry == NULL) { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tBASE: %.*s\n", (int)base.length, &data[ base.begin ]); + fprintf(stderr, "\tResult:\n"); + fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); + + test_destroy_url(url_entry); + return true; + } + + mycore_string_t cmp_str = {0}; + mycore_string_init(MCharOBJ, MCharOBJNode, &cmp_str, 1024); + + myurl_serialization(url_entry, false, test_serialization_callback, &cmp_str); + + /* compare */ + if(cmp_str.length != expect.length || strncmp(cmp_str.data, &data[expect.begin], cmp_str.length)) + { + fprintf(stderr, "Test FAILURE!\n"); + fprintf(stderr, "\tURL: %.*s\n", (int)url.length, &data[ url.begin ]); + fprintf(stderr, "\tBASE: %.*s\n", (int)base.length, &data[ base.begin ]); + fprintf(stderr, "\tResult: %.*s\n", (int)cmp_str.length, cmp_str.data); + fprintf(stderr, "\tExpect: %.*s\n\n", (int)expect.length, &data[expect.begin]); + + mycore_string_destroy(&cmp_str, false); + test_destroy_url(url_entry); + return true; + } + + mycore_string_destroy(&cmp_str, false); + test_destroy_url(url_entry); + + return true; +} + +bool test_for_type_third(const char *data, size_t length, size_t data_size) +{ + while(length < data_size) { + if(test_for_type_third_entry(data, &length, data_size) == false) + return false; + } + + return true; +} + +void test_by_type(const char *data, size_t data_size, const char* filename) +{ + printf("Test file: %s\n", filename); + + size_t length = 8; + + if(data_size <= length || strncmp("type ", data, 5)) { + fprintf(stderr, "Could not read type form %s\n", filename); + exit(EXIT_FAILURE); + } + + switch ((unsigned char)data[5]) { + case TEST_TYPE_FIRST: + test_for_type_first(&data[8], 0, (data_size - 8)); + break; + + case TEST_TYPE_SECOND: + test_for_type_second(&data[8], 0, (data_size - 8)); + break; + + case TEST_TYPE_THIRD: + test_for_type_third(&data[8], 0, (data_size - 8)); + break; + + default: + break; + } +} + +void test(const char* filename) +{ + test_res_t test_data = test_load_file(filename); + test_by_type(test_data.data, test_data.size, filename); + + if(test_data.data) + free(test_data.data); +} + +void test_read_dir(const char* dir_path) +{ + char path[(4096 * 4)]; + sprintf(path, "%s", dir_path); + + printf("Tests in directory: %s\n", path); + + size_t path_len = strlen(dir_path); + + DIR *dir; + struct dirent *ent; + struct stat path_stat; + + if((dir = opendir(dir_path)) != NULL) + { + while((ent = readdir(dir)) != NULL) + { + sprintf(&path[path_len], "/%s", ent->d_name); + + if(stat(path, &path_stat) != 0) { + fprintf(stderr, "Can't get status for file: %s\n", path); + exit(EXIT_FAILURE); + } + + if(ent->d_name[0] == '.' || S_ISDIR(path_stat.st_mode)) + continue; + + test(path); + } + + closedir (dir); + } +} + +int main(int argc, const char * argv[]) +{ + setbuf(stdout, NULL); + + if (argc < 2) { + printf("Bad ARGV!\nUse: url \n"); + exit(EXIT_FAILURE); + } + + MCharOBJ = mchar_async_create(); + if(MCharOBJ == NULL) + return EXIT_FAILURE; + + if(mchar_async_init(MCharOBJ, 4, 4096)) + return EXIT_FAILURE; + + MCharOBJNode = mchar_async_node_add(MCharOBJ, NULL); + + test_read_dir(argv[1]); + //test_read_dir("/new/C-git/Modest/test/myurl/data"); + + mchar_async_destroy(MCharOBJ, true); + + return EXIT_SUCCESS; +} diff --git a/utils/MyHTML/encoding_name.pl b/utils/MyHTML/encoding_name.pl index d67b107..d2b8641 100755 --- a/utils/MyHTML/encoding_name.pl +++ b/utils/MyHTML/encoding_name.pl @@ -168,13 +168,13 @@ sub print_enum { print "enum myhtml_encoding_list {\n\t"; my @vals; - push @vals, ["MyHTML_ENCODING_DEFAULT", "0x00"]; - push @vals, ["MyHTML_ENCODING_AUTO", "0x01"]; - push @vals, ["MyHTML_ENCODING_NOT_DETERMINED", "0x02"]; - push @vals, ["MyHTML_ENCODING_UTF_8", "0x00"]; - push @vals, ["MyHTML_ENCODING_UTF_16LE", "0x04"]; - push @vals, ["MyHTML_ENCODING_UTF_16BE", "0x05"]; - push @vals, ["MyHTML_ENCODING_X_USER_DEFINED", "0x06"]; + push @vals, ["MyHTML_ENCODING_DEFAULT", "0x00", "utf_8"]; + push @vals, ["MyHTML_ENCODING_AUTO", "0x01", "NULL"]; + push @vals, ["MyHTML_ENCODING_NOT_DETERMINED", "0x02", "NULL"]; + push @vals, ["MyHTML_ENCODING_UTF_8", "0x00", "utf_8"]; + push @vals, ["MyHTML_ENCODING_UTF_16LE", "0x04", "utf_16le"]; + push @vals, ["MyHTML_ENCODING_UTF_16BE", "0x05", , "utf_16be"]; + push @vals, ["MyHTML_ENCODING_X_USER_DEFINED", "0x06", "x_user_defined"]; my $i = 7; foreach my $id (sort {$a cmp $b} keys %$index) { @@ -184,18 +184,27 @@ sub print_enum { next if $id =~ /UTF_16BE$/i; next if $id =~ /X_USER_DEFINED$/i; - push @vals, ["MyHTML_ENCODING_". uc($id), sprintf("0x%02x", $i)]; + push @vals, ["MyHTML_ENCODING_". uc($id), sprintf("0x%02x", $i), lc($id)]; $i++; } - push @vals, ["MyHTML_ENCODING_LAST_ENTRY", sprintf("0x%02x", $i)]; + push @vals, ["MyHTML_ENCODING_LAST_ENTRY", sprintf("0x%02x", $i), "NULL"]; print join(",\n\t", @{MyHTML::Base->format_list_text(\@vals, "= ")}), "\n"; print "}\ntypedef myhtml_encoding_t;\n\n"; - shift @vals; + print "static const myhtml_encoding_custom_f myhtml_encoding_function_index[] = \n{\n"; + foreach my $entry (@vals) { + if($entry->[2] eq "NULL") { + print "\t", $entry->[2], ",\n"; + } else { + print "\t", "myhtml_encoding_decode_", $entry->[2], ",\t// ", $entry->[0], "\n"; + } + } + + print "};\n"; print "static const myhtml_encoding_entry_name_index_t myhtml_encoding_entry_name_index_static_list_index[(MyHTML_ENCODING_LAST_ENTRY + 1)] =\n{\n"; diff --git a/utils/MyHTML/url_resources.pl b/utils/MyHTML/url_resources.pl index a52cdf0..2562fef 100644 --- a/utils/MyHTML/url_resources.pl +++ b/utils/MyHTML/url_resources.pl @@ -39,18 +39,78 @@ my $userinfo_encode = { "|" => '' }; -my $utils = MyHTML::Base->new(dirs => {source => "../../Modest/source/myhtml/url", template => "tmpl"}); +my $forbidden_host_code_point = { + "\x00" => '', + "\x09" => '', + "\x0A" => '', + "\x0D" => '', + "\x20" => '', + "#" => '', + "\%" => '', + "/" => '', + ":" => '', + "?" => '', + "\@" => '', + "[" => '', + "\\" => '', + "]" => '' +}; + +my $utils = MyHTML::Base->new(dirs => {source => "../../source/myhtml/url", template => "tmpl"}); my $utils_data = $utils->read_tmpl("url_resources.h"); $utils->save_src("resources.h", $utils_data, { BODY => - get_text_data(creare_for_default(), "myhtml_url_resources_static_map_default") . - get_text_data(creare_for_simple(), "myhtml_url_resources_static_map_simple") . + get_text_data(creare_for_query(), "myhtml_url_resources_static_map_query_charset") . + get_text_data(creare_for_forbidden_host_code_point(), "myhtml_url_resources_static_map_forbidden_host_code_point") . + "/* A C0 control is a code point in the range U+0000 to U+001F, inclusive. The C0 control percent-encode set are C0 controls and all code points greater than U+007E. */\n". + get_text_data(creare_for_simple(), "myhtml_url_resources_static_map_C0") . + '/* The path percent-encode set is the myhtml_url_resources_static_map_path and code points U+0020, \'"\', "#", "<", ">", "?", "`", "{", and "}". */'."\n". + get_text_data(creare_for_default(), "myhtml_url_resources_static_map_path") . + '/* The userinfo percent-encode set is the myhtml_url_resources_static_map_path and code points "/", ":", ";", "=", "@", "[", "\", "]", "^", and "|". */'."\n". get_text_data(creare_for_userinfo(), "myhtml_url_resources_static_map_userinfo") } ); +sub creare_for_query { + my @data; + + for my $codepoint (0..255) { + my $char = chr($codepoint); + + # less than 0x21, greater than 0x7E, or is 0x22, 0x23, 0x3C, or 0x3E + if ($codepoint < 33 || $codepoint > 126 || $codepoint == 0x22 || + $codepoint == 0x23 || $codepoint == 0x3C || $codepoint == 0x3E) + { + push @data, "0x00"; + } + else { + push @data, sprintf("0x%02x", $codepoint); + } + } + + return \@data; +} + +sub creare_for_forbidden_host_code_point { + my @data; + + for my $codepoint (0..255) { + my $char = chr($codepoint); + + if (exists $default_encode->{$char} || $char eq chr(0)) + { + push @data, sprintf("0x%02x", $codepoint); + } + else { + push @data, "0xff"; + } + } + + return \@data; +} + sub creare_for_default { my @data; -- cgit v1.2.3