jaclang 0.7.33__py3-none-any.whl → 0.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of jaclang might be problematic. Click here for more details.
- jaclang/__init__.py +7 -414
- jaclang/cli/cli.md +5 -5
- jaclang/cli/cli.py +311 -214
- jaclang/cli/cmdreg.py +188 -31
- jaclang/compiler/__init__.py +10 -15
- jaclang/compiler/{codeloc.py → codeinfo.py} +11 -30
- jaclang/compiler/constant.py +10 -33
- jaclang/compiler/jac.lark +61 -92
- jaclang/compiler/larkparse/jac_parser.py +3444 -0
- jaclang/compiler/parser.py +1054 -1341
- jaclang/compiler/passes/__init__.py +2 -2
- jaclang/compiler/passes/main/__init__.py +33 -14
- jaclang/compiler/passes/main/annex_pass.py +85 -0
- jaclang/compiler/passes/main/cfg_build_pass.py +275 -0
- jaclang/compiler/passes/main/def_impl_match_pass.py +146 -102
- jaclang/compiler/passes/main/def_use_pass.py +64 -269
- jaclang/compiler/passes/main/import_pass.py +175 -360
- jaclang/compiler/passes/main/inheritance_pass.py +107 -105
- jaclang/compiler/passes/main/pyast_gen_pass.py +1129 -1600
- jaclang/compiler/passes/main/pyast_load_pass.py +540 -584
- jaclang/compiler/passes/main/pybc_gen_pass.py +38 -35
- jaclang/compiler/passes/main/pyjac_ast_link_pass.py +46 -160
- jaclang/compiler/passes/main/sym_tab_build_pass.py +113 -1202
- jaclang/compiler/passes/main/sym_tab_link_pass.py +141 -0
- jaclang/{tests → compiler/passes/main/tests}/fixtures/access_modifier.jac +10 -9
- jaclang/compiler/passes/main/tests/fixtures/atest.impl.jac +3 -0
- jaclang/compiler/passes/main/tests/fixtures/atest.jac +11 -0
- jaclang/compiler/passes/main/tests/fixtures/autoimpl.impl/getme.impl.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/autoimpl.impl.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/autoimpl.jac +3 -3
- jaclang/compiler/passes/main/tests/fixtures/autoimpl.something.else.impl.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/base.impl.jac +8 -0
- jaclang/compiler/passes/main/tests/fixtures/base.jac +4 -4
- jaclang/compiler/passes/main/tests/fixtures/base2.impl.jac +8 -0
- jaclang/compiler/passes/main/tests/fixtures/base2.jac +4 -4
- jaclang/compiler/passes/main/tests/fixtures/blip.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/cfg_ability_test.jac +23 -0
- jaclang/compiler/passes/main/tests/fixtures/cfg_gen.jac +19 -0
- jaclang/compiler/passes/main/tests/fixtures/circular_import.jac +7 -0
- jaclang/compiler/passes/main/tests/fixtures/data_spatial_types.jac +12 -12
- jaclang/compiler/passes/main/tests/fixtures/decls.jac +4 -4
- jaclang/compiler/passes/main/tests/fixtures/defn_decl_mismatch.jac +4 -4
- jaclang/compiler/passes/main/tests/fixtures/defs_and_uses.jac +6 -6
- jaclang/compiler/passes/main/tests/fixtures/enumerations.jac +13 -0
- jaclang/compiler/passes/main/tests/fixtures/fstrings.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/func.jac +2 -2
- jaclang/compiler/passes/main/tests/fixtures/func2.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/game1.jac +4 -4
- jaclang/compiler/passes/main/tests/fixtures/impl/defs1.jac +2 -2
- jaclang/compiler/passes/main/tests/fixtures/impl/defs2.jac +2 -2
- jaclang/compiler/passes/main/tests/fixtures/impl/imps.jac +0 -8
- jaclang/compiler/passes/main/tests/fixtures/impl_grab.impl.jac +5 -0
- jaclang/{tests → compiler/passes/main/tests}/fixtures/impl_grab.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/incautoimpl.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/main_err.impl.jac +6 -0
- jaclang/compiler/passes/main/tests/fixtures/main_err.jac +6 -0
- jaclang/compiler/passes/main/tests/fixtures/mod_type_assign.jac +1 -1
- jaclang/compiler/passes/main/tests/fixtures/mtest.impl.jac +6 -0
- jaclang/{tests → compiler/passes/main/tests}/fixtures/mtest.jac +1 -1
- jaclang/{tests → compiler/passes/main/tests}/fixtures/nested_impls.jac +14 -15
- jaclang/compiler/passes/main/tests/fixtures/py_imp_test.jac +7 -7
- jaclang/compiler/passes/main/tests/fixtures/second_err.jac +4 -0
- jaclang/compiler/passes/main/tests/fixtures/str2doc.py +3 -0
- jaclang/compiler/passes/main/tests/fixtures/symtab_link_tests/action/__init__.py +5 -0
- jaclang/compiler/passes/main/tests/fixtures/symtab_link_tests/action/actions.jac +23 -0
- jaclang/compiler/passes/main/tests/fixtures/symtab_link_tests/main.jac +14 -0
- jaclang/compiler/passes/main/tests/fixtures/symtab_link_tests/no_dupls.jac +35 -0
- jaclang/compiler/passes/main/tests/fixtures/symtab_link_tests/one.jac +8 -0
- jaclang/compiler/passes/main/tests/fixtures/type_info.jac +4 -4
- jaclang/compiler/passes/main/tests/test_cfg_build_pass.py +99 -0
- jaclang/compiler/passes/main/tests/test_decl_impl_match_pass.py +157 -0
- jaclang/compiler/passes/main/tests/test_def_use_pass.py +4 -6
- jaclang/compiler/passes/main/tests/test_import_pass.py +59 -46
- jaclang/compiler/passes/main/tests/test_pyast_build_pass.py +15 -0
- jaclang/compiler/passes/main/tests/test_pyast_gen_pass.py +25 -34
- jaclang/compiler/passes/main/tests/test_pybc_gen_pass.py +3 -3
- jaclang/compiler/passes/main/tests/test_sub_node_pass.py +8 -7
- jaclang/compiler/passes/main/tests/test_sym_tab_build_pass.py +4 -4
- jaclang/compiler/passes/main/tests/test_sym_tab_link_pass.py +62 -0
- jaclang/compiler/passes/tool/__init__.py +2 -0
- jaclang/compiler/passes/tool/doc_ir.py +179 -0
- jaclang/compiler/passes/tool/doc_ir_gen_pass.py +1210 -0
- jaclang/compiler/passes/tool/fuse_comments_pass.py +90 -70
- jaclang/compiler/passes/tool/jac_formatter_pass.py +122 -2554
- jaclang/compiler/passes/tool/tests/fixtures/corelib.jac +249 -97
- jaclang/compiler/passes/tool/tests/fixtures/corelib_fmt.jac +94 -97
- jaclang/compiler/passes/tool/tests/fixtures/doc_string.jac +2 -2
- jaclang/compiler/passes/tool/tests/fixtures/general_format_checks/access_mod_check.jac +5 -5
- jaclang/compiler/passes/tool/tests/fixtures/general_format_checks/archetype_test.jac +13 -0
- jaclang/compiler/passes/tool/tests/fixtures/general_format_checks/decorator_stack.jac +7 -7
- jaclang/compiler/passes/tool/tests/fixtures/general_format_checks/line_spacing.jac +8 -8
- jaclang/compiler/passes/tool/tests/fixtures/multi_def_err.dot +3 -3
- jaclang/compiler/passes/tool/tests/fixtures/multi_def_err.txt +3 -3
- jaclang/compiler/passes/tool/tests/fixtures/myca_formatted_code/ability_impl_long_comprehension.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/myca_formatted_code/call_with_many_parameters.jac +2 -2
- jaclang/compiler/passes/tool/tests/fixtures/myca_formatted_code/simple_walker.jac +3 -3
- jaclang/compiler/passes/tool/tests/fixtures/myca_formatted_code/try_block_and_walker_spawn_and_fstrings.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/myca_formatted_code/type_annotation.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/simple_walk.jac +1 -1
- jaclang/compiler/passes/tool/tests/fixtures/simple_walk_fmt.jac +10 -4
- jaclang/compiler/passes/tool/tests/test_doc_ir_gen_pass.py +29 -0
- jaclang/compiler/passes/tool/tests/test_jac_format_pass.py +63 -88
- jaclang/compiler/passes/tool/tests/test_unparse_validate.py +27 -28
- jaclang/compiler/passes/transform.py +56 -16
- jaclang/compiler/passes/{ir_pass.py → uni_pass.py} +35 -52
- jaclang/compiler/program.py +205 -0
- jaclang/compiler/tests/fixtures/codegentext.jac +31 -0
- jaclang/compiler/tests/fixtures/fam.jac +10 -10
- jaclang/compiler/tests/fixtures/hello_world.jac +1 -1
- jaclang/compiler/tests/fixtures/staticcheck.jac +2 -2
- jaclang/compiler/tests/test_importer.py +21 -16
- jaclang/compiler/tests/test_parser.py +38 -17
- jaclang/compiler/{absyntree.py → unitree.py} +1120 -1012
- jaclang/langserve/engine.py +183 -171
- jaclang/langserve/sem_manager.py +26 -22
- jaclang/langserve/server.py +6 -15
- jaclang/langserve/tests/fixtures/base_module_structure.jac +7 -7
- jaclang/langserve/tests/fixtures/circle.jac +6 -6
- jaclang/langserve/tests/fixtures/circle_err.jac +6 -6
- jaclang/langserve/tests/fixtures/circle_pure.impl.jac +5 -5
- jaclang/langserve/tests/fixtures/circle_pure.jac +7 -7
- jaclang/langserve/tests/fixtures/circle_pure_err.impl.jac +2 -2
- jaclang/langserve/tests/fixtures/circle_pure_err.jac +7 -7
- jaclang/langserve/tests/fixtures/import_include_statements.jac +6 -6
- jaclang/langserve/tests/fixtures/rename.jac +6 -6
- jaclang/langserve/tests/server_test/test_lang_serve.py +262 -0
- jaclang/langserve/tests/server_test/utils.py +115 -0
- jaclang/langserve/tests/test_sem_tokens.py +2 -2
- jaclang/langserve/tests/test_server.py +41 -23
- jaclang/langserve/utils.jac +438 -0
- jaclang/runtimelib/{architype.py → archetype.py} +85 -61
- jaclang/runtimelib/builtin.py +92 -0
- jaclang/runtimelib/constructs.py +11 -13
- jaclang/runtimelib/importer.py +63 -51
- jaclang/runtimelib/machine.py +1551 -144
- jaclang/runtimelib/memory.py +6 -6
- jaclang/{plugin → runtimelib}/tests/fixtures/graph_purger.jac +1 -1
- jaclang/{plugin → runtimelib}/tests/fixtures/impl_match.jac +2 -2
- jaclang/runtimelib/tests/fixtures/impl_match_impl.jac +3 -0
- jaclang/{plugin → runtimelib}/tests/fixtures/other_root_access.jac +7 -7
- jaclang/{plugin → runtimelib}/tests/fixtures/savable_object.jac +3 -5
- jaclang/{plugin → runtimelib}/tests/fixtures/simple_node_connection.jac +6 -6
- jaclang/{plugin → runtimelib}/tests/fixtures/simple_persistent.jac +1 -1
- jaclang/runtimelib/tests/test_features.py +72 -0
- jaclang/{plugin → runtimelib}/tests/test_jaseci.py +6 -5
- jaclang/runtimelib/utils.py +31 -63
- jaclang/settings.py +1 -6
- jaclang/tests/fixtures/{abc.jac → abc_check.jac} +6 -6
- jaclang/tests/fixtures/arch_rel_import_creation.jac +4 -4
- jaclang/tests/fixtures/async_ability.jac +18 -0
- jaclang/tests/fixtures/async_walker.jac +23 -0
- jaclang/tests/fixtures/baddy.jac +1 -1
- jaclang/tests/fixtures/base_class1.jac +2 -2
- jaclang/tests/fixtures/base_class2.jac +2 -2
- jaclang/tests/fixtures/base_class_complex_expr.jac +3 -3
- jaclang/tests/fixtures/builtin_dotgen.jac +1 -1
- jaclang/tests/fixtures/builtin_dotgen_json.jac +21 -0
- jaclang/tests/fixtures/byllmissue.jac +1 -1
- jaclang/tests/fixtures/chandra_bugs.jac +1 -1
- jaclang/tests/fixtures/chandra_bugs2.jac +1 -1
- jaclang/tests/fixtures/cls_method.jac +6 -6
- jaclang/tests/fixtures/concurrency.jac +39 -0
- jaclang/tests/fixtures/connect_traverse_syntax.jac +18 -0
- jaclang/tests/fixtures/create_dynamic_archetype.jac +35 -0
- jaclang/tests/fixtures/decl_defn_param_name.jac +4 -4
- jaclang/tests/fixtures/deep/deeper/__init__.jac +1 -0
- jaclang/tests/fixtures/deep/deeper/deep_outer_import.jac +2 -3
- jaclang/tests/fixtures/deep/deeper/deep_outer_import2.jac +3 -3
- jaclang/tests/fixtures/deep/deeper/snd_lev.jac +2 -2
- jaclang/tests/fixtures/deep/mycode.jac +1 -1
- jaclang/tests/fixtures/deep/one_lev.jac +3 -4
- jaclang/tests/fixtures/deep/one_lev_dup.jac +2 -2
- jaclang/tests/fixtures/deep_convert.jac +1 -1
- jaclang/tests/fixtures/deep_import.jac +2 -2
- jaclang/tests/fixtures/deep_import_interp.jac +8 -0
- jaclang/tests/fixtures/deep_import_mods.jac +3 -3
- jaclang/tests/fixtures/deferred_field.jac +1 -1
- jaclang/tests/fixtures/del_clean.jac +7 -0
- jaclang/tests/fixtures/disconn.jac +3 -3
- jaclang/tests/fixtures/dynamic_archetype.jac +34 -0
- jaclang/tests/fixtures/edge_node_walk.jac +12 -12
- jaclang/tests/fixtures/edge_ops.jac +7 -7
- jaclang/tests/fixtures/edges_walk.jac +10 -10
- jaclang/tests/fixtures/edgetypeissue.jac +1 -1
- jaclang/tests/fixtures/enum_inside_archtype.jac +4 -4
- jaclang/tests/fixtures/err.impl.jac +1 -1
- jaclang/tests/fixtures/err.jac +2 -2
- jaclang/tests/fixtures/err_runtime.jac +2 -2
- jaclang/tests/fixtures/foo.jac +7 -7
- jaclang/tests/fixtures/game1.jac +4 -4
- jaclang/tests/fixtures/gendot_bubble_sort.jac +4 -4
- jaclang/tests/fixtures/glob_multivar_statement.jac +1 -1
- jaclang/tests/fixtures/guess_game.jac +5 -5
- jaclang/tests/fixtures/has_goodness.jac +1 -1
- jaclang/tests/fixtures/hash_init_check.jac +3 -3
- jaclang/tests/fixtures/hello.jac +1 -1
- jaclang/tests/fixtures/ignore.jac +3 -3
- jaclang/tests/fixtures/ignore_dup.jac +3 -3
- jaclang/tests/fixtures/impl_match_confused.impl.jac +1 -1
- jaclang/tests/fixtures/import.jac +9 -9
- jaclang/tests/fixtures/import_all.jac +1 -1
- jaclang/tests/fixtures/index_slice.jac +1 -1
- jaclang/tests/fixtures/inherit_check.jac +3 -3
- jaclang/tests/fixtures/jac_from_py.py +4 -0
- jaclang/tests/fixtures/jacsamp.jac +1 -1
- jaclang/tests/fixtures/jactest_main.jac +1 -1
- jaclang/tests/fixtures/jp_importer.jac +7 -8
- jaclang/tests/fixtures/jp_importer_auto.jac +3 -3
- jaclang/tests/fixtures/lambda.jac +2 -2
- jaclang/tests/fixtures/needs_import.jac +6 -6
- jaclang/tests/fixtures/needs_import_1.jac +1 -1
- jaclang/tests/fixtures/needs_import_2.jac +1 -1
- jaclang/tests/fixtures/needs_import_3.jac +1 -1
- jaclang/tests/fixtures/needs_import_dup.jac +6 -6
- jaclang/tests/fixtures/node_del.jac +60 -0
- jaclang/tests/fixtures/nosigself.jac +3 -3
- jaclang/tests/fixtures/py2jac.py +30 -0
- jaclang/tests/fixtures/py_bool_expr.py +7 -0
- jaclang/tests/fixtures/py_namedexpr.py +7 -0
- jaclang/tests/fixtures/pyfunc_3.py +0 -2
- jaclang/tests/fixtures/random_check.jac +5 -5
- jaclang/tests/fixtures/refs_target.jac +17 -0
- jaclang/tests/fixtures/simple_archs.jac +2 -2
- jaclang/tests/fixtures/simple_walk.jac +52 -0
- jaclang/tests/fixtures/slice_vals.jac +3 -3
- jaclang/tests/fixtures/sub_abil_sep.jac +3 -3
- jaclang/tests/fixtures/sub_abil_sep_multilev.jac +3 -3
- jaclang/tests/fixtures/trailing_comma.jac +4 -4
- jaclang/tests/fixtures/type_info.jac +5 -5
- jaclang/{compiler/passes/main/tests → tests}/fixtures/uninitialized_hasvars.jac +1 -1
- jaclang/tests/fixtures/visit_order.jac +4 -4
- jaclang/tests/fixtures/walker_override.jac +2 -2
- jaclang/tests/fixtures/walker_update.jac +5 -5
- jaclang/tests/fixtures/with_context.jac +4 -4
- jaclang/tests/test_bugs.py +2 -2
- jaclang/tests/test_cli.py +118 -223
- jaclang/tests/test_language.py +474 -468
- jaclang/tests/test_man_code.py +2 -2
- jaclang/tests/test_reference.py +4 -4
- jaclang/tests/test_settings.py +16 -16
- jaclang/tests/test_typecheck.py +555 -0
- jaclang/utils/__init__.py +4 -0
- jaclang/utils/helpers.py +12 -27
- jaclang/utils/lang_tools.py +84 -74
- jaclang/utils/module_resolver.py +69 -0
- jaclang/utils/test.py +8 -5
- jaclang/utils/tests/test_lang_tools.py +38 -13
- jaclang/utils/treeprinter.py +177 -40
- jaclang/vendor/__init__.py +1 -2
- jaclang/vendor/attr/__init__.py +14 -44
- jaclang/vendor/attr/__init__.pyi +155 -321
- jaclang/vendor/attr/_cmp.py +25 -15
- jaclang/vendor/attr/_cmp.pyi +7 -7
- jaclang/vendor/attr/_compat.py +15 -8
- jaclang/vendor/attr/_config.py +1 -1
- jaclang/vendor/attr/_funcs.py +148 -163
- jaclang/vendor/attr/_make.py +859 -855
- jaclang/vendor/attr/_next_gen.py +426 -32
- jaclang/vendor/attr/converters.py +67 -49
- jaclang/vendor/attr/converters.pyi +13 -7
- jaclang/vendor/attr/filters.py +17 -11
- jaclang/vendor/attr/filters.pyi +3 -3
- jaclang/vendor/attr/setters.py +11 -5
- jaclang/vendor/attr/setters.pyi +2 -1
- jaclang/vendor/attr/validators.py +191 -162
- jaclang/vendor/attr/validators.pyi +25 -27
- jaclang/vendor/attrs/__init__.py +9 -5
- jaclang/vendor/attrs/__init__.pyi +225 -29
- jaclang/vendor/attrs-25.3.0.dist-info/INSTALLER +1 -0
- jaclang/vendor/{attrs-23.2.0.dist-info → attrs-25.3.0.dist-info}/METADATA +83 -53
- jaclang/vendor/attrs-25.3.0.dist-info/RECORD +56 -0
- jaclang/vendor/{attrs-23.2.0.dist-info → attrs-25.3.0.dist-info}/WHEEL +1 -1
- jaclang/vendor/bin/dmypy +8 -0
- jaclang/vendor/bin/mypy +8 -0
- jaclang/vendor/bin/mypyc +8 -0
- jaclang/vendor/bin/stubgen +8 -0
- jaclang/vendor/bin/stubtest +8 -0
- jaclang/vendor/cattr/gen.py +2 -2
- jaclang/vendor/cattr/preconf/bson.py +1 -0
- jaclang/vendor/cattr/preconf/json.py +1 -0
- jaclang/vendor/cattr/preconf/msgpack.py +1 -0
- jaclang/vendor/cattr/preconf/orjson.py +1 -0
- jaclang/vendor/cattr/preconf/pyyaml.py +1 -0
- jaclang/vendor/cattr/preconf/tomlkit.py +1 -0
- jaclang/vendor/cattr/preconf/ujson.py +1 -0
- jaclang/vendor/cattrs/__init__.py +21 -21
- jaclang/vendor/cattrs/_compat.py +176 -62
- jaclang/vendor/cattrs/_generics.py +5 -3
- jaclang/vendor/cattrs/cols.py +289 -0
- jaclang/vendor/cattrs/converters.py +505 -187
- jaclang/vendor/cattrs/disambiguators.py +118 -45
- jaclang/vendor/cattrs/dispatch.py +66 -36
- jaclang/vendor/cattrs/fns.py +6 -1
- jaclang/vendor/cattrs/gen/__init__.py +365 -202
- jaclang/vendor/cattrs/gen/_generics.py +41 -5
- jaclang/vendor/cattrs/gen/_lc.py +3 -2
- jaclang/vendor/cattrs/gen/_shared.py +39 -32
- jaclang/vendor/cattrs/gen/typeddicts.py +75 -88
- jaclang/vendor/cattrs/preconf/__init__.py +20 -0
- jaclang/vendor/cattrs/preconf/bson.py +7 -8
- jaclang/vendor/cattrs/preconf/cbor2.py +3 -0
- jaclang/vendor/cattrs/preconf/json.py +8 -4
- jaclang/vendor/cattrs/preconf/msgpack.py +3 -0
- jaclang/vendor/cattrs/preconf/msgspec.py +185 -0
- jaclang/vendor/cattrs/preconf/orjson.py +20 -7
- jaclang/vendor/cattrs/preconf/pyyaml.py +15 -3
- jaclang/vendor/cattrs/preconf/tomlkit.py +3 -1
- jaclang/vendor/cattrs/preconf/ujson.py +3 -0
- jaclang/vendor/cattrs/strategies/__init__.py +1 -0
- jaclang/vendor/cattrs/strategies/_class_methods.py +1 -1
- jaclang/vendor/cattrs/strategies/_subclasses.py +43 -29
- jaclang/vendor/cattrs/strategies/_unions.py +47 -24
- jaclang/vendor/cattrs/v.py +1 -0
- jaclang/vendor/cattrs-24.1.3.dist-info/INSTALLER +1 -0
- jaclang/vendor/cattrs-24.1.3.dist-info/METADATA +161 -0
- jaclang/vendor/cattrs-24.1.3.dist-info/RECORD +96 -0
- jaclang/vendor/{cattrs-23.2.3.dist-info → cattrs-24.1.3.dist-info}/WHEEL +1 -1
- jaclang/vendor/lark/__init__.py +38 -38
- jaclang/vendor/lark/__pyinstaller/__init__.py +6 -6
- jaclang/vendor/lark/__pyinstaller/hook-lark.py +14 -14
- jaclang/vendor/lark/ast_utils.py +59 -59
- jaclang/vendor/lark/common.py +86 -89
- jaclang/vendor/lark/exceptions.py +292 -292
- jaclang/vendor/lark/grammar.py +130 -130
- jaclang/vendor/lark/grammars/common.lark +59 -59
- jaclang/vendor/lark/grammars/lark.lark +62 -62
- jaclang/vendor/lark/grammars/python.lark +302 -302
- jaclang/vendor/lark/grammars/unicode.lark +7 -7
- jaclang/vendor/lark/indenter.py +143 -112
- jaclang/vendor/lark/lark.py +658 -661
- jaclang/vendor/lark/lexer.py +678 -678
- jaclang/vendor/lark/load_grammar.py +1428 -1428
- jaclang/vendor/lark/parse_tree_builder.py +391 -391
- jaclang/vendor/lark/parser_frontends.py +257 -257
- jaclang/vendor/lark/parsers/cyk.py +340 -340
- jaclang/vendor/lark/parsers/earley.py +317 -308
- jaclang/vendor/lark/parsers/earley_common.py +42 -42
- jaclang/vendor/lark/parsers/earley_forest.py +802 -810
- jaclang/vendor/lark/parsers/grammar_analysis.py +203 -203
- jaclang/vendor/lark/parsers/lalr_analysis.py +332 -332
- jaclang/vendor/lark/parsers/lalr_interactive_parser.py +158 -157
- jaclang/vendor/lark/parsers/lalr_parser.py +122 -122
- jaclang/vendor/lark/parsers/lalr_parser_state.py +110 -110
- jaclang/vendor/lark/parsers/xearley.py +165 -165
- jaclang/vendor/lark/reconstruct.py +107 -107
- jaclang/vendor/lark/tools/__init__.py +70 -71
- jaclang/vendor/lark/tools/nearley.py +202 -202
- jaclang/vendor/lark/tools/serialize.py +32 -32
- jaclang/vendor/lark/tools/standalone.py +196 -196
- jaclang/vendor/lark/tree.py +267 -272
- jaclang/vendor/lark/tree_matcher.py +186 -186
- jaclang/vendor/lark/utils.py +346 -361
- jaclang/vendor/lark/visitors.py +596 -593
- jaclang/vendor/lark-1.2.2.dist-info/INSTALLER +1 -0
- jaclang/vendor/{lark-1.1.9.dist-info → lark-1.2.2.dist-info}/METADATA +48 -47
- jaclang/vendor/lark-1.2.2.dist-info/RECORD +83 -0
- jaclang/vendor/{mypy_extensions-1.0.0.dist-info → lark-1.2.2.dist-info}/WHEEL +1 -1
- jaclang/vendor/{lark-1.1.9.dist-info → lark-1.2.2.dist-info/licenses}/LICENSE +18 -18
- jaclang/vendor/lsprotocol-2023.0.1.dist-info/INSTALLER +1 -0
- jaclang/vendor/lsprotocol-2023.0.1.dist-info/METADATA +2 -1
- jaclang/vendor/lsprotocol-2023.0.1.dist-info/RECORD +17 -10
- jaclang/vendor/lsprotocol-2023.0.1.dist-info/WHEEL +1 -1
- jaclang/vendor/pluggy/_version.py +7 -2
- jaclang/vendor/pluggy-1.5.0.dist-info/INSTALLER +1 -0
- jaclang/vendor/pluggy-1.5.0.dist-info/METADATA +6 -5
- jaclang/vendor/pluggy-1.5.0.dist-info/RECORD +24 -14
- jaclang/vendor/pluggy-1.5.0.dist-info/WHEEL +1 -1
- jaclang/vendor/pygls-1.3.1.dist-info/INSTALLER +1 -0
- jaclang/vendor/pygls-1.3.1.dist-info/METADATA +2 -2
- jaclang/vendor/pygls-1.3.1.dist-info/RECORD +45 -24
- jaclang/vendor/pygls-1.3.1.dist-info/WHEEL +1 -1
- {jaclang-0.7.33.dist-info → jaclang-0.8.0.dist-info}/METADATA +4 -4
- jaclang-0.8.0.dist-info/RECORD +552 -0
- {jaclang-0.7.33.dist-info → jaclang-0.8.0.dist-info}/WHEEL +1 -1
- jaclang/compiler/.gitignore +0 -1
- jaclang/compiler/compile.py +0 -119
- jaclang/compiler/passes/main/access_modifier_pass.py +0 -130
- jaclang/compiler/passes/main/fuse_typeinfo_pass.py +0 -656
- jaclang/compiler/passes/main/py_collect_dep_pass.py +0 -78
- jaclang/compiler/passes/main/pyout_pass.py +0 -86
- jaclang/compiler/passes/main/registry_pass.py +0 -156
- jaclang/compiler/passes/main/schedules.py +0 -47
- jaclang/compiler/passes/main/sub_node_tab_pass.py +0 -36
- jaclang/compiler/passes/main/tests/fixtures/registry.jac +0 -36
- jaclang/compiler/passes/main/tests/test_decl_def_match_pass.py +0 -114
- jaclang/compiler/passes/main/tests/test_registry_pass.py +0 -31
- jaclang/compiler/passes/main/tests/test_type_check_pass.py +0 -91
- jaclang/compiler/passes/main/tests/test_typeinfo_pass.py +0 -29
- jaclang/compiler/passes/main/type_check_pass.py +0 -128
- jaclang/compiler/passes/tool/schedules.py +0 -18
- jaclang/compiler/passes/tool/tests/fixtures/genai/essay_review.jac +0 -36
- jaclang/compiler/passes/tool/tests/fixtures/genai/expert_answer.jac +0 -17
- jaclang/compiler/passes/tool/tests/fixtures/genai/joke_gen.jac +0 -32
- jaclang/compiler/passes/tool/tests/fixtures/genai/odd_word_out.jac +0 -27
- jaclang/compiler/passes/tool/tests/fixtures/genai/personality_finder.jac +0 -35
- jaclang/compiler/passes/tool/tests/fixtures/genai/text_to_type.jac +0 -25
- jaclang/compiler/passes/tool/tests/fixtures/genai/translator.jac +0 -13
- jaclang/compiler/passes/tool/tests/fixtures/genai/wikipedia.jac +0 -63
- jaclang/compiler/passes/tool/tests/fixtures/general_format_checks/architype_test.jac +0 -13
- jaclang/compiler/passes/utils/mypy_ast_build.py +0 -940
- jaclang/compiler/py_info.py +0 -22
- jaclang/compiler/semtable.py +0 -159
- jaclang/compiler/symtable.py +0 -297
- jaclang/langserve/utils.py +0 -458
- jaclang/plugin/__init__.py +0 -7
- jaclang/plugin/builtin.py +0 -57
- jaclang/plugin/default.py +0 -1443
- jaclang/plugin/feature.py +0 -574
- jaclang/plugin/plugin.md +0 -471
- jaclang/plugin/spec.py +0 -536
- jaclang/plugin/tests/fixtures/impl_match_impl.jac +0 -3
- jaclang/plugin/tests/test_features.py +0 -56
- jaclang/runtimelib/context.py +0 -191
- jaclang/tests/fixtures/create_dynamic_architype.jac +0 -35
- jaclang/tests/fixtures/dynamic_architype.jac +0 -34
- jaclang/tests/fixtures/impl_grab.impl.jac +0 -5
- jaclang/tests/fixtures/mtest.impl.jac +0 -6
- jaclang/tests/fixtures/registry.jac +0 -58
- jaclang/tests/fixtures/semstr.jac +0 -30
- jaclang/tests/main.jac +0 -2
- jaclang/utils/profiler.py +0 -62
- jaclang/vendor/attrs-23.2.0.dist-info/RECORD +0 -35
- jaclang/vendor/cattrs-23.2.3.dist-info/METADATA +0 -221
- jaclang/vendor/cattrs-23.2.3.dist-info/RECORD +0 -48
- jaclang/vendor/lark-1.1.9.dist-info/RECORD +0 -46
- jaclang/vendor/lark-1.1.9.dist-info/WHEEL +0 -5
- jaclang/vendor/mypy/__init__.py +0 -1
- jaclang/vendor/mypy/__main__.py +0 -37
- jaclang/vendor/mypy/api.py +0 -94
- jaclang/vendor/mypy/applytype.py +0 -172
- jaclang/vendor/mypy/argmap.py +0 -268
- jaclang/vendor/mypy/binder.py +0 -538
- jaclang/vendor/mypy/bogus_type.py +0 -27
- jaclang/vendor/mypy/build.py +0 -3562
- jaclang/vendor/mypy/checker.py +0 -8445
- jaclang/vendor/mypy/checkexpr.py +0 -6623
- jaclang/vendor/mypy/checkmember.py +0 -1363
- jaclang/vendor/mypy/checkpattern.py +0 -801
- jaclang/vendor/mypy/checkstrformat.py +0 -1109
- jaclang/vendor/mypy/config_parser.py +0 -670
- jaclang/vendor/mypy/constant_fold.py +0 -187
- jaclang/vendor/mypy/constraints.py +0 -1636
- jaclang/vendor/mypy/copytype.py +0 -133
- jaclang/vendor/mypy/defaults.py +0 -46
- jaclang/vendor/mypy/dmypy/__main__.py +0 -6
- jaclang/vendor/mypy/dmypy/client.py +0 -749
- jaclang/vendor/mypy/dmypy_os.py +0 -42
- jaclang/vendor/mypy/dmypy_server.py +0 -1107
- jaclang/vendor/mypy/dmypy_util.py +0 -117
- jaclang/vendor/mypy/erasetype.py +0 -278
- jaclang/vendor/mypy/errorcodes.py +0 -291
- jaclang/vendor/mypy/errors.py +0 -1280
- jaclang/vendor/mypy/evalexpr.py +0 -205
- jaclang/vendor/mypy/expandtype.py +0 -524
- jaclang/vendor/mypy/exprtotype.py +0 -209
- jaclang/vendor/mypy/fastparse.py +0 -2147
- jaclang/vendor/mypy/find_sources.py +0 -243
- jaclang/vendor/mypy/fixup.py +0 -428
- jaclang/vendor/mypy/freetree.py +0 -23
- jaclang/vendor/mypy/fscache.py +0 -309
- jaclang/vendor/mypy/fswatcher.py +0 -106
- jaclang/vendor/mypy/gclogger.py +0 -47
- jaclang/vendor/mypy/git.py +0 -34
- jaclang/vendor/mypy/graph_utils.py +0 -112
- jaclang/vendor/mypy/indirection.py +0 -121
- jaclang/vendor/mypy/infer.py +0 -75
- jaclang/vendor/mypy/inspections.py +0 -627
- jaclang/vendor/mypy/ipc.py +0 -310
- jaclang/vendor/mypy/join.py +0 -871
- jaclang/vendor/mypy/literals.py +0 -306
- jaclang/vendor/mypy/lookup.py +0 -61
- jaclang/vendor/mypy/main.py +0 -1574
- jaclang/vendor/mypy/maptype.py +0 -106
- jaclang/vendor/mypy/meet.py +0 -1140
- jaclang/vendor/mypy/memprofile.py +0 -121
- jaclang/vendor/mypy/message_registry.py +0 -329
- jaclang/vendor/mypy/messages.py +0 -3186
- jaclang/vendor/mypy/metastore.py +0 -225
- jaclang/vendor/mypy/mixedtraverser.py +0 -112
- jaclang/vendor/mypy/modulefinder.py +0 -875
- jaclang/vendor/mypy/moduleinspect.py +0 -184
- jaclang/vendor/mypy/mro.py +0 -62
- jaclang/vendor/mypy/nodes.py +0 -4115
- jaclang/vendor/mypy/operators.py +0 -126
- jaclang/vendor/mypy/options.py +0 -556
- jaclang/vendor/mypy/parse.py +0 -30
- jaclang/vendor/mypy/partially_defined.py +0 -675
- jaclang/vendor/mypy/patterns.py +0 -150
- jaclang/vendor/mypy/plugin.py +0 -901
- jaclang/vendor/mypy/plugins/attrs.py +0 -1166
- jaclang/vendor/mypy/plugins/common.py +0 -440
- jaclang/vendor/mypy/plugins/ctypes.py +0 -245
- jaclang/vendor/mypy/plugins/dataclasses.py +0 -1108
- jaclang/vendor/mypy/plugins/default.py +0 -531
- jaclang/vendor/mypy/plugins/enums.py +0 -259
- jaclang/vendor/mypy/plugins/functools.py +0 -104
- jaclang/vendor/mypy/plugins/proper_plugin.py +0 -175
- jaclang/vendor/mypy/plugins/singledispatch.py +0 -224
- jaclang/vendor/mypy/py.typed +0 -1
- jaclang/vendor/mypy/pyinfo.py +0 -78
- jaclang/vendor/mypy/reachability.py +0 -362
- jaclang/vendor/mypy/refinfo.py +0 -92
- jaclang/vendor/mypy/renaming.py +0 -568
- jaclang/vendor/mypy/report.py +0 -924
- jaclang/vendor/mypy/scope.py +0 -125
- jaclang/vendor/mypy/semanal.py +0 -7187
- jaclang/vendor/mypy/semanal_classprop.py +0 -187
- jaclang/vendor/mypy/semanal_enum.py +0 -253
- jaclang/vendor/mypy/semanal_infer.py +0 -128
- jaclang/vendor/mypy/semanal_main.py +0 -511
- jaclang/vendor/mypy/semanal_namedtuple.py +0 -670
- jaclang/vendor/mypy/semanal_newtype.py +0 -273
- jaclang/vendor/mypy/semanal_pass1.py +0 -156
- jaclang/vendor/mypy/semanal_shared.py +0 -490
- jaclang/vendor/mypy/semanal_typeargs.py +0 -265
- jaclang/vendor/mypy/semanal_typeddict.py +0 -575
- jaclang/vendor/mypy/server/astdiff.py +0 -518
- jaclang/vendor/mypy/server/astmerge.py +0 -562
- jaclang/vendor/mypy/server/aststrip.py +0 -281
- jaclang/vendor/mypy/server/deps.py +0 -1137
- jaclang/vendor/mypy/server/mergecheck.py +0 -83
- jaclang/vendor/mypy/server/objgraph.py +0 -101
- jaclang/vendor/mypy/server/subexpr.py +0 -198
- jaclang/vendor/mypy/server/target.py +0 -11
- jaclang/vendor/mypy/server/trigger.py +0 -26
- jaclang/vendor/mypy/server/update.py +0 -1339
- jaclang/vendor/mypy/sharedparse.py +0 -112
- jaclang/vendor/mypy/solve.py +0 -562
- jaclang/vendor/mypy/split_namespace.py +0 -35
- jaclang/vendor/mypy/state.py +0 -28
- jaclang/vendor/mypy/stats.py +0 -489
- jaclang/vendor/mypy/strconv.py +0 -641
- jaclang/vendor/mypy/stubdoc.py +0 -491
- jaclang/vendor/mypy/stubgen.py +0 -1886
- jaclang/vendor/mypy/stubgenc.py +0 -993
- jaclang/vendor/mypy/stubinfo.py +0 -173
- jaclang/vendor/mypy/stubtest.py +0 -2079
- jaclang/vendor/mypy/stubutil.py +0 -834
- jaclang/vendor/mypy/subtypes.py +0 -1980
- jaclang/vendor/mypy/suggestions.py +0 -1046
- jaclang/vendor/mypy/test/config.py +0 -28
- jaclang/vendor/mypy/test/data.py +0 -821
- jaclang/vendor/mypy/test/helpers.py +0 -476
- jaclang/vendor/mypy/test/meta/_pytest.py +0 -72
- jaclang/vendor/mypy/test/meta/test_diff_helper.py +0 -47
- jaclang/vendor/mypy/test/meta/test_parse_data.py +0 -73
- jaclang/vendor/mypy/test/meta/test_update_data.py +0 -135
- jaclang/vendor/mypy/test/test_find_sources.py +0 -376
- jaclang/vendor/mypy/test/test_ref_info.py +0 -45
- jaclang/vendor/mypy/test/testapi.py +0 -45
- jaclang/vendor/mypy/test/testargs.py +0 -77
- jaclang/vendor/mypy/test/testcheck.py +0 -322
- jaclang/vendor/mypy/test/testcmdline.py +0 -152
- jaclang/vendor/mypy/test/testconstraints.py +0 -134
- jaclang/vendor/mypy/test/testdaemon.py +0 -132
- jaclang/vendor/mypy/test/testdeps.py +0 -77
- jaclang/vendor/mypy/test/testdiff.py +0 -67
- jaclang/vendor/mypy/test/testerrorstream.py +0 -46
- jaclang/vendor/mypy/test/testfinegrained.py +0 -438
- jaclang/vendor/mypy/test/testfinegrainedcache.py +0 -18
- jaclang/vendor/mypy/test/testformatter.py +0 -85
- jaclang/vendor/mypy/test/testfscache.py +0 -101
- jaclang/vendor/mypy/test/testgraph.py +0 -83
- jaclang/vendor/mypy/test/testinfer.py +0 -373
- jaclang/vendor/mypy/test/testipc.py +0 -119
- jaclang/vendor/mypy/test/testmerge.py +0 -238
- jaclang/vendor/mypy/test/testmodulefinder.py +0 -278
- jaclang/vendor/mypy/test/testmypyc.py +0 -14
- jaclang/vendor/mypy/test/testparse.py +0 -107
- jaclang/vendor/mypy/test/testpep561.py +0 -211
- jaclang/vendor/mypy/test/testpythoneval.py +0 -117
- jaclang/vendor/mypy/test/testreports.py +0 -55
- jaclang/vendor/mypy/test/testsemanal.py +0 -209
- jaclang/vendor/mypy/test/testsolve.py +0 -285
- jaclang/vendor/mypy/test/teststubgen.py +0 -1412
- jaclang/vendor/mypy/test/teststubinfo.py +0 -12
- jaclang/vendor/mypy/test/teststubtest.py +0 -2492
- jaclang/vendor/mypy/test/testsubtypes.py +0 -303
- jaclang/vendor/mypy/test/testtransform.py +0 -64
- jaclang/vendor/mypy/test/testtypegen.py +0 -83
- jaclang/vendor/mypy/test/testtypes.py +0 -1551
- jaclang/vendor/mypy/test/testutil.py +0 -111
- jaclang/vendor/mypy/test/typefixture.py +0 -415
- jaclang/vendor/mypy/test/update_data.py +0 -87
- jaclang/vendor/mypy/test/visitors.py +0 -63
- jaclang/vendor/mypy/traverser.py +0 -961
- jaclang/vendor/mypy/treetransform.py +0 -800
- jaclang/vendor/mypy/tvar_scope.py +0 -169
- jaclang/vendor/mypy/type_visitor.py +0 -564
- jaclang/vendor/mypy/typeanal.py +0 -2596
- jaclang/vendor/mypy/typeops.py +0 -1082
- jaclang/vendor/mypy/types.py +0 -3708
- jaclang/vendor/mypy/types_utils.py +0 -166
- jaclang/vendor/mypy/typeshed/LICENSE +0 -237
- jaclang/vendor/mypy/typeshed/stdlib/VERSIONS +0 -309
- jaclang/vendor/mypy/typeshed/stdlib/__future__.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/__main__.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/_ast.pyi +0 -591
- jaclang/vendor/mypy/typeshed/stdlib/_bisect.pyi +0 -84
- jaclang/vendor/mypy/typeshed/stdlib/_bootlocale.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/_codecs.pyi +0 -133
- jaclang/vendor/mypy/typeshed/stdlib/_collections_abc.pyi +0 -94
- jaclang/vendor/mypy/typeshed/stdlib/_compat_pickle.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/_compression.pyi +0 -25
- jaclang/vendor/mypy/typeshed/stdlib/_csv.pyi +0 -90
- jaclang/vendor/mypy/typeshed/stdlib/_ctypes.pyi +0 -207
- jaclang/vendor/mypy/typeshed/stdlib/_curses.pyi +0 -566
- jaclang/vendor/mypy/typeshed/stdlib/_decimal.pyi +0 -281
- jaclang/vendor/mypy/typeshed/stdlib/_dummy_thread.pyi +0 -33
- jaclang/vendor/mypy/typeshed/stdlib/_dummy_threading.pyi +0 -164
- jaclang/vendor/mypy/typeshed/stdlib/_heapq.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/_imp.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/_json.pyi +0 -49
- jaclang/vendor/mypy/typeshed/stdlib/_locale.pyi +0 -100
- jaclang/vendor/mypy/typeshed/stdlib/_lsprof.pyi +0 -35
- jaclang/vendor/mypy/typeshed/stdlib/_markupbase.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/_msi.pyi +0 -92
- jaclang/vendor/mypy/typeshed/stdlib/_operator.pyi +0 -147
- jaclang/vendor/mypy/typeshed/stdlib/_osx_support.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/_posixsubprocess.pyi +0 -33
- jaclang/vendor/mypy/typeshed/stdlib/_py_abc.pyi +0 -14
- jaclang/vendor/mypy/typeshed/stdlib/_pydecimal.pyi +0 -43
- jaclang/vendor/mypy/typeshed/stdlib/_random.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/_sitebuiltins.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/_socket.pyi +0 -803
- jaclang/vendor/mypy/typeshed/stdlib/_stat.pyi +0 -103
- jaclang/vendor/mypy/typeshed/stdlib/_thread.pyi +0 -59
- jaclang/vendor/mypy/typeshed/stdlib/_threading_local.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/_tkinter.pyi +0 -121
- jaclang/vendor/mypy/typeshed/stdlib/_tracemalloc.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/_typeshed/__init__.pyi +0 -347
- jaclang/vendor/mypy/typeshed/stdlib/_typeshed/dbapi.pyi +0 -37
- jaclang/vendor/mypy/typeshed/stdlib/_typeshed/wsgi.pyi +0 -44
- jaclang/vendor/mypy/typeshed/stdlib/_typeshed/xml.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/_warnings.pyi +0 -55
- jaclang/vendor/mypy/typeshed/stdlib/_weakref.pyi +0 -41
- jaclang/vendor/mypy/typeshed/stdlib/_weakrefset.pyi +0 -51
- jaclang/vendor/mypy/typeshed/stdlib/_winapi.pyi +0 -255
- jaclang/vendor/mypy/typeshed/stdlib/abc.pyi +0 -51
- jaclang/vendor/mypy/typeshed/stdlib/aifc.pyi +0 -91
- jaclang/vendor/mypy/typeshed/stdlib/antigravity.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/argparse.pyi +0 -595
- jaclang/vendor/mypy/typeshed/stdlib/array.pyi +0 -92
- jaclang/vendor/mypy/typeshed/stdlib/ast.pyi +0 -277
- jaclang/vendor/mypy/typeshed/stdlib/asynchat.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/__init__.pyi +0 -41
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/base_events.pyi +0 -440
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/base_futures.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +0 -63
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/base_tasks.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/constants.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/coroutines.pyi +0 -26
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/events.pyi +0 -580
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/exceptions.pyi +0 -43
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/format_helpers.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/futures.pyi +0 -57
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/locks.pyi +0 -121
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/log.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/mixins.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/proactor_events.pyi +0 -64
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/protocols.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/queues.pyi +0 -47
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/runners.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/selector_events.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/sslproto.pyi +0 -165
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/staggered.pyi +0 -10
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/streams.pyi +0 -153
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/subprocess.pyi +0 -229
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/taskgroups.pyi +0 -25
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/tasks.pyi +0 -497
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/threads.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/timeouts.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/transports.pyi +0 -47
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/trsock.pyi +0 -94
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/unix_events.pyi +0 -196
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/windows_events.pyi +0 -85
- jaclang/vendor/mypy/typeshed/stdlib/asyncio/windows_utils.pyi +0 -49
- jaclang/vendor/mypy/typeshed/stdlib/asyncore.pyi +0 -90
- jaclang/vendor/mypy/typeshed/stdlib/atexit.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/audioop.pyi +0 -43
- jaclang/vendor/mypy/typeshed/stdlib/base64.pyi +0 -59
- jaclang/vendor/mypy/typeshed/stdlib/bdb.pyi +0 -102
- jaclang/vendor/mypy/typeshed/stdlib/binascii.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/binhex.pyi +0 -45
- jaclang/vendor/mypy/typeshed/stdlib/bisect.pyi +0 -4
- jaclang/vendor/mypy/typeshed/stdlib/builtins.pyi +0 -1936
- jaclang/vendor/mypy/typeshed/stdlib/bz2.pyi +0 -146
- jaclang/vendor/mypy/typeshed/stdlib/cProfile.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/calendar.pyi +0 -208
- jaclang/vendor/mypy/typeshed/stdlib/cgi.pyi +0 -118
- jaclang/vendor/mypy/typeshed/stdlib/cgitb.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/chunk.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/cmath.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/cmd.pyi +0 -45
- jaclang/vendor/mypy/typeshed/stdlib/code.pyi +0 -33
- jaclang/vendor/mypy/typeshed/stdlib/codecs.pyi +0 -285
- jaclang/vendor/mypy/typeshed/stdlib/codeop.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/collections/__init__.pyi +0 -485
- jaclang/vendor/mypy/typeshed/stdlib/collections/abc.pyi +0 -2
- jaclang/vendor/mypy/typeshed/stdlib/colorsys.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/compileall.pyi +0 -111
- jaclang/vendor/mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/concurrent/futures/_base.pyi +0 -126
- jaclang/vendor/mypy/typeshed/stdlib/concurrent/futures/process.pyi +0 -233
- jaclang/vendor/mypy/typeshed/stdlib/concurrent/futures/thread.pyi +0 -80
- jaclang/vendor/mypy/typeshed/stdlib/configparser.pyi +0 -313
- jaclang/vendor/mypy/typeshed/stdlib/contextlib.pyi +0 -208
- jaclang/vendor/mypy/typeshed/stdlib/contextvars.pyi +0 -63
- jaclang/vendor/mypy/typeshed/stdlib/copy.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/copyreg.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/crypt.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/csv.pyi +0 -147
- jaclang/vendor/mypy/typeshed/stdlib/ctypes/__init__.pyi +0 -187
- jaclang/vendor/mypy/typeshed/stdlib/ctypes/_endian.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/ctypes/util.pyi +0 -6
- jaclang/vendor/mypy/typeshed/stdlib/ctypes/wintypes.pyi +0 -298
- jaclang/vendor/mypy/typeshed/stdlib/curses/__init__.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/curses/ascii.pyi +0 -62
- jaclang/vendor/mypy/typeshed/stdlib/curses/has_key.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/curses/panel.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/curses/textpad.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/dataclasses.pyi +0 -315
- jaclang/vendor/mypy/typeshed/stdlib/datetime.pyi +0 -295
- jaclang/vendor/mypy/typeshed/stdlib/dbm/__init__.pyi +0 -95
- jaclang/vendor/mypy/typeshed/stdlib/dbm/dumb.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/dbm/gnu.pyi +0 -41
- jaclang/vendor/mypy/typeshed/stdlib/dbm/ndbm.pyi +0 -37
- jaclang/vendor/mypy/typeshed/stdlib/decimal.pyi +0 -2
- jaclang/vendor/mypy/typeshed/stdlib/difflib.pyi +0 -140
- jaclang/vendor/mypy/typeshed/stdlib/dis.pyi +0 -144
- jaclang/vendor/mypy/typeshed/stdlib/distutils/__init__.pyi +0 -5
- jaclang/vendor/mypy/typeshed/stdlib/distutils/archive_util.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/distutils/ccompiler.pyi +0 -152
- jaclang/vendor/mypy/typeshed/stdlib/distutils/cmd.pyi +0 -66
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/bdist.pyi +0 -25
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +0 -45
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +0 -52
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/build.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/build_clib.pyi +0 -27
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/build_ext.pyi +0 -50
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/build_py.pyi +0 -44
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +0 -24
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/check.pyi +0 -39
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/clean.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/config.pyi +0 -83
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/install.pyi +0 -63
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/install_data.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +0 -18
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/install_headers.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/install_lib.pyi +0 -25
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +0 -18
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/register.pyi +0 -18
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/sdist.pyi +0 -42
- jaclang/vendor/mypy/typeshed/stdlib/distutils/command/upload.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/distutils/config.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/distutils/core.pyi +0 -57
- jaclang/vendor/mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/distutils/debug.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/distutils/dep_util.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/distutils/dir_util.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/distutils/dist.pyi +0 -146
- jaclang/vendor/mypy/typeshed/stdlib/distutils/errors.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/distutils/extension.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/distutils/file_util.pyi +0 -14
- jaclang/vendor/mypy/typeshed/stdlib/distutils/filelist.pyi +0 -50
- jaclang/vendor/mypy/typeshed/stdlib/distutils/log.pyi +0 -25
- jaclang/vendor/mypy/typeshed/stdlib/distutils/msvccompiler.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/distutils/spawn.pyi +0 -2
- jaclang/vendor/mypy/typeshed/stdlib/distutils/sysconfig.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/distutils/text_file.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/distutils/unixccompiler.pyi +0 -3
- jaclang/vendor/mypy/typeshed/stdlib/distutils/util.pyi +0 -46
- jaclang/vendor/mypy/typeshed/stdlib/distutils/version.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/doctest.pyi +0 -248
- jaclang/vendor/mypy/typeshed/stdlib/dummy_threading.pyi +0 -2
- jaclang/vendor/mypy/typeshed/stdlib/email/__init__.pyi +0 -29
- jaclang/vendor/mypy/typeshed/stdlib/email/_header_value_parser.pyi +0 -392
- jaclang/vendor/mypy/typeshed/stdlib/email/_policybase.pyi +0 -51
- jaclang/vendor/mypy/typeshed/stdlib/email/base64mime.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/email/charset.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/email/contentmanager.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/email/encoders.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/email/errors.pyi +0 -39
- jaclang/vendor/mypy/typeshed/stdlib/email/feedparser.pyi +0 -23
- jaclang/vendor/mypy/typeshed/stdlib/email/generator.pyi +0 -40
- jaclang/vendor/mypy/typeshed/stdlib/email/header.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/email/headerregistry.pyi +0 -178
- jaclang/vendor/mypy/typeshed/stdlib/email/iterators.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/email/message.pyi +0 -165
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/application.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/audio.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/base.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/image.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/message.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/multipart.pyi +0 -18
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +0 -5
- jaclang/vendor/mypy/typeshed/stdlib/email/mime/text.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/email/parser.pyi +0 -26
- jaclang/vendor/mypy/typeshed/stdlib/email/policy.pyi +0 -38
- jaclang/vendor/mypy/typeshed/stdlib/email/quoprimime.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/email/utils.pyi +0 -70
- jaclang/vendor/mypy/typeshed/stdlib/encodings/__init__.pyi +0 -10
- jaclang/vendor/mypy/typeshed/stdlib/encodings/utf_8.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/ensurepip/__init__.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/enum.pyi +0 -320
- jaclang/vendor/mypy/typeshed/stdlib/errno.pyi +0 -222
- jaclang/vendor/mypy/typeshed/stdlib/faulthandler.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/fcntl.pyi +0 -127
- jaclang/vendor/mypy/typeshed/stdlib/filecmp.pyi +0 -57
- jaclang/vendor/mypy/typeshed/stdlib/fileinput.pyi +0 -213
- jaclang/vendor/mypy/typeshed/stdlib/fnmatch.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/formatter.pyi +0 -88
- jaclang/vendor/mypy/typeshed/stdlib/fractions.pyi +0 -150
- jaclang/vendor/mypy/typeshed/stdlib/ftplib.pyi +0 -178
- jaclang/vendor/mypy/typeshed/stdlib/functools.pyi +0 -213
- jaclang/vendor/mypy/typeshed/stdlib/gc.pyi +0 -37
- jaclang/vendor/mypy/typeshed/stdlib/genericpath.pyi +0 -52
- jaclang/vendor/mypy/typeshed/stdlib/getopt.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/getpass.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/gettext.pyi +0 -169
- jaclang/vendor/mypy/typeshed/stdlib/glob.pyi +0 -42
- jaclang/vendor/mypy/typeshed/stdlib/graphlib.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/grp.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/gzip.pyi +0 -160
- jaclang/vendor/mypy/typeshed/stdlib/hashlib.pyi +0 -167
- jaclang/vendor/mypy/typeshed/stdlib/heapq.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/hmac.pyi +0 -38
- jaclang/vendor/mypy/typeshed/stdlib/html/__init__.pyi +0 -6
- jaclang/vendor/mypy/typeshed/stdlib/html/entities.pyi +0 -6
- jaclang/vendor/mypy/typeshed/stdlib/html/parser.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/http/__init__.pyi +0 -105
- jaclang/vendor/mypy/typeshed/stdlib/http/client.pyi +0 -259
- jaclang/vendor/mypy/typeshed/stdlib/http/cookiejar.pyi +0 -159
- jaclang/vendor/mypy/typeshed/stdlib/http/cookies.pyi +0 -60
- jaclang/vendor/mypy/typeshed/stdlib/http/server.pyi +0 -83
- jaclang/vendor/mypy/typeshed/stdlib/imaplib.pyi +0 -168
- jaclang/vendor/mypy/typeshed/stdlib/imghdr.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/imp.pyi +0 -62
- jaclang/vendor/mypy/typeshed/stdlib/importlib/__init__.pyi +0 -24
- jaclang/vendor/mypy/typeshed/stdlib/importlib/_abc.pyi +0 -15
- jaclang/vendor/mypy/typeshed/stdlib/importlib/abc.pyi +0 -172
- jaclang/vendor/mypy/typeshed/stdlib/importlib/machinery.pyi +0 -179
- jaclang/vendor/mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +0 -285
- jaclang/vendor/mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +0 -49
- jaclang/vendor/mypy/typeshed/stdlib/importlib/readers.pyi +0 -68
- jaclang/vendor/mypy/typeshed/stdlib/importlib/resources/__init__.pyi +0 -46
- jaclang/vendor/mypy/typeshed/stdlib/importlib/resources/abc.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/importlib/resources/readers.pyi +0 -14
- jaclang/vendor/mypy/typeshed/stdlib/importlib/resources/simple.pyi +0 -56
- jaclang/vendor/mypy/typeshed/stdlib/importlib/simple.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/importlib/util.pyi +0 -43
- jaclang/vendor/mypy/typeshed/stdlib/inspect.pyi +0 -632
- jaclang/vendor/mypy/typeshed/stdlib/io.pyi +0 -238
- jaclang/vendor/mypy/typeshed/stdlib/ipaddress.pyi +0 -208
- jaclang/vendor/mypy/typeshed/stdlib/itertools.pyi +0 -273
- jaclang/vendor/mypy/typeshed/stdlib/json/__init__.pyi +0 -61
- jaclang/vendor/mypy/typeshed/stdlib/json/decoder.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/json/encoder.pyi +0 -40
- jaclang/vendor/mypy/typeshed/stdlib/json/tool.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/keyword.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +0 -42
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +0 -10
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +0 -14
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +0 -15
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +0 -6
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +0 -7
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +0 -7
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +0 -10
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +0 -7
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +0 -17
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +0 -15
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +0 -12
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/main.pyi +0 -42
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +0 -27
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +0 -24
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +0 -7
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +0 -30
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +0 -50
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +0 -67
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +0 -96
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pygram.pyi +0 -114
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/pytree.pyi +0 -117
- jaclang/vendor/mypy/typeshed/stdlib/lib2to3/refactor.pyi +0 -82
- jaclang/vendor/mypy/typeshed/stdlib/linecache.pyi +0 -23
- jaclang/vendor/mypy/typeshed/stdlib/locale.pyi +0 -152
- jaclang/vendor/mypy/typeshed/stdlib/logging/__init__.pyi +0 -658
- jaclang/vendor/mypy/typeshed/stdlib/logging/config.pyi +0 -134
- jaclang/vendor/mypy/typeshed/stdlib/logging/handlers.pyi +0 -275
- jaclang/vendor/mypy/typeshed/stdlib/lzma.pyi +0 -197
- jaclang/vendor/mypy/typeshed/stdlib/mailbox.pyi +0 -256
- jaclang/vendor/mypy/typeshed/stdlib/mailcap.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/marshal.pyi +0 -33
- jaclang/vendor/mypy/typeshed/stdlib/math.pyi +0 -125
- jaclang/vendor/mypy/typeshed/stdlib/mimetypes.pyi +0 -46
- jaclang/vendor/mypy/typeshed/stdlib/mmap.pyi +0 -113
- jaclang/vendor/mypy/typeshed/stdlib/modulefinder.pyi +0 -66
- jaclang/vendor/mypy/typeshed/stdlib/msilib/__init__.pyi +0 -177
- jaclang/vendor/mypy/typeshed/stdlib/msilib/schema.pyi +0 -94
- jaclang/vendor/mypy/typeshed/stdlib/msilib/sequence.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/msilib/text.pyi +0 -7
- jaclang/vendor/mypy/typeshed/stdlib/msvcrt.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/__init__.pyi +0 -90
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/connection.pyi +0 -75
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/context.pyi +0 -189
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +0 -77
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +0 -39
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/heap.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/managers.pyi +0 -212
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/pool.pyi +0 -103
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +0 -23
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +0 -30
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/process.pyi +0 -39
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/queues.pyi +0 -41
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/reduction.pyi +0 -90
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +0 -18
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +0 -40
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +0 -107
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/spawn.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +0 -54
- jaclang/vendor/mypy/typeshed/stdlib/multiprocessing/util.pyi +0 -98
- jaclang/vendor/mypy/typeshed/stdlib/netrc.pyi +0 -23
- jaclang/vendor/mypy/typeshed/stdlib/nis.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/nntplib.pyi +0 -125
- jaclang/vendor/mypy/typeshed/stdlib/nt.pyi +0 -111
- jaclang/vendor/mypy/typeshed/stdlib/ntpath.pyi +0 -119
- jaclang/vendor/mypy/typeshed/stdlib/nturl2path.pyi +0 -2
- jaclang/vendor/mypy/typeshed/stdlib/numbers.pyi +0 -209
- jaclang/vendor/mypy/typeshed/stdlib/opcode.pyi +0 -59
- jaclang/vendor/mypy/typeshed/stdlib/operator.pyi +0 -110
- jaclang/vendor/mypy/typeshed/stdlib/optparse.pyi +0 -255
- jaclang/vendor/mypy/typeshed/stdlib/os/__init__.pyi +0 -1157
- jaclang/vendor/mypy/typeshed/stdlib/os/path.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/ossaudiodev.pyi +0 -131
- jaclang/vendor/mypy/typeshed/stdlib/parser.pyi +0 -24
- jaclang/vendor/mypy/typeshed/stdlib/pathlib.pyi +0 -232
- jaclang/vendor/mypy/typeshed/stdlib/pdb.pyi +0 -181
- jaclang/vendor/mypy/typeshed/stdlib/pickle.pyi +0 -271
- jaclang/vendor/mypy/typeshed/stdlib/pickletools.pyi +0 -167
- jaclang/vendor/mypy/typeshed/stdlib/pipes.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/pkgutil.pyi +0 -53
- jaclang/vendor/mypy/typeshed/stdlib/platform.pyi +0 -42
- jaclang/vendor/mypy/typeshed/stdlib/plistlib.pyi +0 -113
- jaclang/vendor/mypy/typeshed/stdlib/poplib.pyi +0 -71
- jaclang/vendor/mypy/typeshed/stdlib/posix.pyi +0 -361
- jaclang/vendor/mypy/typeshed/stdlib/posixpath.pyi +0 -161
- jaclang/vendor/mypy/typeshed/stdlib/pprint.pyi +0 -112
- jaclang/vendor/mypy/typeshed/stdlib/profile.pyi +0 -31
- jaclang/vendor/mypy/typeshed/stdlib/pstats.pyi +0 -80
- jaclang/vendor/mypy/typeshed/stdlib/pty.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/pwd.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/py_compile.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/pyclbr.pyi +0 -74
- jaclang/vendor/mypy/typeshed/stdlib/pydoc.pyi +0 -261
- jaclang/vendor/mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
- jaclang/vendor/mypy/typeshed/stdlib/pydoc_data/topics.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/pyexpat/__init__.pyi +0 -85
- jaclang/vendor/mypy/typeshed/stdlib/pyexpat/errors.pyi +0 -49
- jaclang/vendor/mypy/typeshed/stdlib/pyexpat/model.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/queue.pyi +0 -66
- jaclang/vendor/mypy/typeshed/stdlib/quopri.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/random.pyi +0 -138
- jaclang/vendor/mypy/typeshed/stdlib/re.pyi +0 -290
- jaclang/vendor/mypy/typeshed/stdlib/readline.pyi +0 -36
- jaclang/vendor/mypy/typeshed/stdlib/reprlib.pyi +0 -65
- jaclang/vendor/mypy/typeshed/stdlib/resource.pyi +0 -94
- jaclang/vendor/mypy/typeshed/stdlib/rlcompleter.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/runpy.pyi +0 -24
- jaclang/vendor/mypy/typeshed/stdlib/sched.pyi +0 -42
- jaclang/vendor/mypy/typeshed/stdlib/secrets.pyi +0 -15
- jaclang/vendor/mypy/typeshed/stdlib/select.pyi +0 -155
- jaclang/vendor/mypy/typeshed/stdlib/selectors.pyi +0 -67
- jaclang/vendor/mypy/typeshed/stdlib/shelve.pyi +0 -46
- jaclang/vendor/mypy/typeshed/stdlib/shlex.pyi +0 -63
- jaclang/vendor/mypy/typeshed/stdlib/shutil.pyi +0 -185
- jaclang/vendor/mypy/typeshed/stdlib/signal.pyi +0 -188
- jaclang/vendor/mypy/typeshed/stdlib/site.pyi +0 -27
- jaclang/vendor/mypy/typeshed/stdlib/smtpd.pyi +0 -91
- jaclang/vendor/mypy/typeshed/stdlib/smtplib.pyi +0 -204
- jaclang/vendor/mypy/typeshed/stdlib/sndhdr.pyi +0 -14
- jaclang/vendor/mypy/typeshed/stdlib/socket.pyi +0 -825
- jaclang/vendor/mypy/typeshed/stdlib/socketserver.pyi +0 -168
- jaclang/vendor/mypy/typeshed/stdlib/spwd.pyi +0 -41
- jaclang/vendor/mypy/typeshed/stdlib/sqlite3/__init__.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +0 -551
- jaclang/vendor/mypy/typeshed/stdlib/sre_compile.pyi +0 -11
- jaclang/vendor/mypy/typeshed/stdlib/sre_constants.pyi +0 -130
- jaclang/vendor/mypy/typeshed/stdlib/sre_parse.pyi +0 -104
- jaclang/vendor/mypy/typeshed/stdlib/ssl.pyi +0 -537
- jaclang/vendor/mypy/typeshed/stdlib/stat.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/statistics.pyi +0 -132
- jaclang/vendor/mypy/typeshed/stdlib/string.pyi +0 -83
- jaclang/vendor/mypy/typeshed/stdlib/stringprep.pyi +0 -27
- jaclang/vendor/mypy/typeshed/stdlib/struct.pyi +0 -26
- jaclang/vendor/mypy/typeshed/stdlib/subprocess.pyi +0 -2615
- jaclang/vendor/mypy/typeshed/stdlib/sunau.pyi +0 -86
- jaclang/vendor/mypy/typeshed/stdlib/symbol.pyi +0 -93
- jaclang/vendor/mypy/typeshed/stdlib/symtable.pyi +0 -58
- jaclang/vendor/mypy/typeshed/stdlib/sys/__init__.pyi +0 -373
- jaclang/vendor/mypy/typeshed/stdlib/sys/_monitoring.pyi +0 -52
- jaclang/vendor/mypy/typeshed/stdlib/sysconfig.pyi +0 -48
- jaclang/vendor/mypy/typeshed/stdlib/syslog.pyi +0 -46
- jaclang/vendor/mypy/typeshed/stdlib/tabnanny.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/tarfile.pyi +0 -441
- jaclang/vendor/mypy/typeshed/stdlib/telnetlib.pyi +0 -122
- jaclang/vendor/mypy/typeshed/stdlib/tempfile.pyi +0 -477
- jaclang/vendor/mypy/typeshed/stdlib/termios.pyi +0 -267
- jaclang/vendor/mypy/typeshed/stdlib/textwrap.pyi +0 -103
- jaclang/vendor/mypy/typeshed/stdlib/this.pyi +0 -2
- jaclang/vendor/mypy/typeshed/stdlib/threading.pyi +0 -187
- jaclang/vendor/mypy/typeshed/stdlib/time.pyi +0 -108
- jaclang/vendor/mypy/typeshed/stdlib/timeit.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/__init__.pyi +0 -3654
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/colorchooser.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/commondialog.pyi +0 -14
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/constants.pyi +0 -80
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/dialog.pyi +0 -16
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/dnd.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/filedialog.pyi +0 -151
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/font.pyi +0 -116
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/messagebox.pyi +0 -44
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +0 -9
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/simpledialog.pyi +0 -54
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/tix.pyi +0 -299
- jaclang/vendor/mypy/typeshed/stdlib/tkinter/ttk.pyi +0 -1204
- jaclang/vendor/mypy/typeshed/stdlib/token.pyi +0 -159
- jaclang/vendor/mypy/typeshed/stdlib/tokenize.pyi +0 -177
- jaclang/vendor/mypy/typeshed/stdlib/tomllib.pyi +0 -10
- jaclang/vendor/mypy/typeshed/stdlib/trace.pyi +0 -79
- jaclang/vendor/mypy/typeshed/stdlib/traceback.pyi +0 -262
- jaclang/vendor/mypy/typeshed/stdlib/tracemalloc.pyi +0 -124
- jaclang/vendor/mypy/typeshed/stdlib/tty.pyi +0 -30
- jaclang/vendor/mypy/typeshed/stdlib/turtle.pyi +0 -713
- jaclang/vendor/mypy/typeshed/stdlib/types.pyi +0 -614
- jaclang/vendor/mypy/typeshed/stdlib/typing.pyi +0 -976
- jaclang/vendor/mypy/typeshed/stdlib/typing_extensions.pyi +0 -509
- jaclang/vendor/mypy/typeshed/stdlib/unicodedata.pyi +0 -73
- jaclang/vendor/mypy/typeshed/stdlib/unittest/__init__.pyi +0 -67
- jaclang/vendor/mypy/typeshed/stdlib/unittest/_log.pyi +0 -27
- jaclang/vendor/mypy/typeshed/stdlib/unittest/async_case.pyi +0 -21
- jaclang/vendor/mypy/typeshed/stdlib/unittest/case.pyi +0 -342
- jaclang/vendor/mypy/typeshed/stdlib/unittest/loader.pyi +0 -51
- jaclang/vendor/mypy/typeshed/stdlib/unittest/main.pyi +0 -69
- jaclang/vendor/mypy/typeshed/stdlib/unittest/mock.pyi +0 -430
- jaclang/vendor/mypy/typeshed/stdlib/unittest/result.pyi +0 -47
- jaclang/vendor/mypy/typeshed/stdlib/unittest/runner.pyi +0 -72
- jaclang/vendor/mypy/typeshed/stdlib/unittest/signals.pyi +0 -15
- jaclang/vendor/mypy/typeshed/stdlib/unittest/suite.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/unittest/util.pyi +0 -23
- jaclang/vendor/mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
- jaclang/vendor/mypy/typeshed/stdlib/urllib/error.pyi +0 -23
- jaclang/vendor/mypy/typeshed/stdlib/urllib/parse.pyi +0 -210
- jaclang/vendor/mypy/typeshed/stdlib/urllib/request.pyi +0 -400
- jaclang/vendor/mypy/typeshed/stdlib/urllib/response.pyi +0 -43
- jaclang/vendor/mypy/typeshed/stdlib/urllib/robotparser.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/uu.pyi +0 -13
- jaclang/vendor/mypy/typeshed/stdlib/uuid.pyi +0 -100
- jaclang/vendor/mypy/typeshed/stdlib/warnings.pyi +0 -112
- jaclang/vendor/mypy/typeshed/stdlib/wave.pyi +0 -85
- jaclang/vendor/mypy/typeshed/stdlib/weakref.pyi +0 -149
- jaclang/vendor/mypy/typeshed/stdlib/webbrowser.pyi +0 -74
- jaclang/vendor/mypy/typeshed/stdlib/winreg.pyi +0 -132
- jaclang/vendor/mypy/typeshed/stdlib/winsound.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/handlers.pyi +0 -91
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/headers.pyi +0 -26
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/simple_server.pyi +0 -37
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/types.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/util.pyi +0 -24
- jaclang/vendor/mypy/typeshed/stdlib/wsgiref/validate.pyi +0 -50
- jaclang/vendor/mypy/typeshed/stdlib/xdrlib.pyi +0 -57
- jaclang/vendor/mypy/typeshed/stdlib/xml/__init__.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/__init__.pyi +0 -69
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/domreg.pyi +0 -8
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +0 -100
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/minicompat.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/minidom.pyi +0 -404
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/pulldom.pyi +0 -94
- jaclang/vendor/mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +0 -108
- jaclang/vendor/mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +0 -28
- jaclang/vendor/mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +0 -34
- jaclang/vendor/mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +0 -327
- jaclang/vendor/mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
- jaclang/vendor/mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/xml/parsers/__init__.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +0 -1
- jaclang/vendor/mypy/typeshed/stdlib/xml/sax/__init__.pyi +0 -25
- jaclang/vendor/mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +0 -19
- jaclang/vendor/mypy/typeshed/stdlib/xml/sax/handler.pyi +0 -55
- jaclang/vendor/mypy/typeshed/stdlib/xml/sax/saxutils.pyi +0 -60
- jaclang/vendor/mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +0 -87
- jaclang/vendor/mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
- jaclang/vendor/mypy/typeshed/stdlib/xmlrpc/client.pyi +0 -296
- jaclang/vendor/mypy/typeshed/stdlib/xmlrpc/server.pyi +0 -143
- jaclang/vendor/mypy/typeshed/stdlib/xxlimited.pyi +0 -22
- jaclang/vendor/mypy/typeshed/stdlib/zipapp.pyi +0 -20
- jaclang/vendor/mypy/typeshed/stdlib/zipfile/__init__.pyi +0 -306
- jaclang/vendor/mypy/typeshed/stdlib/zipfile/_path.pyi +0 -95
- jaclang/vendor/mypy/typeshed/stdlib/zipimport.pyi +0 -32
- jaclang/vendor/mypy/typeshed/stdlib/zlib.pyi +0 -56
- jaclang/vendor/mypy/typeshed/stdlib/zoneinfo/__init__.pyi +0 -38
- jaclang/vendor/mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +0 -218
- jaclang/vendor/mypy/typestate.py +0 -323
- jaclang/vendor/mypy/typetraverser.py +0 -148
- jaclang/vendor/mypy/typevars.py +0 -93
- jaclang/vendor/mypy/typevartuples.py +0 -32
- jaclang/vendor/mypy/util.py +0 -869
- jaclang/vendor/mypy/version.py +0 -1
- jaclang/vendor/mypy/visitor.py +0 -621
- jaclang/vendor/mypy/xml/mypy-html.css +0 -104
- jaclang/vendor/mypy/xml/mypy-html.xslt +0 -81
- jaclang/vendor/mypy/xml/mypy-txt.xslt +0 -100
- jaclang/vendor/mypy/xml/mypy.xsd +0 -50
- jaclang/vendor/mypy-1.10.0.dist-info/LICENSE +0 -229
- jaclang/vendor/mypy-1.10.0.dist-info/METADATA +0 -48
- jaclang/vendor/mypy-1.10.0.dist-info/RECORD +0 -1241
- jaclang/vendor/mypy-1.10.0.dist-info/WHEEL +0 -6
- jaclang/vendor/mypy-1.10.0.dist-info/entry_points.txt +0 -6
- jaclang/vendor/mypy-1.10.0.dist-info/top_level.txt +0 -3
- jaclang/vendor/mypy_extensions-1.0.0.dist-info/LICENSE +0 -27
- jaclang/vendor/mypy_extensions-1.0.0.dist-info/METADATA +0 -29
- jaclang/vendor/mypy_extensions-1.0.0.dist-info/RECORD +0 -6
- jaclang/vendor/mypy_extensions-1.0.0.dist-info/top_level.txt +0 -1
- jaclang/vendor/mypy_extensions.py +0 -213
- jaclang/vendor/mypyc/README.md +0 -133
- jaclang/vendor/mypyc/__init__.py +0 -0
- jaclang/vendor/mypyc/__main__.py +0 -57
- jaclang/vendor/mypyc/analysis/__init__.py +0 -0
- jaclang/vendor/mypyc/analysis/attrdefined.py +0 -436
- jaclang/vendor/mypyc/analysis/blockfreq.py +0 -32
- jaclang/vendor/mypyc/analysis/dataflow.py +0 -628
- jaclang/vendor/mypyc/analysis/ircheck.py +0 -433
- jaclang/vendor/mypyc/analysis/selfleaks.py +0 -211
- jaclang/vendor/mypyc/build.py +0 -616
- jaclang/vendor/mypyc/codegen/__init__.py +0 -0
- jaclang/vendor/mypyc/codegen/cstring.py +0 -54
- jaclang/vendor/mypyc/codegen/emit.py +0 -1193
- jaclang/vendor/mypyc/codegen/emitclass.py +0 -1060
- jaclang/vendor/mypyc/codegen/emitfunc.py +0 -852
- jaclang/vendor/mypyc/codegen/emitmodule.py +0 -1136
- jaclang/vendor/mypyc/codegen/emitwrapper.py +0 -979
- jaclang/vendor/mypyc/codegen/literals.py +0 -302
- jaclang/vendor/mypyc/common.py +0 -136
- jaclang/vendor/mypyc/crash.py +0 -31
- jaclang/vendor/mypyc/doc/Makefile +0 -20
- jaclang/vendor/mypyc/doc/bool_operations.rst +0 -27
- jaclang/vendor/mypyc/doc/compilation_units.rst +0 -20
- jaclang/vendor/mypyc/doc/conf.py +0 -59
- jaclang/vendor/mypyc/doc/cpython-timings.md +0 -25
- jaclang/vendor/mypyc/doc/dev-intro.md +0 -548
- jaclang/vendor/mypyc/doc/dict_operations.rst +0 -59
- jaclang/vendor/mypyc/doc/differences_from_python.rst +0 -332
- jaclang/vendor/mypyc/doc/float_operations.rst +0 -50
- jaclang/vendor/mypyc/doc/future.md +0 -42
- jaclang/vendor/mypyc/doc/getting_started.rst +0 -240
- jaclang/vendor/mypyc/doc/index.rst +0 -61
- jaclang/vendor/mypyc/doc/int_operations.rst +0 -162
- jaclang/vendor/mypyc/doc/introduction.rst +0 -150
- jaclang/vendor/mypyc/doc/list_operations.rst +0 -65
- jaclang/vendor/mypyc/doc/make.bat +0 -35
- jaclang/vendor/mypyc/doc/native_classes.rst +0 -206
- jaclang/vendor/mypyc/doc/native_operations.rst +0 -55
- jaclang/vendor/mypyc/doc/performance_tips_and_tricks.rst +0 -244
- jaclang/vendor/mypyc/doc/set_operations.rst +0 -47
- jaclang/vendor/mypyc/doc/str_operations.rst +0 -35
- jaclang/vendor/mypyc/doc/tuple_operations.rst +0 -33
- jaclang/vendor/mypyc/doc/using_type_annotations.rst +0 -398
- jaclang/vendor/mypyc/errors.py +0 -29
- jaclang/vendor/mypyc/external/googletest/LICENSE +0 -28
- jaclang/vendor/mypyc/external/googletest/README.md +0 -280
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-death-test.h +0 -294
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-message.h +0 -250
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-param-test.h +0 -1444
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +0 -510
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-printers.h +0 -993
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-spi.h +0 -232
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-test-part.h +0 -179
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest-typed-test.h +0 -263
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest.h +0 -2236
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest_pred_impl.h +0 -358
- jaclang/vendor/mypyc/external/googletest/include/gtest/gtest_prod.h +0 -58
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +0 -69
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +0 -42
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/custom/gtest.h +0 -41
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +0 -319
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +0 -206
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-internal.h +0 -1238
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +0 -243
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +0 -5146
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +0 -286
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +0 -731
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +0 -93
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-port.h +0 -2560
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-string.h +0 -167
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +0 -1020
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +0 -347
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +0 -3331
- jaclang/vendor/mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +0 -297
- jaclang/vendor/mypyc/external/googletest/make/Makefile +0 -61
- jaclang/vendor/mypyc/external/googletest/src/gtest-all.cc +0 -48
- jaclang/vendor/mypyc/external/googletest/src/gtest-death-test.cc +0 -1342
- jaclang/vendor/mypyc/external/googletest/src/gtest-filepath.cc +0 -387
- jaclang/vendor/mypyc/external/googletest/src/gtest-internal-inl.h +0 -1183
- jaclang/vendor/mypyc/external/googletest/src/gtest-port.cc +0 -1259
- jaclang/vendor/mypyc/external/googletest/src/gtest-printers.cc +0 -373
- jaclang/vendor/mypyc/external/googletest/src/gtest-test-part.cc +0 -110
- jaclang/vendor/mypyc/external/googletest/src/gtest-typed-test.cc +0 -118
- jaclang/vendor/mypyc/external/googletest/src/gtest.cc +0 -5388
- jaclang/vendor/mypyc/external/googletest/src/gtest_main.cc +0 -38
- jaclang/vendor/mypyc/ir/__init__.py +0 -0
- jaclang/vendor/mypyc/ir/class_ir.py +0 -499
- jaclang/vendor/mypyc/ir/func_ir.py +0 -370
- jaclang/vendor/mypyc/ir/module_ir.py +0 -88
- jaclang/vendor/mypyc/ir/ops.py +0 -1727
- jaclang/vendor/mypyc/ir/pprint.py +0 -516
- jaclang/vendor/mypyc/ir/rtypes.py +0 -1038
- jaclang/vendor/mypyc/irbuild/__init__.py +0 -0
- jaclang/vendor/mypyc/irbuild/ast_helpers.py +0 -123
- jaclang/vendor/mypyc/irbuild/builder.py +0 -1394
- jaclang/vendor/mypyc/irbuild/callable_class.py +0 -173
- jaclang/vendor/mypyc/irbuild/classdef.py +0 -850
- jaclang/vendor/mypyc/irbuild/constant_fold.py +0 -95
- jaclang/vendor/mypyc/irbuild/context.py +0 -186
- jaclang/vendor/mypyc/irbuild/env_class.py +0 -223
- jaclang/vendor/mypyc/irbuild/expression.py +0 -1070
- jaclang/vendor/mypyc/irbuild/for_helpers.py +0 -1075
- jaclang/vendor/mypyc/irbuild/format_str_tokenizer.py +0 -250
- jaclang/vendor/mypyc/irbuild/function.py +0 -1088
- jaclang/vendor/mypyc/irbuild/generator.py +0 -346
- jaclang/vendor/mypyc/irbuild/ll_builder.py +0 -2389
- jaclang/vendor/mypyc/irbuild/main.py +0 -153
- jaclang/vendor/mypyc/irbuild/mapper.py +0 -221
- jaclang/vendor/mypyc/irbuild/match.py +0 -355
- jaclang/vendor/mypyc/irbuild/nonlocalcontrol.py +0 -197
- jaclang/vendor/mypyc/irbuild/prebuildvisitor.py +0 -203
- jaclang/vendor/mypyc/irbuild/prepare.py +0 -609
- jaclang/vendor/mypyc/irbuild/specialize.py +0 -822
- jaclang/vendor/mypyc/irbuild/statement.py +0 -1017
- jaclang/vendor/mypyc/irbuild/targets.py +0 -57
- jaclang/vendor/mypyc/irbuild/util.py +0 -189
- jaclang/vendor/mypyc/irbuild/visitor.py +0 -401
- jaclang/vendor/mypyc/irbuild/vtable.py +0 -82
- jaclang/vendor/mypyc/lib-rt/CPy.h +0 -638
- jaclang/vendor/mypyc/lib-rt/bytes_ops.c +0 -143
- jaclang/vendor/mypyc/lib-rt/dict_ops.c +0 -446
- jaclang/vendor/mypyc/lib-rt/exc_ops.c +0 -259
- jaclang/vendor/mypyc/lib-rt/float_ops.c +0 -192
- jaclang/vendor/mypyc/lib-rt/generic_ops.c +0 -64
- jaclang/vendor/mypyc/lib-rt/getargs.c +0 -450
- jaclang/vendor/mypyc/lib-rt/getargsfast.c +0 -569
- jaclang/vendor/mypyc/lib-rt/init.c +0 -13
- jaclang/vendor/mypyc/lib-rt/int_ops.c +0 -803
- jaclang/vendor/mypyc/lib-rt/list_ops.c +0 -335
- jaclang/vendor/mypyc/lib-rt/misc_ops.c +0 -942
- jaclang/vendor/mypyc/lib-rt/module_shim.tmpl +0 -18
- jaclang/vendor/mypyc/lib-rt/mypyc_util.h +0 -118
- jaclang/vendor/mypyc/lib-rt/pythoncapi_compat.h +0 -497
- jaclang/vendor/mypyc/lib-rt/pythonsupport.h +0 -533
- jaclang/vendor/mypyc/lib-rt/set_ops.c +0 -17
- jaclang/vendor/mypyc/lib-rt/setup.py +0 -70
- jaclang/vendor/mypyc/lib-rt/str_ops.c +0 -241
- jaclang/vendor/mypyc/lib-rt/test_capi.cc +0 -585
- jaclang/vendor/mypyc/lib-rt/tuple_ops.c +0 -61
- jaclang/vendor/mypyc/lower/__init__.py +0 -0
- jaclang/vendor/mypyc/lower/int_ops.py +0 -113
- jaclang/vendor/mypyc/lower/list_ops.py +0 -45
- jaclang/vendor/mypyc/lower/misc_ops.py +0 -12
- jaclang/vendor/mypyc/lower/registry.py +0 -26
- jaclang/vendor/mypyc/namegen.py +0 -115
- jaclang/vendor/mypyc/options.py +0 -32
- jaclang/vendor/mypyc/primitives/__init__.py +0 -0
- jaclang/vendor/mypyc/primitives/bytes_ops.py +0 -101
- jaclang/vendor/mypyc/primitives/dict_ops.py +0 -325
- jaclang/vendor/mypyc/primitives/exc_ops.py +0 -101
- jaclang/vendor/mypyc/primitives/float_ops.py +0 -168
- jaclang/vendor/mypyc/primitives/generic_ops.py +0 -384
- jaclang/vendor/mypyc/primitives/int_ops.py +0 -303
- jaclang/vendor/mypyc/primitives/list_ops.py +0 -310
- jaclang/vendor/mypyc/primitives/misc_ops.py +0 -267
- jaclang/vendor/mypyc/primitives/registry.py +0 -360
- jaclang/vendor/mypyc/primitives/set_ops.py +0 -121
- jaclang/vendor/mypyc/primitives/str_ops.py +0 -229
- jaclang/vendor/mypyc/primitives/tuple_ops.py +0 -83
- jaclang/vendor/mypyc/rt_subtype.py +0 -77
- jaclang/vendor/mypyc/sametype.py +0 -83
- jaclang/vendor/mypyc/subtype.py +0 -88
- jaclang/vendor/mypyc/test/__init__.py +0 -0
- jaclang/vendor/mypyc/test/config.py +0 -13
- jaclang/vendor/mypyc/test/test_alwaysdefined.py +0 -46
- jaclang/vendor/mypyc/test/test_analysis.py +0 -77
- jaclang/vendor/mypyc/test/test_cheader.py +0 -53
- jaclang/vendor/mypyc/test/test_commandline.py +0 -82
- jaclang/vendor/mypyc/test/test_emit.py +0 -69
- jaclang/vendor/mypyc/test/test_emitclass.py +0 -35
- jaclang/vendor/mypyc/test/test_emitfunc.py +0 -928
- jaclang/vendor/mypyc/test/test_emitwrapper.py +0 -60
- jaclang/vendor/mypyc/test/test_exceptions.py +0 -56
- jaclang/vendor/mypyc/test/test_external.py +0 -49
- jaclang/vendor/mypyc/test/test_irbuild.py +0 -87
- jaclang/vendor/mypyc/test/test_ircheck.py +0 -199
- jaclang/vendor/mypyc/test/test_literals.py +0 -90
- jaclang/vendor/mypyc/test/test_lowering.py +0 -56
- jaclang/vendor/mypyc/test/test_namegen.py +0 -48
- jaclang/vendor/mypyc/test/test_optimizations.py +0 -68
- jaclang/vendor/mypyc/test/test_pprint.py +0 -42
- jaclang/vendor/mypyc/test/test_rarray.py +0 -48
- jaclang/vendor/mypyc/test/test_refcount.py +0 -59
- jaclang/vendor/mypyc/test/test_run.py +0 -426
- jaclang/vendor/mypyc/test/test_serialization.py +0 -108
- jaclang/vendor/mypyc/test/test_struct.py +0 -112
- jaclang/vendor/mypyc/test/test_tuplename.py +0 -33
- jaclang/vendor/mypyc/test/test_typeops.py +0 -97
- jaclang/vendor/mypyc/test/testutil.py +0 -283
- jaclang/vendor/mypyc/test-data/alwaysdefined.test +0 -732
- jaclang/vendor/mypyc/test-data/analysis.test +0 -470
- jaclang/vendor/mypyc/test-data/commandline.test +0 -245
- jaclang/vendor/mypyc/test-data/driver/driver.py +0 -48
- jaclang/vendor/mypyc/test-data/exceptions-freq.test +0 -125
- jaclang/vendor/mypyc/test-data/exceptions.test +0 -699
- jaclang/vendor/mypyc/test-data/fixtures/ir.py +0 -373
- jaclang/vendor/mypyc/test-data/fixtures/testutil.py +0 -103
- jaclang/vendor/mypyc/test-data/fixtures/typing-full.pyi +0 -169
- jaclang/vendor/mypyc/test-data/irbuild-any.test +0 -236
- jaclang/vendor/mypyc/test-data/irbuild-basic.test +0 -3399
- jaclang/vendor/mypyc/test-data/irbuild-bool.test +0 -424
- jaclang/vendor/mypyc/test-data/irbuild-bytes.test +0 -181
- jaclang/vendor/mypyc/test-data/irbuild-classes.test +0 -1302
- jaclang/vendor/mypyc/test-data/irbuild-constant-fold.test +0 -480
- jaclang/vendor/mypyc/test-data/irbuild-dict.test +0 -584
- jaclang/vendor/mypyc/test-data/irbuild-dunders.test +0 -215
- jaclang/vendor/mypyc/test-data/irbuild-float.test +0 -497
- jaclang/vendor/mypyc/test-data/irbuild-generics.test +0 -150
- jaclang/vendor/mypyc/test-data/irbuild-glue-methods.test +0 -437
- jaclang/vendor/mypyc/test-data/irbuild-i16.test +0 -526
- jaclang/vendor/mypyc/test-data/irbuild-i32.test +0 -598
- jaclang/vendor/mypyc/test-data/irbuild-i64.test +0 -2144
- jaclang/vendor/mypyc/test-data/irbuild-int.test +0 -194
- jaclang/vendor/mypyc/test-data/irbuild-isinstance.test +0 -109
- jaclang/vendor/mypyc/test-data/irbuild-lists.test +0 -513
- jaclang/vendor/mypyc/test-data/irbuild-match.test +0 -1717
- jaclang/vendor/mypyc/test-data/irbuild-math.test +0 -64
- jaclang/vendor/mypyc/test-data/irbuild-nested.test +0 -807
- jaclang/vendor/mypyc/test-data/irbuild-optional.test +0 -536
- jaclang/vendor/mypyc/test-data/irbuild-set.test +0 -806
- jaclang/vendor/mypyc/test-data/irbuild-singledispatch.test +0 -257
- jaclang/vendor/mypyc/test-data/irbuild-statements.test +0 -1060
- jaclang/vendor/mypyc/test-data/irbuild-str.test +0 -312
- jaclang/vendor/mypyc/test-data/irbuild-strip-asserts.test +0 -12
- jaclang/vendor/mypyc/test-data/irbuild-try.test +0 -523
- jaclang/vendor/mypyc/test-data/irbuild-tuple.test +0 -386
- jaclang/vendor/mypyc/test-data/irbuild-u8.test +0 -543
- jaclang/vendor/mypyc/test-data/irbuild-unreachable.test +0 -241
- jaclang/vendor/mypyc/test-data/irbuild-vectorcall.test +0 -153
- jaclang/vendor/mypyc/test-data/lowering-int.test +0 -377
- jaclang/vendor/mypyc/test-data/lowering-list.test +0 -33
- jaclang/vendor/mypyc/test-data/opt-copy-propagation.test +0 -400
- jaclang/vendor/mypyc/test-data/opt-flag-elimination.test +0 -296
- jaclang/vendor/mypyc/test-data/refcount.test +0 -1482
- jaclang/vendor/mypyc/test-data/run-async.test +0 -173
- jaclang/vendor/mypyc/test-data/run-attrs.test +0 -318
- jaclang/vendor/mypyc/test-data/run-bench.test +0 -196
- jaclang/vendor/mypyc/test-data/run-bools.test +0 -229
- jaclang/vendor/mypyc/test-data/run-bytes.test +0 -302
- jaclang/vendor/mypyc/test-data/run-classes.test +0 -2505
- jaclang/vendor/mypyc/test-data/run-dicts.test +0 -334
- jaclang/vendor/mypyc/test-data/run-dunders.test +0 -945
- jaclang/vendor/mypyc/test-data/run-exceptions.test +0 -448
- jaclang/vendor/mypyc/test-data/run-floats.test +0 -516
- jaclang/vendor/mypyc/test-data/run-functions.test +0 -1310
- jaclang/vendor/mypyc/test-data/run-generators.test +0 -682
- jaclang/vendor/mypyc/test-data/run-i16.test +0 -338
- jaclang/vendor/mypyc/test-data/run-i32.test +0 -336
- jaclang/vendor/mypyc/test-data/run-i64.test +0 -1519
- jaclang/vendor/mypyc/test-data/run-imports.test +0 -265
- jaclang/vendor/mypyc/test-data/run-integers.test +0 -540
- jaclang/vendor/mypyc/test-data/run-lists.test +0 -411
- jaclang/vendor/mypyc/test-data/run-loops.test +0 -485
- jaclang/vendor/mypyc/test-data/run-match.test +0 -283
- jaclang/vendor/mypyc/test-data/run-math.test +0 -106
- jaclang/vendor/mypyc/test-data/run-misc.test +0 -1170
- jaclang/vendor/mypyc/test-data/run-multimodule.test +0 -887
- jaclang/vendor/mypyc/test-data/run-mypy-sim.test +0 -138
- jaclang/vendor/mypyc/test-data/run-primitives.test +0 -375
- jaclang/vendor/mypyc/test-data/run-python37.test +0 -159
- jaclang/vendor/mypyc/test-data/run-python38.test +0 -88
- jaclang/vendor/mypyc/test-data/run-sets.test +0 -150
- jaclang/vendor/mypyc/test-data/run-singledispatch.test +0 -698
- jaclang/vendor/mypyc/test-data/run-strings.test +0 -641
- jaclang/vendor/mypyc/test-data/run-traits.test +0 -411
- jaclang/vendor/mypyc/test-data/run-tuples.test +0 -258
- jaclang/vendor/mypyc/test-data/run-u8.test +0 -303
- jaclang/vendor/mypyc/transform/__init__.py +0 -0
- jaclang/vendor/mypyc/transform/copy_propagation.py +0 -94
- jaclang/vendor/mypyc/transform/exceptions.py +0 -182
- jaclang/vendor/mypyc/transform/flag_elimination.py +0 -108
- jaclang/vendor/mypyc/transform/ir_transform.py +0 -368
- jaclang/vendor/mypyc/transform/lower.py +0 -33
- jaclang/vendor/mypyc/transform/refcount.py +0 -294
- jaclang/vendor/mypyc/transform/uninit.py +0 -190
- jaclang/vendor/typing_extensions-4.12.2.dist-info/LICENSE +0 -279
- jaclang/vendor/typing_extensions-4.12.2.dist-info/METADATA +0 -67
- jaclang/vendor/typing_extensions-4.12.2.dist-info/RECORD +0 -5
- jaclang/vendor/typing_extensions-4.12.2.dist-info/WHEEL +0 -4
- jaclang/vendor/typing_extensions.py +0 -3641
- jaclang-0.7.33.dist-info/RECORD +0 -1562
- /jaclang/{vendor/mypy/dmypy → compiler/larkparse}/__init__.py +0 -0
- /jaclang/{tests → compiler/passes/main/tests}/fixtures/access_checker.jac +0 -0
- /jaclang/{vendor/mypy/plugins/__init__.py → langserve/tests/fixtures/deep_check_crash.jac} +0 -0
- /jaclang/{vendor/mypy/server/__init__.py → langserve/tests/server_test/code_test.py} +0 -0
- /jaclang/{plugin → runtimelib}/tests/__init__.py +0 -0
- /jaclang/{plugin → runtimelib}/tests/fixtures/traversing_save.jac +0 -0
- /jaclang/{vendor/mypy/test → tests}/__init__.py +0 -0
- /jaclang/{vendor/mypy/test/meta → tests/fixtures}/__init__.py +0 -0
- /jaclang/tests/fixtures/{architype_def_bug.jac → archetype_def_bug.jac} +0 -0
- /jaclang/vendor/{mypy/typeshed/stdlib/concurrent/__init__.pyi → attrs-25.3.0.dist-info/REQUESTED} +0 -0
- /jaclang/vendor/{attrs-23.2.0.dist-info → attrs-25.3.0.dist-info}/licenses/LICENSE +0 -0
- /jaclang/vendor/{mypy/typeshed/stdlib/distutils/command/__init__.pyi → cattrs-24.1.3.dist-info/REQUESTED} +0 -0
- /jaclang/vendor/{cattrs-23.2.3.dist-info → cattrs-24.1.3.dist-info}/licenses/LICENSE +0 -0
- /jaclang/vendor/{mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi → lark-1.2.2.dist-info/REQUESTED} +0 -0
- /jaclang/vendor/{lark-1.1.9.dist-info → lark-1.2.2.dist-info}/entry_points.txt +0 -0
- /jaclang/vendor/{lark-1.1.9.dist-info → lark-1.2.2.dist-info}/top_level.txt +0 -0
- /jaclang/vendor/{mypy/typeshed/stdlib/email/mime/__init__.pyi → lsprotocol-2023.0.1.dist-info/REQUESTED} +0 -0
- /jaclang/vendor/lsprotocol-2023.0.1.dist-info/{LICENSE → licenses/LICENSE} +0 -0
- /jaclang/vendor/{mypy/typeshed/stdlib/lib2to3/__init__.pyi → pluggy-1.5.0.dist-info/REQUESTED} +0 -0
- /jaclang/vendor/pluggy-1.5.0.dist-info/{LICENSE → licenses/LICENSE} +0 -0
- /jaclang/vendor/{mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi → pygls-1.3.1.dist-info/REQUESTED} +0 -0
- {jaclang-0.7.33.dist-info → jaclang-0.8.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,3444 @@
|
|
|
1
|
+
# The file was automatically generated by Lark v1.2.2
|
|
2
|
+
__version__ = "1.2.2"
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
#
|
|
6
|
+
# Lark Stand-alone Generator Tool
|
|
7
|
+
# ----------------------------------
|
|
8
|
+
# Generates a stand-alone LALR(1) parser
|
|
9
|
+
#
|
|
10
|
+
# Git: https://github.com/erezsh/lark
|
|
11
|
+
# Author: Erez Shinan (erezshin@gmail.com)
|
|
12
|
+
#
|
|
13
|
+
#
|
|
14
|
+
# >>> LICENSE
|
|
15
|
+
#
|
|
16
|
+
# This tool and its generated code use a separate license from Lark,
|
|
17
|
+
# and are subject to the terms of the Mozilla Public License, v. 2.0.
|
|
18
|
+
# If a copy of the MPL was not distributed with this
|
|
19
|
+
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
20
|
+
#
|
|
21
|
+
# If you wish to purchase a commercial license for this tool and its
|
|
22
|
+
# generated code, you may contact me via email or otherwise.
|
|
23
|
+
#
|
|
24
|
+
# If MPL2 is incompatible with your free or open-source project,
|
|
25
|
+
# contact me and we'll work it out.
|
|
26
|
+
#
|
|
27
|
+
#
|
|
28
|
+
|
|
29
|
+
from copy import deepcopy
|
|
30
|
+
from abc import ABC, abstractmethod
|
|
31
|
+
from types import ModuleType
|
|
32
|
+
from typing import (
|
|
33
|
+
TypeVar, Generic, Type, Tuple, List, Dict, Iterator, Collection, Callable, Optional, FrozenSet, Any,
|
|
34
|
+
Union, Iterable, IO, TYPE_CHECKING, overload, Sequence,
|
|
35
|
+
Pattern as REPattern, ClassVar, Set, Mapping
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class LarkError(Exception):
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ConfigurationError(LarkError, ValueError):
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def assert_config(value, options: Collection, msg='Got %r, expected one of %s'):
|
|
48
|
+
if value not in options:
|
|
49
|
+
raise ConfigurationError(msg % (value, options))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class GrammarError(LarkError):
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class ParseError(LarkError):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class LexError(LarkError):
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
T = TypeVar('T')
|
|
64
|
+
|
|
65
|
+
class UnexpectedInput(LarkError):
|
|
66
|
+
#--
|
|
67
|
+
line: int
|
|
68
|
+
column: int
|
|
69
|
+
pos_in_stream = None
|
|
70
|
+
state: Any
|
|
71
|
+
_terminals_by_name = None
|
|
72
|
+
interactive_parser: 'InteractiveParser'
|
|
73
|
+
|
|
74
|
+
def get_context(self, text: str, span: int=40) -> str:
|
|
75
|
+
#--
|
|
76
|
+
assert self.pos_in_stream is not None, self
|
|
77
|
+
pos = self.pos_in_stream
|
|
78
|
+
start = max(pos - span, 0)
|
|
79
|
+
end = pos + span
|
|
80
|
+
if not isinstance(text, bytes):
|
|
81
|
+
before = text[start:pos].rsplit('\n', 1)[-1]
|
|
82
|
+
after = text[pos:end].split('\n', 1)[0]
|
|
83
|
+
return before + after + '\n' + ' ' * len(before.expandtabs()) + '^\n'
|
|
84
|
+
else:
|
|
85
|
+
before = text[start:pos].rsplit(b'\n', 1)[-1]
|
|
86
|
+
after = text[pos:end].split(b'\n', 1)[0]
|
|
87
|
+
return (before + after + b'\n' + b' ' * len(before.expandtabs()) + b'^\n').decode("ascii", "backslashreplace")
|
|
88
|
+
|
|
89
|
+
def match_examples(self, parse_fn: 'Callable[[str], Tree]',
|
|
90
|
+
examples: Union[Mapping[T, Iterable[str]], Iterable[Tuple[T, Iterable[str]]]],
|
|
91
|
+
token_type_match_fallback: bool=False,
|
|
92
|
+
use_accepts: bool=True
|
|
93
|
+
) -> Optional[T]:
|
|
94
|
+
#--
|
|
95
|
+
assert self.state is not None, "Not supported for this exception"
|
|
96
|
+
|
|
97
|
+
if isinstance(examples, Mapping):
|
|
98
|
+
examples = examples.items()
|
|
99
|
+
|
|
100
|
+
candidate = (None, False)
|
|
101
|
+
for i, (label, example) in enumerate(examples):
|
|
102
|
+
assert not isinstance(example, str), "Expecting a list"
|
|
103
|
+
|
|
104
|
+
for j, malformed in enumerate(example):
|
|
105
|
+
try:
|
|
106
|
+
parse_fn(malformed)
|
|
107
|
+
except UnexpectedInput as ut:
|
|
108
|
+
if ut.state == self.state:
|
|
109
|
+
if (
|
|
110
|
+
use_accepts
|
|
111
|
+
and isinstance(self, UnexpectedToken)
|
|
112
|
+
and isinstance(ut, UnexpectedToken)
|
|
113
|
+
and ut.accepts != self.accepts
|
|
114
|
+
):
|
|
115
|
+
logger.debug("Different accepts with same state[%d]: %s != %s at example [%s][%s]" %
|
|
116
|
+
(self.state, self.accepts, ut.accepts, i, j))
|
|
117
|
+
continue
|
|
118
|
+
if (
|
|
119
|
+
isinstance(self, (UnexpectedToken, UnexpectedEOF))
|
|
120
|
+
and isinstance(ut, (UnexpectedToken, UnexpectedEOF))
|
|
121
|
+
):
|
|
122
|
+
if ut.token == self.token: ##
|
|
123
|
+
|
|
124
|
+
logger.debug("Exact Match at example [%s][%s]" % (i, j))
|
|
125
|
+
return label
|
|
126
|
+
|
|
127
|
+
if token_type_match_fallback:
|
|
128
|
+
##
|
|
129
|
+
|
|
130
|
+
if (ut.token.type == self.token.type) and not candidate[-1]:
|
|
131
|
+
logger.debug("Token Type Fallback at example [%s][%s]" % (i, j))
|
|
132
|
+
candidate = label, True
|
|
133
|
+
|
|
134
|
+
if candidate[0] is None:
|
|
135
|
+
logger.debug("Same State match at example [%s][%s]" % (i, j))
|
|
136
|
+
candidate = label, False
|
|
137
|
+
|
|
138
|
+
return candidate[0]
|
|
139
|
+
|
|
140
|
+
def _format_expected(self, expected):
|
|
141
|
+
if self._terminals_by_name:
|
|
142
|
+
d = self._terminals_by_name
|
|
143
|
+
expected = [d[t_name].user_repr() if t_name in d else t_name for t_name in expected]
|
|
144
|
+
return "Expected one of: \n\t* %s\n" % '\n\t* '.join(expected)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class UnexpectedEOF(ParseError, UnexpectedInput):
|
|
148
|
+
#--
|
|
149
|
+
expected: 'List[Token]'
|
|
150
|
+
|
|
151
|
+
def __init__(self, expected, state=None, terminals_by_name=None):
|
|
152
|
+
super(UnexpectedEOF, self).__init__()
|
|
153
|
+
|
|
154
|
+
self.expected = expected
|
|
155
|
+
self.state = state
|
|
156
|
+
from .lexer import Token
|
|
157
|
+
self.token = Token("<EOF>", "") ##
|
|
158
|
+
|
|
159
|
+
self.pos_in_stream = -1
|
|
160
|
+
self.line = -1
|
|
161
|
+
self.column = -1
|
|
162
|
+
self._terminals_by_name = terminals_by_name
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def __str__(self):
|
|
166
|
+
message = "Unexpected end-of-input. "
|
|
167
|
+
message += self._format_expected(self.expected)
|
|
168
|
+
return message
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class UnexpectedCharacters(LexError, UnexpectedInput):
|
|
172
|
+
#--
|
|
173
|
+
|
|
174
|
+
allowed: Set[str]
|
|
175
|
+
considered_tokens: Set[Any]
|
|
176
|
+
|
|
177
|
+
def __init__(self, seq, lex_pos, line, column, allowed=None, considered_tokens=None, state=None, token_history=None,
|
|
178
|
+
terminals_by_name=None, considered_rules=None):
|
|
179
|
+
super(UnexpectedCharacters, self).__init__()
|
|
180
|
+
|
|
181
|
+
##
|
|
182
|
+
|
|
183
|
+
self.line = line
|
|
184
|
+
self.column = column
|
|
185
|
+
self.pos_in_stream = lex_pos
|
|
186
|
+
self.state = state
|
|
187
|
+
self._terminals_by_name = terminals_by_name
|
|
188
|
+
|
|
189
|
+
self.allowed = allowed
|
|
190
|
+
self.considered_tokens = considered_tokens
|
|
191
|
+
self.considered_rules = considered_rules
|
|
192
|
+
self.token_history = token_history
|
|
193
|
+
|
|
194
|
+
if isinstance(seq, bytes):
|
|
195
|
+
self.char = seq[lex_pos:lex_pos + 1].decode("ascii", "backslashreplace")
|
|
196
|
+
else:
|
|
197
|
+
self.char = seq[lex_pos]
|
|
198
|
+
self._context = self.get_context(seq)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def __str__(self):
|
|
202
|
+
message = "No terminal matches '%s' in the current parser context, at line %d col %d" % (self.char, self.line, self.column)
|
|
203
|
+
message += '\n\n' + self._context
|
|
204
|
+
if self.allowed:
|
|
205
|
+
message += self._format_expected(self.allowed)
|
|
206
|
+
if self.token_history:
|
|
207
|
+
message += '\nPrevious tokens: %s\n' % ', '.join(repr(t) for t in self.token_history)
|
|
208
|
+
return message
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class UnexpectedToken(ParseError, UnexpectedInput):
|
|
212
|
+
#--
|
|
213
|
+
|
|
214
|
+
expected: Set[str]
|
|
215
|
+
considered_rules: Set[str]
|
|
216
|
+
|
|
217
|
+
def __init__(self, token, expected, considered_rules=None, state=None, interactive_parser=None, terminals_by_name=None, token_history=None):
|
|
218
|
+
super(UnexpectedToken, self).__init__()
|
|
219
|
+
|
|
220
|
+
##
|
|
221
|
+
|
|
222
|
+
self.line = getattr(token, 'line', '?')
|
|
223
|
+
self.column = getattr(token, 'column', '?')
|
|
224
|
+
self.pos_in_stream = getattr(token, 'start_pos', None)
|
|
225
|
+
self.state = state
|
|
226
|
+
|
|
227
|
+
self.token = token
|
|
228
|
+
self.expected = expected ##
|
|
229
|
+
|
|
230
|
+
self._accepts = NO_VALUE
|
|
231
|
+
self.considered_rules = considered_rules
|
|
232
|
+
self.interactive_parser = interactive_parser
|
|
233
|
+
self._terminals_by_name = terminals_by_name
|
|
234
|
+
self.token_history = token_history
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@property
|
|
238
|
+
def accepts(self) -> Set[str]:
|
|
239
|
+
if self._accepts is NO_VALUE:
|
|
240
|
+
self._accepts = self.interactive_parser and self.interactive_parser.accepts()
|
|
241
|
+
return self._accepts
|
|
242
|
+
|
|
243
|
+
def __str__(self):
|
|
244
|
+
message = ("Unexpected token %r at line %s, column %s.\n%s"
|
|
245
|
+
% (self.token, self.line, self.column, self._format_expected(self.accepts or self.expected)))
|
|
246
|
+
if self.token_history:
|
|
247
|
+
message += "Previous tokens: %r\n" % self.token_history
|
|
248
|
+
|
|
249
|
+
return message
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
class VisitError(LarkError):
|
|
254
|
+
#--
|
|
255
|
+
|
|
256
|
+
obj: 'Union[Tree, Token]'
|
|
257
|
+
orig_exc: Exception
|
|
258
|
+
|
|
259
|
+
def __init__(self, rule, obj, orig_exc):
|
|
260
|
+
message = 'Error trying to process rule "%s":\n\n%s' % (rule, orig_exc)
|
|
261
|
+
super(VisitError, self).__init__(message)
|
|
262
|
+
|
|
263
|
+
self.rule = rule
|
|
264
|
+
self.obj = obj
|
|
265
|
+
self.orig_exc = orig_exc
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
class MissingVariableError(LarkError):
|
|
269
|
+
pass
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
import sys, re
|
|
273
|
+
import logging
|
|
274
|
+
|
|
275
|
+
logger: logging.Logger = logging.getLogger("lark")
|
|
276
|
+
logger.addHandler(logging.StreamHandler())
|
|
277
|
+
##
|
|
278
|
+
|
|
279
|
+
##
|
|
280
|
+
|
|
281
|
+
logger.setLevel(logging.CRITICAL)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
NO_VALUE = object()
|
|
285
|
+
|
|
286
|
+
T = TypeVar("T")
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def classify(seq: Iterable, key: Optional[Callable] = None, value: Optional[Callable] = None) -> Dict:
|
|
290
|
+
d: Dict[Any, Any] = {}
|
|
291
|
+
for item in seq:
|
|
292
|
+
k = key(item) if (key is not None) else item
|
|
293
|
+
v = value(item) if (value is not None) else item
|
|
294
|
+
try:
|
|
295
|
+
d[k].append(v)
|
|
296
|
+
except KeyError:
|
|
297
|
+
d[k] = [v]
|
|
298
|
+
return d
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def _deserialize(data: Any, namespace: Dict[str, Any], memo: Dict) -> Any:
|
|
302
|
+
if isinstance(data, dict):
|
|
303
|
+
if '__type__' in data: ##
|
|
304
|
+
|
|
305
|
+
class_ = namespace[data['__type__']]
|
|
306
|
+
return class_.deserialize(data, memo)
|
|
307
|
+
elif '@' in data:
|
|
308
|
+
return memo[data['@']]
|
|
309
|
+
return {key:_deserialize(value, namespace, memo) for key, value in data.items()}
|
|
310
|
+
elif isinstance(data, list):
|
|
311
|
+
return [_deserialize(value, namespace, memo) for value in data]
|
|
312
|
+
return data
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
_T = TypeVar("_T", bound="Serialize")
|
|
316
|
+
|
|
317
|
+
class Serialize:
|
|
318
|
+
#--
|
|
319
|
+
|
|
320
|
+
def memo_serialize(self, types_to_memoize: List) -> Any:
|
|
321
|
+
memo = SerializeMemoizer(types_to_memoize)
|
|
322
|
+
return self.serialize(memo), memo.serialize()
|
|
323
|
+
|
|
324
|
+
def serialize(self, memo = None) -> Dict[str, Any]:
|
|
325
|
+
if memo and memo.in_types(self):
|
|
326
|
+
return {'@': memo.memoized.get(self)}
|
|
327
|
+
|
|
328
|
+
fields = getattr(self, '__serialize_fields__')
|
|
329
|
+
res = {f: _serialize(getattr(self, f), memo) for f in fields}
|
|
330
|
+
res['__type__'] = type(self).__name__
|
|
331
|
+
if hasattr(self, '_serialize'):
|
|
332
|
+
self._serialize(res, memo)
|
|
333
|
+
return res
|
|
334
|
+
|
|
335
|
+
@classmethod
|
|
336
|
+
def deserialize(cls: Type[_T], data: Dict[str, Any], memo: Dict[int, Any]) -> _T:
|
|
337
|
+
namespace = getattr(cls, '__serialize_namespace__', [])
|
|
338
|
+
namespace = {c.__name__:c for c in namespace}
|
|
339
|
+
|
|
340
|
+
fields = getattr(cls, '__serialize_fields__')
|
|
341
|
+
|
|
342
|
+
if '@' in data:
|
|
343
|
+
return memo[data['@']]
|
|
344
|
+
|
|
345
|
+
inst = cls.__new__(cls)
|
|
346
|
+
for f in fields:
|
|
347
|
+
try:
|
|
348
|
+
setattr(inst, f, _deserialize(data[f], namespace, memo))
|
|
349
|
+
except KeyError as e:
|
|
350
|
+
raise KeyError("Cannot find key for class", cls, e)
|
|
351
|
+
|
|
352
|
+
if hasattr(inst, '_deserialize'):
|
|
353
|
+
inst._deserialize()
|
|
354
|
+
|
|
355
|
+
return inst
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
class SerializeMemoizer(Serialize):
|
|
359
|
+
#--
|
|
360
|
+
|
|
361
|
+
__serialize_fields__ = 'memoized',
|
|
362
|
+
|
|
363
|
+
def __init__(self, types_to_memoize: List) -> None:
|
|
364
|
+
self.types_to_memoize = tuple(types_to_memoize)
|
|
365
|
+
self.memoized = Enumerator()
|
|
366
|
+
|
|
367
|
+
def in_types(self, value: Serialize) -> bool:
|
|
368
|
+
return isinstance(value, self.types_to_memoize)
|
|
369
|
+
|
|
370
|
+
def serialize(self) -> Dict[int, Any]: ##
|
|
371
|
+
|
|
372
|
+
return _serialize(self.memoized.reversed(), None)
|
|
373
|
+
|
|
374
|
+
@classmethod
|
|
375
|
+
def deserialize(cls, data: Dict[int, Any], namespace: Dict[str, Any], memo: Dict[Any, Any]) -> Dict[int, Any]: ##
|
|
376
|
+
|
|
377
|
+
return _deserialize(data, namespace, memo)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
try:
|
|
381
|
+
import regex
|
|
382
|
+
_has_regex = True
|
|
383
|
+
except ImportError:
|
|
384
|
+
_has_regex = False
|
|
385
|
+
|
|
386
|
+
if sys.version_info >= (3, 11):
|
|
387
|
+
import re._parser as sre_parse
|
|
388
|
+
import re._constants as sre_constants
|
|
389
|
+
else:
|
|
390
|
+
import sre_parse
|
|
391
|
+
import sre_constants
|
|
392
|
+
|
|
393
|
+
categ_pattern = re.compile(r'\\p{[A-Za-z_]+}')
|
|
394
|
+
|
|
395
|
+
def get_regexp_width(expr: str) -> Union[Tuple[int, int], List[int]]:
|
|
396
|
+
if _has_regex:
|
|
397
|
+
##
|
|
398
|
+
|
|
399
|
+
##
|
|
400
|
+
|
|
401
|
+
##
|
|
402
|
+
|
|
403
|
+
regexp_final = re.sub(categ_pattern, 'A', expr)
|
|
404
|
+
else:
|
|
405
|
+
if re.search(categ_pattern, expr):
|
|
406
|
+
raise ImportError('`regex` module must be installed in order to use Unicode categories.', expr)
|
|
407
|
+
regexp_final = expr
|
|
408
|
+
try:
|
|
409
|
+
##
|
|
410
|
+
|
|
411
|
+
return [int(x) for x in sre_parse.parse(regexp_final).getwidth()]
|
|
412
|
+
except sre_constants.error:
|
|
413
|
+
if not _has_regex:
|
|
414
|
+
raise ValueError(expr)
|
|
415
|
+
else:
|
|
416
|
+
##
|
|
417
|
+
|
|
418
|
+
##
|
|
419
|
+
|
|
420
|
+
c = regex.compile(regexp_final)
|
|
421
|
+
##
|
|
422
|
+
|
|
423
|
+
##
|
|
424
|
+
|
|
425
|
+
MAXWIDTH = getattr(sre_parse, "MAXWIDTH", sre_constants.MAXREPEAT)
|
|
426
|
+
if c.match('') is None:
|
|
427
|
+
##
|
|
428
|
+
|
|
429
|
+
return 1, int(MAXWIDTH)
|
|
430
|
+
else:
|
|
431
|
+
return 0, int(MAXWIDTH)
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
class Meta:
|
|
436
|
+
|
|
437
|
+
empty: bool
|
|
438
|
+
line: int
|
|
439
|
+
column: int
|
|
440
|
+
start_pos: int
|
|
441
|
+
end_line: int
|
|
442
|
+
end_column: int
|
|
443
|
+
end_pos: int
|
|
444
|
+
orig_expansion: 'List[TerminalDef]'
|
|
445
|
+
match_tree: bool
|
|
446
|
+
|
|
447
|
+
def __init__(self):
|
|
448
|
+
self.empty = True
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
_Leaf_T = TypeVar("_Leaf_T")
|
|
452
|
+
Branch = Union[_Leaf_T, 'Tree[_Leaf_T]']
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
class Tree(Generic[_Leaf_T]):
|
|
456
|
+
#--
|
|
457
|
+
|
|
458
|
+
data: str
|
|
459
|
+
children: 'List[Branch[_Leaf_T]]'
|
|
460
|
+
|
|
461
|
+
def __init__(self, data: str, children: 'List[Branch[_Leaf_T]]', meta: Optional[Meta]=None) -> None:
|
|
462
|
+
self.data = data
|
|
463
|
+
self.children = children
|
|
464
|
+
self._meta = meta
|
|
465
|
+
|
|
466
|
+
@property
|
|
467
|
+
def meta(self) -> Meta:
|
|
468
|
+
if self._meta is None:
|
|
469
|
+
self._meta = Meta()
|
|
470
|
+
return self._meta
|
|
471
|
+
|
|
472
|
+
def __repr__(self):
|
|
473
|
+
return 'Tree(%r, %r)' % (self.data, self.children)
|
|
474
|
+
|
|
475
|
+
def _pretty_label(self):
|
|
476
|
+
return self.data
|
|
477
|
+
|
|
478
|
+
def _pretty(self, level, indent_str):
|
|
479
|
+
yield f'{indent_str*level}{self._pretty_label()}'
|
|
480
|
+
if len(self.children) == 1 and not isinstance(self.children[0], Tree):
|
|
481
|
+
yield f'\t{self.children[0]}\n'
|
|
482
|
+
else:
|
|
483
|
+
yield '\n'
|
|
484
|
+
for n in self.children:
|
|
485
|
+
if isinstance(n, Tree):
|
|
486
|
+
yield from n._pretty(level+1, indent_str)
|
|
487
|
+
else:
|
|
488
|
+
yield f'{indent_str*(level+1)}{n}\n'
|
|
489
|
+
|
|
490
|
+
def pretty(self, indent_str: str=' ') -> str:
|
|
491
|
+
#--
|
|
492
|
+
return ''.join(self._pretty(0, indent_str))
|
|
493
|
+
|
|
494
|
+
def __rich__(self, parent:Optional['rich.tree.Tree']=None) -> 'rich.tree.Tree':
|
|
495
|
+
#--
|
|
496
|
+
return self._rich(parent)
|
|
497
|
+
|
|
498
|
+
def _rich(self, parent):
|
|
499
|
+
if parent:
|
|
500
|
+
tree = parent.add(f'[bold]{self.data}[/bold]')
|
|
501
|
+
else:
|
|
502
|
+
import rich.tree
|
|
503
|
+
tree = rich.tree.Tree(self.data)
|
|
504
|
+
|
|
505
|
+
for c in self.children:
|
|
506
|
+
if isinstance(c, Tree):
|
|
507
|
+
c._rich(tree)
|
|
508
|
+
else:
|
|
509
|
+
tree.add(f'[green]{c}[/green]')
|
|
510
|
+
|
|
511
|
+
return tree
|
|
512
|
+
|
|
513
|
+
def __eq__(self, other):
|
|
514
|
+
try:
|
|
515
|
+
return self.data == other.data and self.children == other.children
|
|
516
|
+
except AttributeError:
|
|
517
|
+
return False
|
|
518
|
+
|
|
519
|
+
def __ne__(self, other):
|
|
520
|
+
return not (self == other)
|
|
521
|
+
|
|
522
|
+
def __hash__(self) -> int:
|
|
523
|
+
return hash((self.data, tuple(self.children)))
|
|
524
|
+
|
|
525
|
+
def iter_subtrees(self) -> 'Iterator[Tree[_Leaf_T]]':
|
|
526
|
+
#--
|
|
527
|
+
queue = [self]
|
|
528
|
+
subtrees = dict()
|
|
529
|
+
for subtree in queue:
|
|
530
|
+
subtrees[id(subtree)] = subtree
|
|
531
|
+
queue += [c for c in reversed(subtree.children)
|
|
532
|
+
if isinstance(c, Tree) and id(c) not in subtrees]
|
|
533
|
+
|
|
534
|
+
del queue
|
|
535
|
+
return reversed(list(subtrees.values()))
|
|
536
|
+
|
|
537
|
+
def iter_subtrees_topdown(self):
|
|
538
|
+
#--
|
|
539
|
+
stack = [self]
|
|
540
|
+
stack_append = stack.append
|
|
541
|
+
stack_pop = stack.pop
|
|
542
|
+
while stack:
|
|
543
|
+
node = stack_pop()
|
|
544
|
+
if not isinstance(node, Tree):
|
|
545
|
+
continue
|
|
546
|
+
yield node
|
|
547
|
+
for child in reversed(node.children):
|
|
548
|
+
stack_append(child)
|
|
549
|
+
|
|
550
|
+
def find_pred(self, pred: 'Callable[[Tree[_Leaf_T]], bool]') -> 'Iterator[Tree[_Leaf_T]]':
|
|
551
|
+
#--
|
|
552
|
+
return filter(pred, self.iter_subtrees())
|
|
553
|
+
|
|
554
|
+
def find_data(self, data: str) -> 'Iterator[Tree[_Leaf_T]]':
|
|
555
|
+
#--
|
|
556
|
+
return self.find_pred(lambda t: t.data == data)
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
from functools import wraps, update_wrapper
|
|
560
|
+
from inspect import getmembers, getmro
|
|
561
|
+
|
|
562
|
+
_Return_T = TypeVar('_Return_T')
|
|
563
|
+
_Return_V = TypeVar('_Return_V')
|
|
564
|
+
_Leaf_T = TypeVar('_Leaf_T')
|
|
565
|
+
_Leaf_U = TypeVar('_Leaf_U')
|
|
566
|
+
_R = TypeVar('_R')
|
|
567
|
+
_FUNC = Callable[..., _Return_T]
|
|
568
|
+
_DECORATED = Union[_FUNC, type]
|
|
569
|
+
|
|
570
|
+
class _DiscardType:
|
|
571
|
+
#--
|
|
572
|
+
|
|
573
|
+
def __repr__(self):
|
|
574
|
+
return "lark.visitors.Discard"
|
|
575
|
+
|
|
576
|
+
Discard = _DiscardType()
|
|
577
|
+
|
|
578
|
+
##
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
class _Decoratable:
|
|
582
|
+
#--
|
|
583
|
+
|
|
584
|
+
@classmethod
|
|
585
|
+
def _apply_v_args(cls, visit_wrapper):
|
|
586
|
+
mro = getmro(cls)
|
|
587
|
+
assert mro[0] is cls
|
|
588
|
+
libmembers = {name for _cls in mro[1:] for name, _ in getmembers(_cls)}
|
|
589
|
+
for name, value in getmembers(cls):
|
|
590
|
+
|
|
591
|
+
##
|
|
592
|
+
|
|
593
|
+
if name.startswith('_') or (name in libmembers and name not in cls.__dict__):
|
|
594
|
+
continue
|
|
595
|
+
if not callable(value):
|
|
596
|
+
continue
|
|
597
|
+
|
|
598
|
+
##
|
|
599
|
+
|
|
600
|
+
if isinstance(cls.__dict__[name], _VArgsWrapper):
|
|
601
|
+
continue
|
|
602
|
+
|
|
603
|
+
setattr(cls, name, _VArgsWrapper(cls.__dict__[name], visit_wrapper))
|
|
604
|
+
return cls
|
|
605
|
+
|
|
606
|
+
def __class_getitem__(cls, _):
|
|
607
|
+
return cls
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
class Transformer(_Decoratable, ABC, Generic[_Leaf_T, _Return_T]):
|
|
611
|
+
#--
|
|
612
|
+
__visit_tokens__ = True ##
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
def __init__(self, visit_tokens: bool=True) -> None:
|
|
616
|
+
self.__visit_tokens__ = visit_tokens
|
|
617
|
+
|
|
618
|
+
def _call_userfunc(self, tree, new_children=None):
|
|
619
|
+
##
|
|
620
|
+
|
|
621
|
+
children = new_children if new_children is not None else tree.children
|
|
622
|
+
try:
|
|
623
|
+
f = getattr(self, tree.data)
|
|
624
|
+
except AttributeError:
|
|
625
|
+
return self.__default__(tree.data, children, tree.meta)
|
|
626
|
+
else:
|
|
627
|
+
try:
|
|
628
|
+
wrapper = getattr(f, 'visit_wrapper', None)
|
|
629
|
+
if wrapper is not None:
|
|
630
|
+
return f.visit_wrapper(f, tree.data, children, tree.meta)
|
|
631
|
+
else:
|
|
632
|
+
return f(children)
|
|
633
|
+
except GrammarError:
|
|
634
|
+
raise
|
|
635
|
+
except Exception as e:
|
|
636
|
+
raise VisitError(tree.data, tree, e)
|
|
637
|
+
|
|
638
|
+
def _call_userfunc_token(self, token):
|
|
639
|
+
try:
|
|
640
|
+
f = getattr(self, token.type)
|
|
641
|
+
except AttributeError:
|
|
642
|
+
return self.__default_token__(token)
|
|
643
|
+
else:
|
|
644
|
+
try:
|
|
645
|
+
return f(token)
|
|
646
|
+
except GrammarError:
|
|
647
|
+
raise
|
|
648
|
+
except Exception as e:
|
|
649
|
+
raise VisitError(token.type, token, e)
|
|
650
|
+
|
|
651
|
+
def _transform_children(self, children):
|
|
652
|
+
for c in children:
|
|
653
|
+
if isinstance(c, Tree):
|
|
654
|
+
res = self._transform_tree(c)
|
|
655
|
+
elif self.__visit_tokens__ and isinstance(c, Token):
|
|
656
|
+
res = self._call_userfunc_token(c)
|
|
657
|
+
else:
|
|
658
|
+
res = c
|
|
659
|
+
|
|
660
|
+
if res is not Discard:
|
|
661
|
+
yield res
|
|
662
|
+
|
|
663
|
+
def _transform_tree(self, tree):
|
|
664
|
+
children = list(self._transform_children(tree.children))
|
|
665
|
+
return self._call_userfunc(tree, children)
|
|
666
|
+
|
|
667
|
+
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
668
|
+
#--
|
|
669
|
+
res = list(self._transform_children([tree]))
|
|
670
|
+
if not res:
|
|
671
|
+
return None ##
|
|
672
|
+
|
|
673
|
+
assert len(res) == 1
|
|
674
|
+
return res[0]
|
|
675
|
+
|
|
676
|
+
def __mul__(
|
|
677
|
+
self: 'Transformer[_Leaf_T, Tree[_Leaf_U]]',
|
|
678
|
+
other: 'Union[Transformer[_Leaf_U, _Return_V], TransformerChain[_Leaf_U, _Return_V,]]'
|
|
679
|
+
) -> 'TransformerChain[_Leaf_T, _Return_V]':
|
|
680
|
+
#--
|
|
681
|
+
return TransformerChain(self, other)
|
|
682
|
+
|
|
683
|
+
def __default__(self, data, children, meta):
|
|
684
|
+
#--
|
|
685
|
+
return Tree(data, children, meta)
|
|
686
|
+
|
|
687
|
+
def __default_token__(self, token):
|
|
688
|
+
#--
|
|
689
|
+
return token
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
def merge_transformers(base_transformer=None, **transformers_to_merge):
|
|
693
|
+
#--
|
|
694
|
+
if base_transformer is None:
|
|
695
|
+
base_transformer = Transformer()
|
|
696
|
+
for prefix, transformer in transformers_to_merge.items():
|
|
697
|
+
for method_name in dir(transformer):
|
|
698
|
+
method = getattr(transformer, method_name)
|
|
699
|
+
if not callable(method):
|
|
700
|
+
continue
|
|
701
|
+
if method_name.startswith("_") or method_name == "transform":
|
|
702
|
+
continue
|
|
703
|
+
prefixed_method = prefix + "__" + method_name
|
|
704
|
+
if hasattr(base_transformer, prefixed_method):
|
|
705
|
+
raise AttributeError("Cannot merge: method '%s' appears more than once" % prefixed_method)
|
|
706
|
+
|
|
707
|
+
setattr(base_transformer, prefixed_method, method)
|
|
708
|
+
|
|
709
|
+
return base_transformer
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
class InlineTransformer(Transformer): ##
|
|
713
|
+
|
|
714
|
+
def _call_userfunc(self, tree, new_children=None):
|
|
715
|
+
##
|
|
716
|
+
|
|
717
|
+
children = new_children if new_children is not None else tree.children
|
|
718
|
+
try:
|
|
719
|
+
f = getattr(self, tree.data)
|
|
720
|
+
except AttributeError:
|
|
721
|
+
return self.__default__(tree.data, children, tree.meta)
|
|
722
|
+
else:
|
|
723
|
+
return f(*children)
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
class TransformerChain(Generic[_Leaf_T, _Return_T]):
|
|
727
|
+
|
|
728
|
+
transformers: 'Tuple[Union[Transformer, TransformerChain], ...]'
|
|
729
|
+
|
|
730
|
+
def __init__(self, *transformers: 'Union[Transformer, TransformerChain]') -> None:
|
|
731
|
+
self.transformers = transformers
|
|
732
|
+
|
|
733
|
+
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
734
|
+
for t in self.transformers:
|
|
735
|
+
tree = t.transform(tree)
|
|
736
|
+
return cast(_Return_T, tree)
|
|
737
|
+
|
|
738
|
+
def __mul__(
|
|
739
|
+
self: 'TransformerChain[_Leaf_T, Tree[_Leaf_U]]',
|
|
740
|
+
other: 'Union[Transformer[_Leaf_U, _Return_V], TransformerChain[_Leaf_U, _Return_V]]'
|
|
741
|
+
) -> 'TransformerChain[_Leaf_T, _Return_V]':
|
|
742
|
+
return TransformerChain(*self.transformers + (other,))
|
|
743
|
+
|
|
744
|
+
|
|
745
|
+
class Transformer_InPlace(Transformer[_Leaf_T, _Return_T]):
|
|
746
|
+
#--
|
|
747
|
+
def _transform_tree(self, tree): ##
|
|
748
|
+
|
|
749
|
+
return self._call_userfunc(tree)
|
|
750
|
+
|
|
751
|
+
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
752
|
+
for subtree in tree.iter_subtrees():
|
|
753
|
+
subtree.children = list(self._transform_children(subtree.children))
|
|
754
|
+
|
|
755
|
+
return self._transform_tree(tree)
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
class Transformer_NonRecursive(Transformer[_Leaf_T, _Return_T]):
|
|
759
|
+
#--
|
|
760
|
+
|
|
761
|
+
def transform(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
762
|
+
##
|
|
763
|
+
|
|
764
|
+
rev_postfix = []
|
|
765
|
+
q: List[Branch[_Leaf_T]] = [tree]
|
|
766
|
+
while q:
|
|
767
|
+
t = q.pop()
|
|
768
|
+
rev_postfix.append(t)
|
|
769
|
+
if isinstance(t, Tree):
|
|
770
|
+
q += t.children
|
|
771
|
+
|
|
772
|
+
##
|
|
773
|
+
|
|
774
|
+
stack: List = []
|
|
775
|
+
for x in reversed(rev_postfix):
|
|
776
|
+
if isinstance(x, Tree):
|
|
777
|
+
size = len(x.children)
|
|
778
|
+
if size:
|
|
779
|
+
args = stack[-size:]
|
|
780
|
+
del stack[-size:]
|
|
781
|
+
else:
|
|
782
|
+
args = []
|
|
783
|
+
|
|
784
|
+
res = self._call_userfunc(x, args)
|
|
785
|
+
if res is not Discard:
|
|
786
|
+
stack.append(res)
|
|
787
|
+
|
|
788
|
+
elif self.__visit_tokens__ and isinstance(x, Token):
|
|
789
|
+
res = self._call_userfunc_token(x)
|
|
790
|
+
if res is not Discard:
|
|
791
|
+
stack.append(res)
|
|
792
|
+
else:
|
|
793
|
+
stack.append(x)
|
|
794
|
+
|
|
795
|
+
result, = stack ##
|
|
796
|
+
|
|
797
|
+
##
|
|
798
|
+
|
|
799
|
+
##
|
|
800
|
+
|
|
801
|
+
##
|
|
802
|
+
|
|
803
|
+
return cast(_Return_T, result)
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
class Transformer_InPlaceRecursive(Transformer):
|
|
807
|
+
#--
|
|
808
|
+
def _transform_tree(self, tree):
|
|
809
|
+
tree.children = list(self._transform_children(tree.children))
|
|
810
|
+
return self._call_userfunc(tree)
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
##
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
class VisitorBase:
|
|
817
|
+
def _call_userfunc(self, tree):
|
|
818
|
+
return getattr(self, tree.data, self.__default__)(tree)
|
|
819
|
+
|
|
820
|
+
def __default__(self, tree):
|
|
821
|
+
#--
|
|
822
|
+
return tree
|
|
823
|
+
|
|
824
|
+
def __class_getitem__(cls, _):
|
|
825
|
+
return cls
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
class Visitor(VisitorBase, ABC, Generic[_Leaf_T]):
|
|
829
|
+
#--
|
|
830
|
+
|
|
831
|
+
def visit(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
832
|
+
#--
|
|
833
|
+
for subtree in tree.iter_subtrees():
|
|
834
|
+
self._call_userfunc(subtree)
|
|
835
|
+
return tree
|
|
836
|
+
|
|
837
|
+
def visit_topdown(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
838
|
+
#--
|
|
839
|
+
for subtree in tree.iter_subtrees_topdown():
|
|
840
|
+
self._call_userfunc(subtree)
|
|
841
|
+
return tree
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
class Visitor_Recursive(VisitorBase, Generic[_Leaf_T]):
|
|
845
|
+
#--
|
|
846
|
+
|
|
847
|
+
def visit(self, tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
848
|
+
#--
|
|
849
|
+
for child in tree.children:
|
|
850
|
+
if isinstance(child, Tree):
|
|
851
|
+
self.visit(child)
|
|
852
|
+
|
|
853
|
+
self._call_userfunc(tree)
|
|
854
|
+
return tree
|
|
855
|
+
|
|
856
|
+
def visit_topdown(self,tree: Tree[_Leaf_T]) -> Tree[_Leaf_T]:
|
|
857
|
+
#--
|
|
858
|
+
self._call_userfunc(tree)
|
|
859
|
+
|
|
860
|
+
for child in tree.children:
|
|
861
|
+
if isinstance(child, Tree):
|
|
862
|
+
self.visit_topdown(child)
|
|
863
|
+
|
|
864
|
+
return tree
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
class Interpreter(_Decoratable, ABC, Generic[_Leaf_T, _Return_T]):
|
|
868
|
+
#--
|
|
869
|
+
|
|
870
|
+
def visit(self, tree: Tree[_Leaf_T]) -> _Return_T:
|
|
871
|
+
##
|
|
872
|
+
|
|
873
|
+
##
|
|
874
|
+
|
|
875
|
+
##
|
|
876
|
+
|
|
877
|
+
return self._visit_tree(tree)
|
|
878
|
+
|
|
879
|
+
def _visit_tree(self, tree: Tree[_Leaf_T]):
|
|
880
|
+
f = getattr(self, tree.data)
|
|
881
|
+
wrapper = getattr(f, 'visit_wrapper', None)
|
|
882
|
+
if wrapper is not None:
|
|
883
|
+
return f.visit_wrapper(f, tree.data, tree.children, tree.meta)
|
|
884
|
+
else:
|
|
885
|
+
return f(tree)
|
|
886
|
+
|
|
887
|
+
def visit_children(self, tree: Tree[_Leaf_T]) -> List:
|
|
888
|
+
return [self._visit_tree(child) if isinstance(child, Tree) else child
|
|
889
|
+
for child in tree.children]
|
|
890
|
+
|
|
891
|
+
def __getattr__(self, name):
|
|
892
|
+
return self.__default__
|
|
893
|
+
|
|
894
|
+
def __default__(self, tree):
|
|
895
|
+
return self.visit_children(tree)
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
_InterMethod = Callable[[Type[Interpreter], _Return_T], _R]
|
|
899
|
+
|
|
900
|
+
def visit_children_decor(func: _InterMethod) -> _InterMethod:
|
|
901
|
+
#--
|
|
902
|
+
@wraps(func)
|
|
903
|
+
def inner(cls, tree):
|
|
904
|
+
values = cls.visit_children(tree)
|
|
905
|
+
return func(cls, values)
|
|
906
|
+
return inner
|
|
907
|
+
|
|
908
|
+
##
|
|
909
|
+
|
|
910
|
+
|
|
911
|
+
def _apply_v_args(obj, visit_wrapper):
|
|
912
|
+
try:
|
|
913
|
+
_apply = obj._apply_v_args
|
|
914
|
+
except AttributeError:
|
|
915
|
+
return _VArgsWrapper(obj, visit_wrapper)
|
|
916
|
+
else:
|
|
917
|
+
return _apply(visit_wrapper)
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
class _VArgsWrapper:
|
|
921
|
+
#--
|
|
922
|
+
base_func: Callable
|
|
923
|
+
|
|
924
|
+
def __init__(self, func: Callable, visit_wrapper: Callable[[Callable, str, list, Any], Any]):
|
|
925
|
+
if isinstance(func, _VArgsWrapper):
|
|
926
|
+
func = func.base_func
|
|
927
|
+
self.base_func = func
|
|
928
|
+
self.visit_wrapper = visit_wrapper
|
|
929
|
+
update_wrapper(self, func)
|
|
930
|
+
|
|
931
|
+
def __call__(self, *args, **kwargs):
|
|
932
|
+
return self.base_func(*args, **kwargs)
|
|
933
|
+
|
|
934
|
+
def __get__(self, instance, owner=None):
|
|
935
|
+
try:
|
|
936
|
+
##
|
|
937
|
+
|
|
938
|
+
##
|
|
939
|
+
|
|
940
|
+
g = type(self.base_func).__get__
|
|
941
|
+
except AttributeError:
|
|
942
|
+
return self
|
|
943
|
+
else:
|
|
944
|
+
return _VArgsWrapper(g(self.base_func, instance, owner), self.visit_wrapper)
|
|
945
|
+
|
|
946
|
+
def __set_name__(self, owner, name):
|
|
947
|
+
try:
|
|
948
|
+
f = type(self.base_func).__set_name__
|
|
949
|
+
except AttributeError:
|
|
950
|
+
return
|
|
951
|
+
else:
|
|
952
|
+
f(self.base_func, owner, name)
|
|
953
|
+
|
|
954
|
+
|
|
955
|
+
def _vargs_inline(f, _data, children, _meta):
|
|
956
|
+
return f(*children)
|
|
957
|
+
def _vargs_meta_inline(f, _data, children, meta):
|
|
958
|
+
return f(meta, *children)
|
|
959
|
+
def _vargs_meta(f, _data, children, meta):
|
|
960
|
+
return f(meta, children)
|
|
961
|
+
def _vargs_tree(f, data, children, meta):
|
|
962
|
+
return f(Tree(data, children, meta))
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
def v_args(inline: bool = False, meta: bool = False, tree: bool = False, wrapper: Optional[Callable] = None) -> Callable[[_DECORATED], _DECORATED]:
|
|
966
|
+
#--
|
|
967
|
+
if tree and (meta or inline):
|
|
968
|
+
raise ValueError("Visitor functions cannot combine 'tree' with 'meta' or 'inline'.")
|
|
969
|
+
|
|
970
|
+
func = None
|
|
971
|
+
if meta:
|
|
972
|
+
if inline:
|
|
973
|
+
func = _vargs_meta_inline
|
|
974
|
+
else:
|
|
975
|
+
func = _vargs_meta
|
|
976
|
+
elif inline:
|
|
977
|
+
func = _vargs_inline
|
|
978
|
+
elif tree:
|
|
979
|
+
func = _vargs_tree
|
|
980
|
+
|
|
981
|
+
if wrapper is not None:
|
|
982
|
+
if func is not None:
|
|
983
|
+
raise ValueError("Cannot use 'wrapper' along with 'tree', 'meta' or 'inline'.")
|
|
984
|
+
func = wrapper
|
|
985
|
+
|
|
986
|
+
def _visitor_args_dec(obj):
|
|
987
|
+
return _apply_v_args(obj, func)
|
|
988
|
+
return _visitor_args_dec
|
|
989
|
+
|
|
990
|
+
|
|
991
|
+
|
|
992
|
+
TOKEN_DEFAULT_PRIORITY = 0
|
|
993
|
+
|
|
994
|
+
|
|
995
|
+
class Symbol(Serialize):
|
|
996
|
+
__slots__ = ('name',)
|
|
997
|
+
|
|
998
|
+
name: str
|
|
999
|
+
is_term: ClassVar[bool] = NotImplemented
|
|
1000
|
+
|
|
1001
|
+
def __init__(self, name: str) -> None:
|
|
1002
|
+
self.name = name
|
|
1003
|
+
|
|
1004
|
+
def __eq__(self, other):
|
|
1005
|
+
assert isinstance(other, Symbol), other
|
|
1006
|
+
return self.is_term == other.is_term and self.name == other.name
|
|
1007
|
+
|
|
1008
|
+
def __ne__(self, other):
|
|
1009
|
+
return not (self == other)
|
|
1010
|
+
|
|
1011
|
+
def __hash__(self):
|
|
1012
|
+
return hash(self.name)
|
|
1013
|
+
|
|
1014
|
+
def __repr__(self):
|
|
1015
|
+
return '%s(%r)' % (type(self).__name__, self.name)
|
|
1016
|
+
|
|
1017
|
+
fullrepr = property(__repr__)
|
|
1018
|
+
|
|
1019
|
+
def renamed(self, f):
|
|
1020
|
+
return type(self)(f(self.name))
|
|
1021
|
+
|
|
1022
|
+
|
|
1023
|
+
class Terminal(Symbol):
|
|
1024
|
+
__serialize_fields__ = 'name', 'filter_out'
|
|
1025
|
+
|
|
1026
|
+
is_term: ClassVar[bool] = True
|
|
1027
|
+
|
|
1028
|
+
def __init__(self, name, filter_out=False):
|
|
1029
|
+
self.name = name
|
|
1030
|
+
self.filter_out = filter_out
|
|
1031
|
+
|
|
1032
|
+
@property
|
|
1033
|
+
def fullrepr(self):
|
|
1034
|
+
return '%s(%r, %r)' % (type(self).__name__, self.name, self.filter_out)
|
|
1035
|
+
|
|
1036
|
+
def renamed(self, f):
|
|
1037
|
+
return type(self)(f(self.name), self.filter_out)
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
class NonTerminal(Symbol):
|
|
1041
|
+
__serialize_fields__ = 'name',
|
|
1042
|
+
|
|
1043
|
+
is_term: ClassVar[bool] = False
|
|
1044
|
+
|
|
1045
|
+
|
|
1046
|
+
class RuleOptions(Serialize):
|
|
1047
|
+
__serialize_fields__ = 'keep_all_tokens', 'expand1', 'priority', 'template_source', 'empty_indices'
|
|
1048
|
+
|
|
1049
|
+
keep_all_tokens: bool
|
|
1050
|
+
expand1: bool
|
|
1051
|
+
priority: Optional[int]
|
|
1052
|
+
template_source: Optional[str]
|
|
1053
|
+
empty_indices: Tuple[bool, ...]
|
|
1054
|
+
|
|
1055
|
+
def __init__(self, keep_all_tokens: bool=False, expand1: bool=False, priority: Optional[int]=None, template_source: Optional[str]=None, empty_indices: Tuple[bool, ...]=()) -> None:
|
|
1056
|
+
self.keep_all_tokens = keep_all_tokens
|
|
1057
|
+
self.expand1 = expand1
|
|
1058
|
+
self.priority = priority
|
|
1059
|
+
self.template_source = template_source
|
|
1060
|
+
self.empty_indices = empty_indices
|
|
1061
|
+
|
|
1062
|
+
def __repr__(self):
|
|
1063
|
+
return 'RuleOptions(%r, %r, %r, %r)' % (
|
|
1064
|
+
self.keep_all_tokens,
|
|
1065
|
+
self.expand1,
|
|
1066
|
+
self.priority,
|
|
1067
|
+
self.template_source
|
|
1068
|
+
)
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
class Rule(Serialize):
|
|
1072
|
+
#--
|
|
1073
|
+
__slots__ = ('origin', 'expansion', 'alias', 'options', 'order', '_hash')
|
|
1074
|
+
|
|
1075
|
+
__serialize_fields__ = 'origin', 'expansion', 'order', 'alias', 'options'
|
|
1076
|
+
__serialize_namespace__ = Terminal, NonTerminal, RuleOptions
|
|
1077
|
+
|
|
1078
|
+
origin: NonTerminal
|
|
1079
|
+
expansion: Sequence[Symbol]
|
|
1080
|
+
order: int
|
|
1081
|
+
alias: Optional[str]
|
|
1082
|
+
options: RuleOptions
|
|
1083
|
+
_hash: int
|
|
1084
|
+
|
|
1085
|
+
def __init__(self, origin: NonTerminal, expansion: Sequence[Symbol],
|
|
1086
|
+
order: int=0, alias: Optional[str]=None, options: Optional[RuleOptions]=None):
|
|
1087
|
+
self.origin = origin
|
|
1088
|
+
self.expansion = expansion
|
|
1089
|
+
self.alias = alias
|
|
1090
|
+
self.order = order
|
|
1091
|
+
self.options = options or RuleOptions()
|
|
1092
|
+
self._hash = hash((self.origin, tuple(self.expansion)))
|
|
1093
|
+
|
|
1094
|
+
def _deserialize(self):
|
|
1095
|
+
self._hash = hash((self.origin, tuple(self.expansion)))
|
|
1096
|
+
|
|
1097
|
+
def __str__(self):
|
|
1098
|
+
return '<%s : %s>' % (self.origin.name, ' '.join(x.name for x in self.expansion))
|
|
1099
|
+
|
|
1100
|
+
def __repr__(self):
|
|
1101
|
+
return 'Rule(%r, %r, %r, %r)' % (self.origin, self.expansion, self.alias, self.options)
|
|
1102
|
+
|
|
1103
|
+
def __hash__(self):
|
|
1104
|
+
return self._hash
|
|
1105
|
+
|
|
1106
|
+
def __eq__(self, other):
|
|
1107
|
+
if not isinstance(other, Rule):
|
|
1108
|
+
return False
|
|
1109
|
+
return self.origin == other.origin and self.expansion == other.expansion
|
|
1110
|
+
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
from copy import copy
|
|
1114
|
+
|
|
1115
|
+
try: ##
|
|
1116
|
+
|
|
1117
|
+
has_interegular = bool(interegular)
|
|
1118
|
+
except NameError:
|
|
1119
|
+
has_interegular = False
|
|
1120
|
+
|
|
1121
|
+
class Pattern(Serialize, ABC):
|
|
1122
|
+
#--
|
|
1123
|
+
|
|
1124
|
+
value: str
|
|
1125
|
+
flags: Collection[str]
|
|
1126
|
+
raw: Optional[str]
|
|
1127
|
+
type: ClassVar[str]
|
|
1128
|
+
|
|
1129
|
+
def __init__(self, value: str, flags: Collection[str] = (), raw: Optional[str] = None) -> None:
|
|
1130
|
+
self.value = value
|
|
1131
|
+
self.flags = frozenset(flags)
|
|
1132
|
+
self.raw = raw
|
|
1133
|
+
|
|
1134
|
+
def __repr__(self):
|
|
1135
|
+
return repr(self.to_regexp())
|
|
1136
|
+
|
|
1137
|
+
##
|
|
1138
|
+
|
|
1139
|
+
def __hash__(self):
|
|
1140
|
+
return hash((type(self), self.value, self.flags))
|
|
1141
|
+
|
|
1142
|
+
def __eq__(self, other):
|
|
1143
|
+
return type(self) == type(other) and self.value == other.value and self.flags == other.flags
|
|
1144
|
+
|
|
1145
|
+
@abstractmethod
|
|
1146
|
+
def to_regexp(self) -> str:
|
|
1147
|
+
raise NotImplementedError()
|
|
1148
|
+
|
|
1149
|
+
@property
|
|
1150
|
+
@abstractmethod
|
|
1151
|
+
def min_width(self) -> int:
|
|
1152
|
+
raise NotImplementedError()
|
|
1153
|
+
|
|
1154
|
+
@property
|
|
1155
|
+
@abstractmethod
|
|
1156
|
+
def max_width(self) -> int:
|
|
1157
|
+
raise NotImplementedError()
|
|
1158
|
+
|
|
1159
|
+
def _get_flags(self, value):
|
|
1160
|
+
for f in self.flags:
|
|
1161
|
+
value = ('(?%s:%s)' % (f, value))
|
|
1162
|
+
return value
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
class PatternStr(Pattern):
|
|
1166
|
+
__serialize_fields__ = 'value', 'flags', 'raw'
|
|
1167
|
+
|
|
1168
|
+
type: ClassVar[str] = "str"
|
|
1169
|
+
|
|
1170
|
+
def to_regexp(self) -> str:
|
|
1171
|
+
return self._get_flags(re.escape(self.value))
|
|
1172
|
+
|
|
1173
|
+
@property
|
|
1174
|
+
def min_width(self) -> int:
|
|
1175
|
+
return len(self.value)
|
|
1176
|
+
|
|
1177
|
+
@property
|
|
1178
|
+
def max_width(self) -> int:
|
|
1179
|
+
return len(self.value)
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
class PatternRE(Pattern):
|
|
1183
|
+
__serialize_fields__ = 'value', 'flags', 'raw', '_width'
|
|
1184
|
+
|
|
1185
|
+
type: ClassVar[str] = "re"
|
|
1186
|
+
|
|
1187
|
+
def to_regexp(self) -> str:
|
|
1188
|
+
return self._get_flags(self.value)
|
|
1189
|
+
|
|
1190
|
+
_width = None
|
|
1191
|
+
def _get_width(self):
|
|
1192
|
+
if self._width is None:
|
|
1193
|
+
self._width = get_regexp_width(self.to_regexp())
|
|
1194
|
+
return self._width
|
|
1195
|
+
|
|
1196
|
+
@property
|
|
1197
|
+
def min_width(self) -> int:
|
|
1198
|
+
return self._get_width()[0]
|
|
1199
|
+
|
|
1200
|
+
@property
|
|
1201
|
+
def max_width(self) -> int:
|
|
1202
|
+
return self._get_width()[1]
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
class TerminalDef(Serialize):
|
|
1206
|
+
#--
|
|
1207
|
+
__serialize_fields__ = 'name', 'pattern', 'priority'
|
|
1208
|
+
__serialize_namespace__ = PatternStr, PatternRE
|
|
1209
|
+
|
|
1210
|
+
name: str
|
|
1211
|
+
pattern: Pattern
|
|
1212
|
+
priority: int
|
|
1213
|
+
|
|
1214
|
+
def __init__(self, name: str, pattern: Pattern, priority: int = TOKEN_DEFAULT_PRIORITY) -> None:
|
|
1215
|
+
assert isinstance(pattern, Pattern), pattern
|
|
1216
|
+
self.name = name
|
|
1217
|
+
self.pattern = pattern
|
|
1218
|
+
self.priority = priority
|
|
1219
|
+
|
|
1220
|
+
def __repr__(self):
|
|
1221
|
+
return '%s(%r, %r)' % (type(self).__name__, self.name, self.pattern)
|
|
1222
|
+
|
|
1223
|
+
def user_repr(self) -> str:
|
|
1224
|
+
if self.name.startswith('__'): ##
|
|
1225
|
+
|
|
1226
|
+
return self.pattern.raw or self.name
|
|
1227
|
+
else:
|
|
1228
|
+
return self.name
|
|
1229
|
+
|
|
1230
|
+
_T = TypeVar('_T', bound="Token")
|
|
1231
|
+
|
|
1232
|
+
class Token(str):
|
|
1233
|
+
#--
|
|
1234
|
+
__slots__ = ('type', 'start_pos', 'value', 'line', 'column', 'end_line', 'end_column', 'end_pos')
|
|
1235
|
+
|
|
1236
|
+
__match_args__ = ('type', 'value')
|
|
1237
|
+
|
|
1238
|
+
type: str
|
|
1239
|
+
start_pos: Optional[int]
|
|
1240
|
+
value: Any
|
|
1241
|
+
line: Optional[int]
|
|
1242
|
+
column: Optional[int]
|
|
1243
|
+
end_line: Optional[int]
|
|
1244
|
+
end_column: Optional[int]
|
|
1245
|
+
end_pos: Optional[int]
|
|
1246
|
+
|
|
1247
|
+
|
|
1248
|
+
@overload
|
|
1249
|
+
def __new__(
|
|
1250
|
+
cls,
|
|
1251
|
+
type: str,
|
|
1252
|
+
value: Any,
|
|
1253
|
+
start_pos: Optional[int] = None,
|
|
1254
|
+
line: Optional[int] = None,
|
|
1255
|
+
column: Optional[int] = None,
|
|
1256
|
+
end_line: Optional[int] = None,
|
|
1257
|
+
end_column: Optional[int] = None,
|
|
1258
|
+
end_pos: Optional[int] = None
|
|
1259
|
+
) -> 'Token':
|
|
1260
|
+
...
|
|
1261
|
+
|
|
1262
|
+
@overload
|
|
1263
|
+
def __new__(
|
|
1264
|
+
cls,
|
|
1265
|
+
type_: str,
|
|
1266
|
+
value: Any,
|
|
1267
|
+
start_pos: Optional[int] = None,
|
|
1268
|
+
line: Optional[int] = None,
|
|
1269
|
+
column: Optional[int] = None,
|
|
1270
|
+
end_line: Optional[int] = None,
|
|
1271
|
+
end_column: Optional[int] = None,
|
|
1272
|
+
end_pos: Optional[int] = None
|
|
1273
|
+
) -> 'Token': ...
|
|
1274
|
+
|
|
1275
|
+
def __new__(cls, *args, **kwargs):
|
|
1276
|
+
if "type_" in kwargs:
|
|
1277
|
+
warnings.warn("`type_` is deprecated use `type` instead", DeprecationWarning)
|
|
1278
|
+
|
|
1279
|
+
if "type" in kwargs:
|
|
1280
|
+
raise TypeError("Error: using both 'type' and the deprecated 'type_' as arguments.")
|
|
1281
|
+
kwargs["type"] = kwargs.pop("type_")
|
|
1282
|
+
|
|
1283
|
+
return cls._future_new(*args, **kwargs)
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
@classmethod
|
|
1287
|
+
def _future_new(cls, type, value, start_pos=None, line=None, column=None, end_line=None, end_column=None, end_pos=None):
|
|
1288
|
+
inst = super(Token, cls).__new__(cls, value)
|
|
1289
|
+
|
|
1290
|
+
inst.type = type
|
|
1291
|
+
inst.start_pos = start_pos
|
|
1292
|
+
inst.value = value
|
|
1293
|
+
inst.line = line
|
|
1294
|
+
inst.column = column
|
|
1295
|
+
inst.end_line = end_line
|
|
1296
|
+
inst.end_column = end_column
|
|
1297
|
+
inst.end_pos = end_pos
|
|
1298
|
+
return inst
|
|
1299
|
+
|
|
1300
|
+
@overload
|
|
1301
|
+
def update(self, type: Optional[str] = None, value: Optional[Any] = None) -> 'Token':
|
|
1302
|
+
...
|
|
1303
|
+
|
|
1304
|
+
@overload
|
|
1305
|
+
def update(self, type_: Optional[str] = None, value: Optional[Any] = None) -> 'Token':
|
|
1306
|
+
...
|
|
1307
|
+
|
|
1308
|
+
def update(self, *args, **kwargs):
|
|
1309
|
+
if "type_" in kwargs:
|
|
1310
|
+
warnings.warn("`type_` is deprecated use `type` instead", DeprecationWarning)
|
|
1311
|
+
|
|
1312
|
+
if "type" in kwargs:
|
|
1313
|
+
raise TypeError("Error: using both 'type' and the deprecated 'type_' as arguments.")
|
|
1314
|
+
kwargs["type"] = kwargs.pop("type_")
|
|
1315
|
+
|
|
1316
|
+
return self._future_update(*args, **kwargs)
|
|
1317
|
+
|
|
1318
|
+
def _future_update(self, type: Optional[str] = None, value: Optional[Any] = None) -> 'Token':
|
|
1319
|
+
return Token.new_borrow_pos(
|
|
1320
|
+
type if type is not None else self.type,
|
|
1321
|
+
value if value is not None else self.value,
|
|
1322
|
+
self
|
|
1323
|
+
)
|
|
1324
|
+
|
|
1325
|
+
@classmethod
|
|
1326
|
+
def new_borrow_pos(cls: Type[_T], type_: str, value: Any, borrow_t: 'Token') -> _T:
|
|
1327
|
+
return cls(type_, value, borrow_t.start_pos, borrow_t.line, borrow_t.column, borrow_t.end_line, borrow_t.end_column, borrow_t.end_pos)
|
|
1328
|
+
|
|
1329
|
+
def __reduce__(self):
|
|
1330
|
+
return (self.__class__, (self.type, self.value, self.start_pos, self.line, self.column))
|
|
1331
|
+
|
|
1332
|
+
def __repr__(self):
|
|
1333
|
+
return 'Token(%r, %r)' % (self.type, self.value)
|
|
1334
|
+
|
|
1335
|
+
def __deepcopy__(self, memo):
|
|
1336
|
+
return Token(self.type, self.value, self.start_pos, self.line, self.column)
|
|
1337
|
+
|
|
1338
|
+
def __eq__(self, other):
|
|
1339
|
+
if isinstance(other, Token) and self.type != other.type:
|
|
1340
|
+
return False
|
|
1341
|
+
|
|
1342
|
+
return str.__eq__(self, other)
|
|
1343
|
+
|
|
1344
|
+
__hash__ = str.__hash__
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
class LineCounter:
|
|
1348
|
+
#--
|
|
1349
|
+
|
|
1350
|
+
__slots__ = 'char_pos', 'line', 'column', 'line_start_pos', 'newline_char'
|
|
1351
|
+
|
|
1352
|
+
def __init__(self, newline_char):
|
|
1353
|
+
self.newline_char = newline_char
|
|
1354
|
+
self.char_pos = 0
|
|
1355
|
+
self.line = 1
|
|
1356
|
+
self.column = 1
|
|
1357
|
+
self.line_start_pos = 0
|
|
1358
|
+
|
|
1359
|
+
def __eq__(self, other):
|
|
1360
|
+
if not isinstance(other, LineCounter):
|
|
1361
|
+
return NotImplemented
|
|
1362
|
+
|
|
1363
|
+
return self.char_pos == other.char_pos and self.newline_char == other.newline_char
|
|
1364
|
+
|
|
1365
|
+
def feed(self, token: Token, test_newline=True):
|
|
1366
|
+
#--
|
|
1367
|
+
if test_newline:
|
|
1368
|
+
newlines = token.count(self.newline_char)
|
|
1369
|
+
if newlines:
|
|
1370
|
+
self.line += newlines
|
|
1371
|
+
self.line_start_pos = self.char_pos + token.rindex(self.newline_char) + 1
|
|
1372
|
+
|
|
1373
|
+
self.char_pos += len(token)
|
|
1374
|
+
self.column = self.char_pos - self.line_start_pos + 1
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
class UnlessCallback:
|
|
1378
|
+
def __init__(self, scanner):
|
|
1379
|
+
self.scanner = scanner
|
|
1380
|
+
|
|
1381
|
+
def __call__(self, t):
|
|
1382
|
+
res = self.scanner.match(t.value, 0)
|
|
1383
|
+
if res:
|
|
1384
|
+
_value, t.type = res
|
|
1385
|
+
return t
|
|
1386
|
+
|
|
1387
|
+
|
|
1388
|
+
class CallChain:
|
|
1389
|
+
def __init__(self, callback1, callback2, cond):
|
|
1390
|
+
self.callback1 = callback1
|
|
1391
|
+
self.callback2 = callback2
|
|
1392
|
+
self.cond = cond
|
|
1393
|
+
|
|
1394
|
+
def __call__(self, t):
|
|
1395
|
+
t2 = self.callback1(t)
|
|
1396
|
+
return self.callback2(t) if self.cond(t2) else t2
|
|
1397
|
+
|
|
1398
|
+
|
|
1399
|
+
def _get_match(re_, regexp, s, flags):
|
|
1400
|
+
m = re_.match(regexp, s, flags)
|
|
1401
|
+
if m:
|
|
1402
|
+
return m.group(0)
|
|
1403
|
+
|
|
1404
|
+
def _create_unless(terminals, g_regex_flags, re_, use_bytes):
|
|
1405
|
+
tokens_by_type = classify(terminals, lambda t: type(t.pattern))
|
|
1406
|
+
assert len(tokens_by_type) <= 2, tokens_by_type.keys()
|
|
1407
|
+
embedded_strs = set()
|
|
1408
|
+
callback = {}
|
|
1409
|
+
for retok in tokens_by_type.get(PatternRE, []):
|
|
1410
|
+
unless = []
|
|
1411
|
+
for strtok in tokens_by_type.get(PatternStr, []):
|
|
1412
|
+
if strtok.priority != retok.priority:
|
|
1413
|
+
continue
|
|
1414
|
+
s = strtok.pattern.value
|
|
1415
|
+
if s == _get_match(re_, retok.pattern.to_regexp(), s, g_regex_flags):
|
|
1416
|
+
unless.append(strtok)
|
|
1417
|
+
if strtok.pattern.flags <= retok.pattern.flags:
|
|
1418
|
+
embedded_strs.add(strtok)
|
|
1419
|
+
if unless:
|
|
1420
|
+
callback[retok.name] = UnlessCallback(Scanner(unless, g_regex_flags, re_, match_whole=True, use_bytes=use_bytes))
|
|
1421
|
+
|
|
1422
|
+
new_terminals = [t for t in terminals if t not in embedded_strs]
|
|
1423
|
+
return new_terminals, callback
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
class Scanner:
|
|
1427
|
+
def __init__(self, terminals, g_regex_flags, re_, use_bytes, match_whole=False):
|
|
1428
|
+
self.terminals = terminals
|
|
1429
|
+
self.g_regex_flags = g_regex_flags
|
|
1430
|
+
self.re_ = re_
|
|
1431
|
+
self.use_bytes = use_bytes
|
|
1432
|
+
self.match_whole = match_whole
|
|
1433
|
+
|
|
1434
|
+
self.allowed_types = {t.name for t in self.terminals}
|
|
1435
|
+
|
|
1436
|
+
self._mres = self._build_mres(terminals, len(terminals))
|
|
1437
|
+
|
|
1438
|
+
def _build_mres(self, terminals, max_size):
|
|
1439
|
+
##
|
|
1440
|
+
|
|
1441
|
+
##
|
|
1442
|
+
|
|
1443
|
+
##
|
|
1444
|
+
|
|
1445
|
+
postfix = '$' if self.match_whole else ''
|
|
1446
|
+
mres = []
|
|
1447
|
+
while terminals:
|
|
1448
|
+
pattern = u'|'.join(u'(?P<%s>%s)' % (t.name, t.pattern.to_regexp() + postfix) for t in terminals[:max_size])
|
|
1449
|
+
if self.use_bytes:
|
|
1450
|
+
pattern = pattern.encode('latin-1')
|
|
1451
|
+
try:
|
|
1452
|
+
mre = self.re_.compile(pattern, self.g_regex_flags)
|
|
1453
|
+
except AssertionError: ##
|
|
1454
|
+
|
|
1455
|
+
return self._build_mres(terminals, max_size // 2)
|
|
1456
|
+
|
|
1457
|
+
mres.append(mre)
|
|
1458
|
+
terminals = terminals[max_size:]
|
|
1459
|
+
return mres
|
|
1460
|
+
|
|
1461
|
+
def match(self, text, pos):
|
|
1462
|
+
for mre in self._mres:
|
|
1463
|
+
m = mre.match(text, pos)
|
|
1464
|
+
if m:
|
|
1465
|
+
return m.group(0), m.lastgroup
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
def _regexp_has_newline(r: str):
|
|
1469
|
+
#--
|
|
1470
|
+
return '\n' in r or '\\n' in r or '\\s' in r or '[^' in r or ('(?s' in r and '.' in r)
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
class LexerState:
|
|
1474
|
+
#--
|
|
1475
|
+
|
|
1476
|
+
__slots__ = 'text', 'line_ctr', 'last_token'
|
|
1477
|
+
|
|
1478
|
+
text: str
|
|
1479
|
+
line_ctr: LineCounter
|
|
1480
|
+
last_token: Optional[Token]
|
|
1481
|
+
|
|
1482
|
+
def __init__(self, text: str, line_ctr: Optional[LineCounter]=None, last_token: Optional[Token]=None):
|
|
1483
|
+
self.text = text
|
|
1484
|
+
self.line_ctr = line_ctr or LineCounter(b'\n' if isinstance(text, bytes) else '\n')
|
|
1485
|
+
self.last_token = last_token
|
|
1486
|
+
|
|
1487
|
+
def __eq__(self, other):
|
|
1488
|
+
if not isinstance(other, LexerState):
|
|
1489
|
+
return NotImplemented
|
|
1490
|
+
|
|
1491
|
+
return self.text is other.text and self.line_ctr == other.line_ctr and self.last_token == other.last_token
|
|
1492
|
+
|
|
1493
|
+
def __copy__(self):
|
|
1494
|
+
return type(self)(self.text, copy(self.line_ctr), self.last_token)
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
class LexerThread:
|
|
1498
|
+
#--
|
|
1499
|
+
|
|
1500
|
+
def __init__(self, lexer: 'Lexer', lexer_state: LexerState):
|
|
1501
|
+
self.lexer = lexer
|
|
1502
|
+
self.state = lexer_state
|
|
1503
|
+
|
|
1504
|
+
@classmethod
|
|
1505
|
+
def from_text(cls, lexer: 'Lexer', text: str) -> 'LexerThread':
|
|
1506
|
+
return cls(lexer, LexerState(text))
|
|
1507
|
+
|
|
1508
|
+
def lex(self, parser_state):
|
|
1509
|
+
return self.lexer.lex(self.state, parser_state)
|
|
1510
|
+
|
|
1511
|
+
def __copy__(self):
|
|
1512
|
+
return type(self)(self.lexer, copy(self.state))
|
|
1513
|
+
|
|
1514
|
+
_Token = Token
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
_Callback = Callable[[Token], Token]
|
|
1518
|
+
|
|
1519
|
+
class Lexer(ABC):
|
|
1520
|
+
#--
|
|
1521
|
+
@abstractmethod
|
|
1522
|
+
def lex(self, lexer_state: LexerState, parser_state: Any) -> Iterator[Token]:
|
|
1523
|
+
return NotImplemented
|
|
1524
|
+
|
|
1525
|
+
def make_lexer_state(self, text):
|
|
1526
|
+
#--
|
|
1527
|
+
return LexerState(text)
|
|
1528
|
+
|
|
1529
|
+
|
|
1530
|
+
def _check_regex_collisions(terminal_to_regexp: Dict[TerminalDef, str], comparator, strict_mode, max_collisions_to_show=8):
|
|
1531
|
+
if not comparator:
|
|
1532
|
+
comparator = interegular.Comparator.from_regexes(terminal_to_regexp)
|
|
1533
|
+
|
|
1534
|
+
##
|
|
1535
|
+
|
|
1536
|
+
##
|
|
1537
|
+
|
|
1538
|
+
max_time = 2 if strict_mode else 0.2
|
|
1539
|
+
|
|
1540
|
+
##
|
|
1541
|
+
|
|
1542
|
+
if comparator.count_marked_pairs() >= max_collisions_to_show:
|
|
1543
|
+
return
|
|
1544
|
+
for group in classify(terminal_to_regexp, lambda t: t.priority).values():
|
|
1545
|
+
for a, b in comparator.check(group, skip_marked=True):
|
|
1546
|
+
assert a.priority == b.priority
|
|
1547
|
+
##
|
|
1548
|
+
|
|
1549
|
+
comparator.mark(a, b)
|
|
1550
|
+
|
|
1551
|
+
##
|
|
1552
|
+
|
|
1553
|
+
message = f"Collision between Terminals {a.name} and {b.name}. "
|
|
1554
|
+
try:
|
|
1555
|
+
example = comparator.get_example_overlap(a, b, max_time).format_multiline()
|
|
1556
|
+
except ValueError:
|
|
1557
|
+
##
|
|
1558
|
+
|
|
1559
|
+
example = "No example could be found fast enough. However, the collision does still exists"
|
|
1560
|
+
if strict_mode:
|
|
1561
|
+
raise LexError(f"{message}\n{example}")
|
|
1562
|
+
logger.warning("%s The lexer will choose between them arbitrarily.\n%s", message, example)
|
|
1563
|
+
if comparator.count_marked_pairs() >= max_collisions_to_show:
|
|
1564
|
+
logger.warning("Found 8 regex collisions, will not check for more.")
|
|
1565
|
+
return
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
class AbstractBasicLexer(Lexer):
|
|
1569
|
+
terminals_by_name: Dict[str, TerminalDef]
|
|
1570
|
+
|
|
1571
|
+
@abstractmethod
|
|
1572
|
+
def __init__(self, conf: 'LexerConf', comparator=None) -> None:
|
|
1573
|
+
...
|
|
1574
|
+
|
|
1575
|
+
@abstractmethod
|
|
1576
|
+
def next_token(self, lex_state: LexerState, parser_state: Any = None) -> Token:
|
|
1577
|
+
...
|
|
1578
|
+
|
|
1579
|
+
def lex(self, state: LexerState, parser_state: Any) -> Iterator[Token]:
|
|
1580
|
+
with suppress(EOFError):
|
|
1581
|
+
while True:
|
|
1582
|
+
yield self.next_token(state, parser_state)
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
class BasicLexer(AbstractBasicLexer):
|
|
1586
|
+
terminals: Collection[TerminalDef]
|
|
1587
|
+
ignore_types: FrozenSet[str]
|
|
1588
|
+
newline_types: FrozenSet[str]
|
|
1589
|
+
user_callbacks: Dict[str, _Callback]
|
|
1590
|
+
callback: Dict[str, _Callback]
|
|
1591
|
+
re: ModuleType
|
|
1592
|
+
|
|
1593
|
+
def __init__(self, conf: 'LexerConf', comparator=None) -> None:
|
|
1594
|
+
terminals = list(conf.terminals)
|
|
1595
|
+
assert all(isinstance(t, TerminalDef) for t in terminals), terminals
|
|
1596
|
+
|
|
1597
|
+
self.re = conf.re_module
|
|
1598
|
+
|
|
1599
|
+
if not conf.skip_validation:
|
|
1600
|
+
##
|
|
1601
|
+
|
|
1602
|
+
terminal_to_regexp = {}
|
|
1603
|
+
for t in terminals:
|
|
1604
|
+
regexp = t.pattern.to_regexp()
|
|
1605
|
+
try:
|
|
1606
|
+
self.re.compile(regexp, conf.g_regex_flags)
|
|
1607
|
+
except self.re.error:
|
|
1608
|
+
raise LexError("Cannot compile token %s: %s" % (t.name, t.pattern))
|
|
1609
|
+
|
|
1610
|
+
if t.pattern.min_width == 0:
|
|
1611
|
+
raise LexError("Lexer does not allow zero-width terminals. (%s: %s)" % (t.name, t.pattern))
|
|
1612
|
+
if t.pattern.type == "re":
|
|
1613
|
+
terminal_to_regexp[t] = regexp
|
|
1614
|
+
|
|
1615
|
+
if not (set(conf.ignore) <= {t.name for t in terminals}):
|
|
1616
|
+
raise LexError("Ignore terminals are not defined: %s" % (set(conf.ignore) - {t.name for t in terminals}))
|
|
1617
|
+
|
|
1618
|
+
if has_interegular:
|
|
1619
|
+
_check_regex_collisions(terminal_to_regexp, comparator, conf.strict)
|
|
1620
|
+
elif conf.strict:
|
|
1621
|
+
raise LexError("interegular must be installed for strict mode. Use `pip install 'lark[interegular]'`.")
|
|
1622
|
+
|
|
1623
|
+
##
|
|
1624
|
+
|
|
1625
|
+
self.newline_types = frozenset(t.name for t in terminals if _regexp_has_newline(t.pattern.to_regexp()))
|
|
1626
|
+
self.ignore_types = frozenset(conf.ignore)
|
|
1627
|
+
|
|
1628
|
+
terminals.sort(key=lambda x: (-x.priority, -x.pattern.max_width, -len(x.pattern.value), x.name))
|
|
1629
|
+
self.terminals = terminals
|
|
1630
|
+
self.user_callbacks = conf.callbacks
|
|
1631
|
+
self.g_regex_flags = conf.g_regex_flags
|
|
1632
|
+
self.use_bytes = conf.use_bytes
|
|
1633
|
+
self.terminals_by_name = conf.terminals_by_name
|
|
1634
|
+
|
|
1635
|
+
self._scanner = None
|
|
1636
|
+
|
|
1637
|
+
def _build_scanner(self):
|
|
1638
|
+
terminals, self.callback = _create_unless(self.terminals, self.g_regex_flags, self.re, self.use_bytes)
|
|
1639
|
+
assert all(self.callback.values())
|
|
1640
|
+
|
|
1641
|
+
for type_, f in self.user_callbacks.items():
|
|
1642
|
+
if type_ in self.callback:
|
|
1643
|
+
##
|
|
1644
|
+
|
|
1645
|
+
self.callback[type_] = CallChain(self.callback[type_], f, lambda t: t.type == type_)
|
|
1646
|
+
else:
|
|
1647
|
+
self.callback[type_] = f
|
|
1648
|
+
|
|
1649
|
+
self._scanner = Scanner(terminals, self.g_regex_flags, self.re, self.use_bytes)
|
|
1650
|
+
|
|
1651
|
+
@property
|
|
1652
|
+
def scanner(self):
|
|
1653
|
+
if self._scanner is None:
|
|
1654
|
+
self._build_scanner()
|
|
1655
|
+
return self._scanner
|
|
1656
|
+
|
|
1657
|
+
def match(self, text, pos):
|
|
1658
|
+
return self.scanner.match(text, pos)
|
|
1659
|
+
|
|
1660
|
+
def next_token(self, lex_state: LexerState, parser_state: Any = None) -> Token:
|
|
1661
|
+
line_ctr = lex_state.line_ctr
|
|
1662
|
+
while line_ctr.char_pos < len(lex_state.text):
|
|
1663
|
+
res = self.match(lex_state.text, line_ctr.char_pos)
|
|
1664
|
+
if not res:
|
|
1665
|
+
allowed = self.scanner.allowed_types - self.ignore_types
|
|
1666
|
+
if not allowed:
|
|
1667
|
+
allowed = {"<END-OF-FILE>"}
|
|
1668
|
+
raise UnexpectedCharacters(lex_state.text, line_ctr.char_pos, line_ctr.line, line_ctr.column,
|
|
1669
|
+
allowed=allowed, token_history=lex_state.last_token and [lex_state.last_token],
|
|
1670
|
+
state=parser_state, terminals_by_name=self.terminals_by_name)
|
|
1671
|
+
|
|
1672
|
+
value, type_ = res
|
|
1673
|
+
|
|
1674
|
+
ignored = type_ in self.ignore_types
|
|
1675
|
+
t = None
|
|
1676
|
+
if not ignored or type_ in self.callback:
|
|
1677
|
+
t = Token(type_, value, line_ctr.char_pos, line_ctr.line, line_ctr.column)
|
|
1678
|
+
line_ctr.feed(value, type_ in self.newline_types)
|
|
1679
|
+
if t is not None:
|
|
1680
|
+
t.end_line = line_ctr.line
|
|
1681
|
+
t.end_column = line_ctr.column
|
|
1682
|
+
t.end_pos = line_ctr.char_pos
|
|
1683
|
+
if t.type in self.callback:
|
|
1684
|
+
t = self.callback[t.type](t)
|
|
1685
|
+
if not ignored:
|
|
1686
|
+
if not isinstance(t, Token):
|
|
1687
|
+
raise LexError("Callbacks must return a token (returned %r)" % t)
|
|
1688
|
+
lex_state.last_token = t
|
|
1689
|
+
return t
|
|
1690
|
+
|
|
1691
|
+
##
|
|
1692
|
+
|
|
1693
|
+
raise EOFError(self)
|
|
1694
|
+
|
|
1695
|
+
|
|
1696
|
+
class ContextualLexer(Lexer):
|
|
1697
|
+
lexers: Dict[int, AbstractBasicLexer]
|
|
1698
|
+
root_lexer: AbstractBasicLexer
|
|
1699
|
+
|
|
1700
|
+
BasicLexer: Type[AbstractBasicLexer] = BasicLexer
|
|
1701
|
+
|
|
1702
|
+
def __init__(self, conf: 'LexerConf', states: Dict[int, Collection[str]], always_accept: Collection[str]=()) -> None:
|
|
1703
|
+
terminals = list(conf.terminals)
|
|
1704
|
+
terminals_by_name = conf.terminals_by_name
|
|
1705
|
+
|
|
1706
|
+
trad_conf = copy(conf)
|
|
1707
|
+
trad_conf.terminals = terminals
|
|
1708
|
+
|
|
1709
|
+
if has_interegular and not conf.skip_validation:
|
|
1710
|
+
comparator = interegular.Comparator.from_regexes({t: t.pattern.to_regexp() for t in terminals})
|
|
1711
|
+
else:
|
|
1712
|
+
comparator = None
|
|
1713
|
+
lexer_by_tokens: Dict[FrozenSet[str], AbstractBasicLexer] = {}
|
|
1714
|
+
self.lexers = {}
|
|
1715
|
+
for state, accepts in states.items():
|
|
1716
|
+
key = frozenset(accepts)
|
|
1717
|
+
try:
|
|
1718
|
+
lexer = lexer_by_tokens[key]
|
|
1719
|
+
except KeyError:
|
|
1720
|
+
accepts = set(accepts) | set(conf.ignore) | set(always_accept)
|
|
1721
|
+
lexer_conf = copy(trad_conf)
|
|
1722
|
+
lexer_conf.terminals = [terminals_by_name[n] for n in accepts if n in terminals_by_name]
|
|
1723
|
+
lexer = self.BasicLexer(lexer_conf, comparator)
|
|
1724
|
+
lexer_by_tokens[key] = lexer
|
|
1725
|
+
|
|
1726
|
+
self.lexers[state] = lexer
|
|
1727
|
+
|
|
1728
|
+
assert trad_conf.terminals is terminals
|
|
1729
|
+
trad_conf.skip_validation = True ##
|
|
1730
|
+
|
|
1731
|
+
self.root_lexer = self.BasicLexer(trad_conf, comparator)
|
|
1732
|
+
|
|
1733
|
+
def lex(self, lexer_state: LexerState, parser_state: 'ParserState') -> Iterator[Token]:
|
|
1734
|
+
try:
|
|
1735
|
+
while True:
|
|
1736
|
+
lexer = self.lexers[parser_state.position]
|
|
1737
|
+
yield lexer.next_token(lexer_state, parser_state)
|
|
1738
|
+
except EOFError:
|
|
1739
|
+
pass
|
|
1740
|
+
except UnexpectedCharacters as e:
|
|
1741
|
+
##
|
|
1742
|
+
|
|
1743
|
+
##
|
|
1744
|
+
|
|
1745
|
+
try:
|
|
1746
|
+
last_token = lexer_state.last_token ##
|
|
1747
|
+
|
|
1748
|
+
token = self.root_lexer.next_token(lexer_state, parser_state)
|
|
1749
|
+
raise UnexpectedToken(token, e.allowed, state=parser_state, token_history=[last_token], terminals_by_name=self.root_lexer.terminals_by_name)
|
|
1750
|
+
except UnexpectedCharacters:
|
|
1751
|
+
raise e ##
|
|
1752
|
+
|
|
1753
|
+
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
_ParserArgType: 'TypeAlias' = 'Literal["earley", "lalr", "cyk", "auto"]'
|
|
1757
|
+
_LexerArgType: 'TypeAlias' = 'Union[Literal["auto", "basic", "contextual", "dynamic", "dynamic_complete"], Type[Lexer]]'
|
|
1758
|
+
_LexerCallback = Callable[[Token], Token]
|
|
1759
|
+
ParserCallbacks = Dict[str, Callable]
|
|
1760
|
+
|
|
1761
|
+
class LexerConf(Serialize):
|
|
1762
|
+
__serialize_fields__ = 'terminals', 'ignore', 'g_regex_flags', 'use_bytes', 'lexer_type'
|
|
1763
|
+
__serialize_namespace__ = TerminalDef,
|
|
1764
|
+
|
|
1765
|
+
terminals: Collection[TerminalDef]
|
|
1766
|
+
re_module: ModuleType
|
|
1767
|
+
ignore: Collection[str]
|
|
1768
|
+
postlex: 'Optional[PostLex]'
|
|
1769
|
+
callbacks: Dict[str, _LexerCallback]
|
|
1770
|
+
g_regex_flags: int
|
|
1771
|
+
skip_validation: bool
|
|
1772
|
+
use_bytes: bool
|
|
1773
|
+
lexer_type: Optional[_LexerArgType]
|
|
1774
|
+
strict: bool
|
|
1775
|
+
|
|
1776
|
+
def __init__(self, terminals: Collection[TerminalDef], re_module: ModuleType, ignore: Collection[str]=(), postlex: 'Optional[PostLex]'=None,
|
|
1777
|
+
callbacks: Optional[Dict[str, _LexerCallback]]=None, g_regex_flags: int=0, skip_validation: bool=False, use_bytes: bool=False, strict: bool=False):
|
|
1778
|
+
self.terminals = terminals
|
|
1779
|
+
self.terminals_by_name = {t.name: t for t in self.terminals}
|
|
1780
|
+
assert len(self.terminals) == len(self.terminals_by_name)
|
|
1781
|
+
self.ignore = ignore
|
|
1782
|
+
self.postlex = postlex
|
|
1783
|
+
self.callbacks = callbacks or {}
|
|
1784
|
+
self.g_regex_flags = g_regex_flags
|
|
1785
|
+
self.re_module = re_module
|
|
1786
|
+
self.skip_validation = skip_validation
|
|
1787
|
+
self.use_bytes = use_bytes
|
|
1788
|
+
self.strict = strict
|
|
1789
|
+
self.lexer_type = None
|
|
1790
|
+
|
|
1791
|
+
def _deserialize(self):
|
|
1792
|
+
self.terminals_by_name = {t.name: t for t in self.terminals}
|
|
1793
|
+
|
|
1794
|
+
def __deepcopy__(self, memo=None):
|
|
1795
|
+
return type(self)(
|
|
1796
|
+
deepcopy(self.terminals, memo),
|
|
1797
|
+
self.re_module,
|
|
1798
|
+
deepcopy(self.ignore, memo),
|
|
1799
|
+
deepcopy(self.postlex, memo),
|
|
1800
|
+
deepcopy(self.callbacks, memo),
|
|
1801
|
+
deepcopy(self.g_regex_flags, memo),
|
|
1802
|
+
deepcopy(self.skip_validation, memo),
|
|
1803
|
+
deepcopy(self.use_bytes, memo),
|
|
1804
|
+
)
|
|
1805
|
+
|
|
1806
|
+
class ParserConf(Serialize):
|
|
1807
|
+
__serialize_fields__ = 'rules', 'start', 'parser_type'
|
|
1808
|
+
|
|
1809
|
+
rules: List['Rule']
|
|
1810
|
+
callbacks: ParserCallbacks
|
|
1811
|
+
start: List[str]
|
|
1812
|
+
parser_type: _ParserArgType
|
|
1813
|
+
|
|
1814
|
+
def __init__(self, rules: List['Rule'], callbacks: ParserCallbacks, start: List[str]):
|
|
1815
|
+
assert isinstance(start, list)
|
|
1816
|
+
self.rules = rules
|
|
1817
|
+
self.callbacks = callbacks
|
|
1818
|
+
self.start = start
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
from functools import partial, wraps
|
|
1822
|
+
from itertools import product
|
|
1823
|
+
|
|
1824
|
+
|
|
1825
|
+
class ExpandSingleChild:
|
|
1826
|
+
def __init__(self, node_builder):
|
|
1827
|
+
self.node_builder = node_builder
|
|
1828
|
+
|
|
1829
|
+
def __call__(self, children):
|
|
1830
|
+
if len(children) == 1:
|
|
1831
|
+
return children[0]
|
|
1832
|
+
else:
|
|
1833
|
+
return self.node_builder(children)
|
|
1834
|
+
|
|
1835
|
+
|
|
1836
|
+
|
|
1837
|
+
class PropagatePositions:
|
|
1838
|
+
def __init__(self, node_builder, node_filter=None):
|
|
1839
|
+
self.node_builder = node_builder
|
|
1840
|
+
self.node_filter = node_filter
|
|
1841
|
+
|
|
1842
|
+
def __call__(self, children):
|
|
1843
|
+
res = self.node_builder(children)
|
|
1844
|
+
|
|
1845
|
+
if isinstance(res, Tree):
|
|
1846
|
+
##
|
|
1847
|
+
|
|
1848
|
+
##
|
|
1849
|
+
|
|
1850
|
+
##
|
|
1851
|
+
|
|
1852
|
+
##
|
|
1853
|
+
|
|
1854
|
+
|
|
1855
|
+
res_meta = res.meta
|
|
1856
|
+
|
|
1857
|
+
first_meta = self._pp_get_meta(children)
|
|
1858
|
+
if first_meta is not None:
|
|
1859
|
+
if not hasattr(res_meta, 'line'):
|
|
1860
|
+
##
|
|
1861
|
+
|
|
1862
|
+
res_meta.line = getattr(first_meta, 'container_line', first_meta.line)
|
|
1863
|
+
res_meta.column = getattr(first_meta, 'container_column', first_meta.column)
|
|
1864
|
+
res_meta.start_pos = getattr(first_meta, 'container_start_pos', first_meta.start_pos)
|
|
1865
|
+
res_meta.empty = False
|
|
1866
|
+
|
|
1867
|
+
res_meta.container_line = getattr(first_meta, 'container_line', first_meta.line)
|
|
1868
|
+
res_meta.container_column = getattr(first_meta, 'container_column', first_meta.column)
|
|
1869
|
+
res_meta.container_start_pos = getattr(first_meta, 'container_start_pos', first_meta.start_pos)
|
|
1870
|
+
|
|
1871
|
+
last_meta = self._pp_get_meta(reversed(children))
|
|
1872
|
+
if last_meta is not None:
|
|
1873
|
+
if not hasattr(res_meta, 'end_line'):
|
|
1874
|
+
res_meta.end_line = getattr(last_meta, 'container_end_line', last_meta.end_line)
|
|
1875
|
+
res_meta.end_column = getattr(last_meta, 'container_end_column', last_meta.end_column)
|
|
1876
|
+
res_meta.end_pos = getattr(last_meta, 'container_end_pos', last_meta.end_pos)
|
|
1877
|
+
res_meta.empty = False
|
|
1878
|
+
|
|
1879
|
+
res_meta.container_end_line = getattr(last_meta, 'container_end_line', last_meta.end_line)
|
|
1880
|
+
res_meta.container_end_column = getattr(last_meta, 'container_end_column', last_meta.end_column)
|
|
1881
|
+
res_meta.container_end_pos = getattr(last_meta, 'container_end_pos', last_meta.end_pos)
|
|
1882
|
+
|
|
1883
|
+
return res
|
|
1884
|
+
|
|
1885
|
+
def _pp_get_meta(self, children):
|
|
1886
|
+
for c in children:
|
|
1887
|
+
if self.node_filter is not None and not self.node_filter(c):
|
|
1888
|
+
continue
|
|
1889
|
+
if isinstance(c, Tree):
|
|
1890
|
+
if not c.meta.empty:
|
|
1891
|
+
return c.meta
|
|
1892
|
+
elif isinstance(c, Token):
|
|
1893
|
+
return c
|
|
1894
|
+
elif hasattr(c, '__lark_meta__'):
|
|
1895
|
+
return c.__lark_meta__()
|
|
1896
|
+
|
|
1897
|
+
def make_propagate_positions(option):
|
|
1898
|
+
if callable(option):
|
|
1899
|
+
return partial(PropagatePositions, node_filter=option)
|
|
1900
|
+
elif option is True:
|
|
1901
|
+
return PropagatePositions
|
|
1902
|
+
elif option is False:
|
|
1903
|
+
return None
|
|
1904
|
+
|
|
1905
|
+
raise ConfigurationError('Invalid option for propagate_positions: %r' % option)
|
|
1906
|
+
|
|
1907
|
+
|
|
1908
|
+
class ChildFilter:
|
|
1909
|
+
def __init__(self, to_include, append_none, node_builder):
|
|
1910
|
+
self.node_builder = node_builder
|
|
1911
|
+
self.to_include = to_include
|
|
1912
|
+
self.append_none = append_none
|
|
1913
|
+
|
|
1914
|
+
def __call__(self, children):
|
|
1915
|
+
filtered = []
|
|
1916
|
+
|
|
1917
|
+
for i, to_expand, add_none in self.to_include:
|
|
1918
|
+
if add_none:
|
|
1919
|
+
filtered += [None] * add_none
|
|
1920
|
+
if to_expand:
|
|
1921
|
+
filtered += children[i].children
|
|
1922
|
+
else:
|
|
1923
|
+
filtered.append(children[i])
|
|
1924
|
+
|
|
1925
|
+
if self.append_none:
|
|
1926
|
+
filtered += [None] * self.append_none
|
|
1927
|
+
|
|
1928
|
+
return self.node_builder(filtered)
|
|
1929
|
+
|
|
1930
|
+
|
|
1931
|
+
class ChildFilterLALR(ChildFilter):
|
|
1932
|
+
#--
|
|
1933
|
+
|
|
1934
|
+
def __call__(self, children):
|
|
1935
|
+
filtered = []
|
|
1936
|
+
for i, to_expand, add_none in self.to_include:
|
|
1937
|
+
if add_none:
|
|
1938
|
+
filtered += [None] * add_none
|
|
1939
|
+
if to_expand:
|
|
1940
|
+
if filtered:
|
|
1941
|
+
filtered += children[i].children
|
|
1942
|
+
else: ##
|
|
1943
|
+
|
|
1944
|
+
filtered = children[i].children
|
|
1945
|
+
else:
|
|
1946
|
+
filtered.append(children[i])
|
|
1947
|
+
|
|
1948
|
+
if self.append_none:
|
|
1949
|
+
filtered += [None] * self.append_none
|
|
1950
|
+
|
|
1951
|
+
return self.node_builder(filtered)
|
|
1952
|
+
|
|
1953
|
+
|
|
1954
|
+
class ChildFilterLALR_NoPlaceholders(ChildFilter):
|
|
1955
|
+
#--
|
|
1956
|
+
def __init__(self, to_include, node_builder):
|
|
1957
|
+
self.node_builder = node_builder
|
|
1958
|
+
self.to_include = to_include
|
|
1959
|
+
|
|
1960
|
+
def __call__(self, children):
|
|
1961
|
+
filtered = []
|
|
1962
|
+
for i, to_expand in self.to_include:
|
|
1963
|
+
if to_expand:
|
|
1964
|
+
if filtered:
|
|
1965
|
+
filtered += children[i].children
|
|
1966
|
+
else: ##
|
|
1967
|
+
|
|
1968
|
+
filtered = children[i].children
|
|
1969
|
+
else:
|
|
1970
|
+
filtered.append(children[i])
|
|
1971
|
+
return self.node_builder(filtered)
|
|
1972
|
+
|
|
1973
|
+
|
|
1974
|
+
def _should_expand(sym):
|
|
1975
|
+
return not sym.is_term and sym.name.startswith('_')
|
|
1976
|
+
|
|
1977
|
+
|
|
1978
|
+
def maybe_create_child_filter(expansion, keep_all_tokens, ambiguous, _empty_indices: List[bool]):
|
|
1979
|
+
##
|
|
1980
|
+
|
|
1981
|
+
if _empty_indices:
|
|
1982
|
+
assert _empty_indices.count(False) == len(expansion)
|
|
1983
|
+
s = ''.join(str(int(b)) for b in _empty_indices)
|
|
1984
|
+
empty_indices = [len(ones) for ones in s.split('0')]
|
|
1985
|
+
assert len(empty_indices) == len(expansion)+1, (empty_indices, len(expansion))
|
|
1986
|
+
else:
|
|
1987
|
+
empty_indices = [0] * (len(expansion)+1)
|
|
1988
|
+
|
|
1989
|
+
to_include = []
|
|
1990
|
+
nones_to_add = 0
|
|
1991
|
+
for i, sym in enumerate(expansion):
|
|
1992
|
+
nones_to_add += empty_indices[i]
|
|
1993
|
+
if keep_all_tokens or not (sym.is_term and sym.filter_out):
|
|
1994
|
+
to_include.append((i, _should_expand(sym), nones_to_add))
|
|
1995
|
+
nones_to_add = 0
|
|
1996
|
+
|
|
1997
|
+
nones_to_add += empty_indices[len(expansion)]
|
|
1998
|
+
|
|
1999
|
+
if _empty_indices or len(to_include) < len(expansion) or any(to_expand for i, to_expand,_ in to_include):
|
|
2000
|
+
if _empty_indices or ambiguous:
|
|
2001
|
+
return partial(ChildFilter if ambiguous else ChildFilterLALR, to_include, nones_to_add)
|
|
2002
|
+
else:
|
|
2003
|
+
##
|
|
2004
|
+
|
|
2005
|
+
return partial(ChildFilterLALR_NoPlaceholders, [(i, x) for i,x,_ in to_include])
|
|
2006
|
+
|
|
2007
|
+
|
|
2008
|
+
class AmbiguousExpander:
|
|
2009
|
+
#--
|
|
2010
|
+
def __init__(self, to_expand, tree_class, node_builder):
|
|
2011
|
+
self.node_builder = node_builder
|
|
2012
|
+
self.tree_class = tree_class
|
|
2013
|
+
self.to_expand = to_expand
|
|
2014
|
+
|
|
2015
|
+
def __call__(self, children):
|
|
2016
|
+
def _is_ambig_tree(t):
|
|
2017
|
+
return hasattr(t, 'data') and t.data == '_ambig'
|
|
2018
|
+
|
|
2019
|
+
##
|
|
2020
|
+
|
|
2021
|
+
##
|
|
2022
|
+
|
|
2023
|
+
##
|
|
2024
|
+
|
|
2025
|
+
##
|
|
2026
|
+
|
|
2027
|
+
ambiguous = []
|
|
2028
|
+
for i, child in enumerate(children):
|
|
2029
|
+
if _is_ambig_tree(child):
|
|
2030
|
+
if i in self.to_expand:
|
|
2031
|
+
ambiguous.append(i)
|
|
2032
|
+
|
|
2033
|
+
child.expand_kids_by_data('_ambig')
|
|
2034
|
+
|
|
2035
|
+
if not ambiguous:
|
|
2036
|
+
return self.node_builder(children)
|
|
2037
|
+
|
|
2038
|
+
expand = [child.children if i in ambiguous else (child,) for i, child in enumerate(children)]
|
|
2039
|
+
return self.tree_class('_ambig', [self.node_builder(list(f)) for f in product(*expand)])
|
|
2040
|
+
|
|
2041
|
+
|
|
2042
|
+
def maybe_create_ambiguous_expander(tree_class, expansion, keep_all_tokens):
|
|
2043
|
+
to_expand = [i for i, sym in enumerate(expansion)
|
|
2044
|
+
if keep_all_tokens or ((not (sym.is_term and sym.filter_out)) and _should_expand(sym))]
|
|
2045
|
+
if to_expand:
|
|
2046
|
+
return partial(AmbiguousExpander, to_expand, tree_class)
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
class AmbiguousIntermediateExpander:
|
|
2050
|
+
#--
|
|
2051
|
+
|
|
2052
|
+
def __init__(self, tree_class, node_builder):
|
|
2053
|
+
self.node_builder = node_builder
|
|
2054
|
+
self.tree_class = tree_class
|
|
2055
|
+
|
|
2056
|
+
def __call__(self, children):
|
|
2057
|
+
def _is_iambig_tree(child):
|
|
2058
|
+
return hasattr(child, 'data') and child.data == '_iambig'
|
|
2059
|
+
|
|
2060
|
+
def _collapse_iambig(children):
|
|
2061
|
+
#--
|
|
2062
|
+
|
|
2063
|
+
##
|
|
2064
|
+
|
|
2065
|
+
##
|
|
2066
|
+
|
|
2067
|
+
if children and _is_iambig_tree(children[0]):
|
|
2068
|
+
iambig_node = children[0]
|
|
2069
|
+
result = []
|
|
2070
|
+
for grandchild in iambig_node.children:
|
|
2071
|
+
collapsed = _collapse_iambig(grandchild.children)
|
|
2072
|
+
if collapsed:
|
|
2073
|
+
for child in collapsed:
|
|
2074
|
+
child.children += children[1:]
|
|
2075
|
+
result += collapsed
|
|
2076
|
+
else:
|
|
2077
|
+
new_tree = self.tree_class('_inter', grandchild.children + children[1:])
|
|
2078
|
+
result.append(new_tree)
|
|
2079
|
+
return result
|
|
2080
|
+
|
|
2081
|
+
collapsed = _collapse_iambig(children)
|
|
2082
|
+
if collapsed:
|
|
2083
|
+
processed_nodes = [self.node_builder(c.children) for c in collapsed]
|
|
2084
|
+
return self.tree_class('_ambig', processed_nodes)
|
|
2085
|
+
|
|
2086
|
+
return self.node_builder(children)
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
def inplace_transformer(func):
|
|
2091
|
+
@wraps(func)
|
|
2092
|
+
def f(children):
|
|
2093
|
+
##
|
|
2094
|
+
|
|
2095
|
+
tree = Tree(func.__name__, children)
|
|
2096
|
+
return func(tree)
|
|
2097
|
+
return f
|
|
2098
|
+
|
|
2099
|
+
|
|
2100
|
+
def apply_visit_wrapper(func, name, wrapper):
|
|
2101
|
+
if wrapper is _vargs_meta or wrapper is _vargs_meta_inline:
|
|
2102
|
+
raise NotImplementedError("Meta args not supported for internal transformer")
|
|
2103
|
+
|
|
2104
|
+
@wraps(func)
|
|
2105
|
+
def f(children):
|
|
2106
|
+
return wrapper(func, name, children, None)
|
|
2107
|
+
return f
|
|
2108
|
+
|
|
2109
|
+
|
|
2110
|
+
class ParseTreeBuilder:
|
|
2111
|
+
def __init__(self, rules, tree_class, propagate_positions=False, ambiguous=False, maybe_placeholders=False):
|
|
2112
|
+
self.tree_class = tree_class
|
|
2113
|
+
self.propagate_positions = propagate_positions
|
|
2114
|
+
self.ambiguous = ambiguous
|
|
2115
|
+
self.maybe_placeholders = maybe_placeholders
|
|
2116
|
+
|
|
2117
|
+
self.rule_builders = list(self._init_builders(rules))
|
|
2118
|
+
|
|
2119
|
+
def _init_builders(self, rules):
|
|
2120
|
+
propagate_positions = make_propagate_positions(self.propagate_positions)
|
|
2121
|
+
|
|
2122
|
+
for rule in rules:
|
|
2123
|
+
options = rule.options
|
|
2124
|
+
keep_all_tokens = options.keep_all_tokens
|
|
2125
|
+
expand_single_child = options.expand1
|
|
2126
|
+
|
|
2127
|
+
wrapper_chain = list(filter(None, [
|
|
2128
|
+
(expand_single_child and not rule.alias) and ExpandSingleChild,
|
|
2129
|
+
maybe_create_child_filter(rule.expansion, keep_all_tokens, self.ambiguous, options.empty_indices if self.maybe_placeholders else None),
|
|
2130
|
+
propagate_positions,
|
|
2131
|
+
self.ambiguous and maybe_create_ambiguous_expander(self.tree_class, rule.expansion, keep_all_tokens),
|
|
2132
|
+
self.ambiguous and partial(AmbiguousIntermediateExpander, self.tree_class)
|
|
2133
|
+
]))
|
|
2134
|
+
|
|
2135
|
+
yield rule, wrapper_chain
|
|
2136
|
+
|
|
2137
|
+
def create_callback(self, transformer=None):
|
|
2138
|
+
callbacks = {}
|
|
2139
|
+
|
|
2140
|
+
default_handler = getattr(transformer, '__default__', None)
|
|
2141
|
+
if default_handler:
|
|
2142
|
+
def default_callback(data, children):
|
|
2143
|
+
return default_handler(data, children, None)
|
|
2144
|
+
else:
|
|
2145
|
+
default_callback = self.tree_class
|
|
2146
|
+
|
|
2147
|
+
for rule, wrapper_chain in self.rule_builders:
|
|
2148
|
+
|
|
2149
|
+
user_callback_name = rule.alias or rule.options.template_source or rule.origin.name
|
|
2150
|
+
try:
|
|
2151
|
+
f = getattr(transformer, user_callback_name)
|
|
2152
|
+
wrapper = getattr(f, 'visit_wrapper', None)
|
|
2153
|
+
if wrapper is not None:
|
|
2154
|
+
f = apply_visit_wrapper(f, user_callback_name, wrapper)
|
|
2155
|
+
elif isinstance(transformer, Transformer_InPlace):
|
|
2156
|
+
f = inplace_transformer(f)
|
|
2157
|
+
except AttributeError:
|
|
2158
|
+
f = partial(default_callback, user_callback_name)
|
|
2159
|
+
|
|
2160
|
+
for w in wrapper_chain:
|
|
2161
|
+
f = w(f)
|
|
2162
|
+
|
|
2163
|
+
if rule in callbacks:
|
|
2164
|
+
raise GrammarError("Rule '%s' already exists" % (rule,))
|
|
2165
|
+
|
|
2166
|
+
callbacks[rule] = f
|
|
2167
|
+
|
|
2168
|
+
return callbacks
|
|
2169
|
+
|
|
2170
|
+
|
|
2171
|
+
|
|
2172
|
+
class Action:
|
|
2173
|
+
def __init__(self, name):
|
|
2174
|
+
self.name = name
|
|
2175
|
+
def __str__(self):
|
|
2176
|
+
return self.name
|
|
2177
|
+
def __repr__(self):
|
|
2178
|
+
return str(self)
|
|
2179
|
+
|
|
2180
|
+
Shift = Action('Shift')
|
|
2181
|
+
Reduce = Action('Reduce')
|
|
2182
|
+
|
|
2183
|
+
StateT = TypeVar("StateT")
|
|
2184
|
+
|
|
2185
|
+
class ParseTableBase(Generic[StateT]):
|
|
2186
|
+
states: Dict[StateT, Dict[str, Tuple]]
|
|
2187
|
+
start_states: Dict[str, StateT]
|
|
2188
|
+
end_states: Dict[str, StateT]
|
|
2189
|
+
|
|
2190
|
+
def __init__(self, states, start_states, end_states):
|
|
2191
|
+
self.states = states
|
|
2192
|
+
self.start_states = start_states
|
|
2193
|
+
self.end_states = end_states
|
|
2194
|
+
|
|
2195
|
+
def serialize(self, memo):
|
|
2196
|
+
tokens = Enumerator()
|
|
2197
|
+
|
|
2198
|
+
states = {
|
|
2199
|
+
state: {tokens.get(token): ((1, arg.serialize(memo)) if action is Reduce else (0, arg))
|
|
2200
|
+
for token, (action, arg) in actions.items()}
|
|
2201
|
+
for state, actions in self.states.items()
|
|
2202
|
+
}
|
|
2203
|
+
|
|
2204
|
+
return {
|
|
2205
|
+
'tokens': tokens.reversed(),
|
|
2206
|
+
'states': states,
|
|
2207
|
+
'start_states': self.start_states,
|
|
2208
|
+
'end_states': self.end_states,
|
|
2209
|
+
}
|
|
2210
|
+
|
|
2211
|
+
@classmethod
|
|
2212
|
+
def deserialize(cls, data, memo):
|
|
2213
|
+
tokens = data['tokens']
|
|
2214
|
+
states = {
|
|
2215
|
+
state: {tokens[token]: ((Reduce, Rule.deserialize(arg, memo)) if action==1 else (Shift, arg))
|
|
2216
|
+
for token, (action, arg) in actions.items()}
|
|
2217
|
+
for state, actions in data['states'].items()
|
|
2218
|
+
}
|
|
2219
|
+
return cls(states, data['start_states'], data['end_states'])
|
|
2220
|
+
|
|
2221
|
+
class ParseTable(ParseTableBase['State']):
|
|
2222
|
+
#--
|
|
2223
|
+
pass
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
class IntParseTable(ParseTableBase[int]):
|
|
2227
|
+
#--
|
|
2228
|
+
|
|
2229
|
+
@classmethod
|
|
2230
|
+
def from_ParseTable(cls, parse_table: ParseTable):
|
|
2231
|
+
enum = list(parse_table.states)
|
|
2232
|
+
state_to_idx: Dict['State', int] = {s:i for i,s in enumerate(enum)}
|
|
2233
|
+
int_states = {}
|
|
2234
|
+
|
|
2235
|
+
for s, la in parse_table.states.items():
|
|
2236
|
+
la = {k:(v[0], state_to_idx[v[1]]) if v[0] is Shift else v
|
|
2237
|
+
for k,v in la.items()}
|
|
2238
|
+
int_states[ state_to_idx[s] ] = la
|
|
2239
|
+
|
|
2240
|
+
|
|
2241
|
+
start_states = {start:state_to_idx[s] for start, s in parse_table.start_states.items()}
|
|
2242
|
+
end_states = {start:state_to_idx[s] for start, s in parse_table.end_states.items()}
|
|
2243
|
+
return cls(int_states, start_states, end_states)
|
|
2244
|
+
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
class ParseConf(Generic[StateT]):
|
|
2248
|
+
__slots__ = 'parse_table', 'callbacks', 'start', 'start_state', 'end_state', 'states'
|
|
2249
|
+
|
|
2250
|
+
parse_table: ParseTableBase[StateT]
|
|
2251
|
+
callbacks: ParserCallbacks
|
|
2252
|
+
start: str
|
|
2253
|
+
|
|
2254
|
+
start_state: StateT
|
|
2255
|
+
end_state: StateT
|
|
2256
|
+
states: Dict[StateT, Dict[str, tuple]]
|
|
2257
|
+
|
|
2258
|
+
def __init__(self, parse_table: ParseTableBase[StateT], callbacks: ParserCallbacks, start: str):
|
|
2259
|
+
self.parse_table = parse_table
|
|
2260
|
+
|
|
2261
|
+
self.start_state = self.parse_table.start_states[start]
|
|
2262
|
+
self.end_state = self.parse_table.end_states[start]
|
|
2263
|
+
self.states = self.parse_table.states
|
|
2264
|
+
|
|
2265
|
+
self.callbacks = callbacks
|
|
2266
|
+
self.start = start
|
|
2267
|
+
|
|
2268
|
+
class ParserState(Generic[StateT]):
|
|
2269
|
+
__slots__ = 'parse_conf', 'lexer', 'state_stack', 'value_stack'
|
|
2270
|
+
|
|
2271
|
+
parse_conf: ParseConf[StateT]
|
|
2272
|
+
lexer: LexerThread
|
|
2273
|
+
state_stack: List[StateT]
|
|
2274
|
+
value_stack: list
|
|
2275
|
+
|
|
2276
|
+
def __init__(self, parse_conf: ParseConf[StateT], lexer: LexerThread, state_stack=None, value_stack=None):
|
|
2277
|
+
self.parse_conf = parse_conf
|
|
2278
|
+
self.lexer = lexer
|
|
2279
|
+
self.state_stack = state_stack or [self.parse_conf.start_state]
|
|
2280
|
+
self.value_stack = value_stack or []
|
|
2281
|
+
|
|
2282
|
+
@property
|
|
2283
|
+
def position(self) -> StateT:
|
|
2284
|
+
return self.state_stack[-1]
|
|
2285
|
+
|
|
2286
|
+
##
|
|
2287
|
+
|
|
2288
|
+
def __eq__(self, other) -> bool:
|
|
2289
|
+
if not isinstance(other, ParserState):
|
|
2290
|
+
return NotImplemented
|
|
2291
|
+
return len(self.state_stack) == len(other.state_stack) and self.position == other.position
|
|
2292
|
+
|
|
2293
|
+
def __copy__(self):
|
|
2294
|
+
return self.copy()
|
|
2295
|
+
|
|
2296
|
+
def copy(self, deepcopy_values=True) -> 'ParserState[StateT]':
|
|
2297
|
+
return type(self)(
|
|
2298
|
+
self.parse_conf,
|
|
2299
|
+
self.lexer, ##
|
|
2300
|
+
|
|
2301
|
+
copy(self.state_stack),
|
|
2302
|
+
deepcopy(self.value_stack) if deepcopy_values else copy(self.value_stack),
|
|
2303
|
+
)
|
|
2304
|
+
|
|
2305
|
+
def feed_token(self, token: Token, is_end=False) -> Any:
|
|
2306
|
+
state_stack = self.state_stack
|
|
2307
|
+
value_stack = self.value_stack
|
|
2308
|
+
states = self.parse_conf.states
|
|
2309
|
+
end_state = self.parse_conf.end_state
|
|
2310
|
+
callbacks = self.parse_conf.callbacks
|
|
2311
|
+
|
|
2312
|
+
while True:
|
|
2313
|
+
state = state_stack[-1]
|
|
2314
|
+
try:
|
|
2315
|
+
action, arg = states[state][token.type]
|
|
2316
|
+
except KeyError:
|
|
2317
|
+
expected = {s for s in states[state].keys() if s.isupper()}
|
|
2318
|
+
raise UnexpectedToken(token, expected, state=self, interactive_parser=None)
|
|
2319
|
+
|
|
2320
|
+
assert arg != end_state
|
|
2321
|
+
|
|
2322
|
+
if action is Shift:
|
|
2323
|
+
##
|
|
2324
|
+
|
|
2325
|
+
assert not is_end
|
|
2326
|
+
state_stack.append(arg)
|
|
2327
|
+
value_stack.append(token if token.type not in callbacks else callbacks[token.type](token))
|
|
2328
|
+
return
|
|
2329
|
+
else:
|
|
2330
|
+
##
|
|
2331
|
+
|
|
2332
|
+
rule = arg
|
|
2333
|
+
size = len(rule.expansion)
|
|
2334
|
+
if size:
|
|
2335
|
+
s = value_stack[-size:]
|
|
2336
|
+
del state_stack[-size:]
|
|
2337
|
+
del value_stack[-size:]
|
|
2338
|
+
else:
|
|
2339
|
+
s = []
|
|
2340
|
+
|
|
2341
|
+
value = callbacks[rule](s) if callbacks else s
|
|
2342
|
+
|
|
2343
|
+
_action, new_state = states[state_stack[-1]][rule.origin.name]
|
|
2344
|
+
assert _action is Shift
|
|
2345
|
+
state_stack.append(new_state)
|
|
2346
|
+
value_stack.append(value)
|
|
2347
|
+
|
|
2348
|
+
if is_end and state_stack[-1] == end_state:
|
|
2349
|
+
return value_stack[-1]
|
|
2350
|
+
|
|
2351
|
+
|
|
2352
|
+
class LALR_Parser(Serialize):
|
|
2353
|
+
def __init__(self, parser_conf: ParserConf, debug: bool=False, strict: bool=False):
|
|
2354
|
+
analysis = LALR_Analyzer(parser_conf, debug=debug, strict=strict)
|
|
2355
|
+
analysis.compute_lalr()
|
|
2356
|
+
callbacks = parser_conf.callbacks
|
|
2357
|
+
|
|
2358
|
+
self._parse_table = analysis.parse_table
|
|
2359
|
+
self.parser_conf = parser_conf
|
|
2360
|
+
self.parser = _Parser(analysis.parse_table, callbacks, debug)
|
|
2361
|
+
|
|
2362
|
+
@classmethod
|
|
2363
|
+
def deserialize(cls, data, memo, callbacks, debug=False):
|
|
2364
|
+
inst = cls.__new__(cls)
|
|
2365
|
+
inst._parse_table = IntParseTable.deserialize(data, memo)
|
|
2366
|
+
inst.parser = _Parser(inst._parse_table, callbacks, debug)
|
|
2367
|
+
return inst
|
|
2368
|
+
|
|
2369
|
+
def serialize(self, memo: Any = None) -> Dict[str, Any]:
|
|
2370
|
+
return self._parse_table.serialize(memo)
|
|
2371
|
+
|
|
2372
|
+
def parse_interactive(self, lexer: LexerThread, start: str):
|
|
2373
|
+
return self.parser.parse(lexer, start, start_interactive=True)
|
|
2374
|
+
|
|
2375
|
+
def parse(self, lexer, start, on_error=None):
|
|
2376
|
+
try:
|
|
2377
|
+
return self.parser.parse(lexer, start)
|
|
2378
|
+
except UnexpectedInput as e:
|
|
2379
|
+
if on_error is None:
|
|
2380
|
+
raise
|
|
2381
|
+
|
|
2382
|
+
while True:
|
|
2383
|
+
if isinstance(e, UnexpectedCharacters):
|
|
2384
|
+
s = e.interactive_parser.lexer_thread.state
|
|
2385
|
+
p = s.line_ctr.char_pos
|
|
2386
|
+
|
|
2387
|
+
if not on_error(e):
|
|
2388
|
+
raise e
|
|
2389
|
+
|
|
2390
|
+
if isinstance(e, UnexpectedCharacters):
|
|
2391
|
+
##
|
|
2392
|
+
|
|
2393
|
+
if p == s.line_ctr.char_pos:
|
|
2394
|
+
s.line_ctr.feed(s.text[p:p+1])
|
|
2395
|
+
|
|
2396
|
+
try:
|
|
2397
|
+
return e.interactive_parser.resume_parse()
|
|
2398
|
+
except UnexpectedToken as e2:
|
|
2399
|
+
if (isinstance(e, UnexpectedToken)
|
|
2400
|
+
and e.token.type == e2.token.type == '$END'
|
|
2401
|
+
and e.interactive_parser == e2.interactive_parser):
|
|
2402
|
+
##
|
|
2403
|
+
|
|
2404
|
+
raise e2
|
|
2405
|
+
e = e2
|
|
2406
|
+
except UnexpectedCharacters as e2:
|
|
2407
|
+
e = e2
|
|
2408
|
+
|
|
2409
|
+
|
|
2410
|
+
class _Parser:
|
|
2411
|
+
parse_table: ParseTableBase
|
|
2412
|
+
callbacks: ParserCallbacks
|
|
2413
|
+
debug: bool
|
|
2414
|
+
|
|
2415
|
+
def __init__(self, parse_table: ParseTableBase, callbacks: ParserCallbacks, debug: bool=False):
|
|
2416
|
+
self.parse_table = parse_table
|
|
2417
|
+
self.callbacks = callbacks
|
|
2418
|
+
self.debug = debug
|
|
2419
|
+
|
|
2420
|
+
def parse(self, lexer: LexerThread, start: str, value_stack=None, state_stack=None, start_interactive=False):
|
|
2421
|
+
parse_conf = ParseConf(self.parse_table, self.callbacks, start)
|
|
2422
|
+
parser_state = ParserState(parse_conf, lexer, state_stack, value_stack)
|
|
2423
|
+
if start_interactive:
|
|
2424
|
+
return InteractiveParser(self, parser_state, parser_state.lexer)
|
|
2425
|
+
return self.parse_from_state(parser_state)
|
|
2426
|
+
|
|
2427
|
+
|
|
2428
|
+
def parse_from_state(self, state: ParserState, last_token: Optional[Token]=None):
|
|
2429
|
+
#--
|
|
2430
|
+
try:
|
|
2431
|
+
token = last_token
|
|
2432
|
+
for token in state.lexer.lex(state):
|
|
2433
|
+
assert token is not None
|
|
2434
|
+
state.feed_token(token)
|
|
2435
|
+
|
|
2436
|
+
end_token = Token.new_borrow_pos('$END', '', token) if token else Token('$END', '', 0, 1, 1)
|
|
2437
|
+
return state.feed_token(end_token, True)
|
|
2438
|
+
except UnexpectedInput as e:
|
|
2439
|
+
try:
|
|
2440
|
+
e.interactive_parser = InteractiveParser(self, state, state.lexer)
|
|
2441
|
+
except NameError:
|
|
2442
|
+
pass
|
|
2443
|
+
raise e
|
|
2444
|
+
except Exception as e:
|
|
2445
|
+
if self.debug:
|
|
2446
|
+
print("")
|
|
2447
|
+
print("STATE STACK DUMP")
|
|
2448
|
+
print("----------------")
|
|
2449
|
+
for i, s in enumerate(state.state_stack):
|
|
2450
|
+
print('%d)' % i , s)
|
|
2451
|
+
print("")
|
|
2452
|
+
|
|
2453
|
+
raise
|
|
2454
|
+
|
|
2455
|
+
|
|
2456
|
+
class InteractiveParser:
|
|
2457
|
+
#--
|
|
2458
|
+
def __init__(self, parser, parser_state: ParserState, lexer_thread: LexerThread):
|
|
2459
|
+
self.parser = parser
|
|
2460
|
+
self.parser_state = parser_state
|
|
2461
|
+
self.lexer_thread = lexer_thread
|
|
2462
|
+
self.result = None
|
|
2463
|
+
|
|
2464
|
+
@property
|
|
2465
|
+
def lexer_state(self) -> LexerThread:
|
|
2466
|
+
warnings.warn("lexer_state will be removed in subsequent releases. Use lexer_thread instead.", DeprecationWarning)
|
|
2467
|
+
return self.lexer_thread
|
|
2468
|
+
|
|
2469
|
+
def feed_token(self, token: Token):
|
|
2470
|
+
#--
|
|
2471
|
+
return self.parser_state.feed_token(token, token.type == '$END')
|
|
2472
|
+
|
|
2473
|
+
def iter_parse(self) -> Iterator[Token]:
|
|
2474
|
+
#--
|
|
2475
|
+
for token in self.lexer_thread.lex(self.parser_state):
|
|
2476
|
+
yield token
|
|
2477
|
+
self.result = self.feed_token(token)
|
|
2478
|
+
|
|
2479
|
+
def exhaust_lexer(self) -> List[Token]:
|
|
2480
|
+
#--
|
|
2481
|
+
return list(self.iter_parse())
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
def feed_eof(self, last_token=None):
|
|
2485
|
+
#--
|
|
2486
|
+
eof = Token.new_borrow_pos('$END', '', last_token) if last_token is not None else self.lexer_thread._Token('$END', '', 0, 1, 1)
|
|
2487
|
+
return self.feed_token(eof)
|
|
2488
|
+
|
|
2489
|
+
|
|
2490
|
+
def __copy__(self):
|
|
2491
|
+
#--
|
|
2492
|
+
return self.copy()
|
|
2493
|
+
|
|
2494
|
+
def copy(self, deepcopy_values=True):
|
|
2495
|
+
return type(self)(
|
|
2496
|
+
self.parser,
|
|
2497
|
+
self.parser_state.copy(deepcopy_values=deepcopy_values),
|
|
2498
|
+
copy(self.lexer_thread),
|
|
2499
|
+
)
|
|
2500
|
+
|
|
2501
|
+
def __eq__(self, other):
|
|
2502
|
+
if not isinstance(other, InteractiveParser):
|
|
2503
|
+
return False
|
|
2504
|
+
|
|
2505
|
+
return self.parser_state == other.parser_state and self.lexer_thread == other.lexer_thread
|
|
2506
|
+
|
|
2507
|
+
def as_immutable(self):
|
|
2508
|
+
#--
|
|
2509
|
+
p = copy(self)
|
|
2510
|
+
return ImmutableInteractiveParser(p.parser, p.parser_state, p.lexer_thread)
|
|
2511
|
+
|
|
2512
|
+
def pretty(self):
|
|
2513
|
+
#--
|
|
2514
|
+
out = ["Parser choices:"]
|
|
2515
|
+
for k, v in self.choices().items():
|
|
2516
|
+
out.append('\t- %s -> %r' % (k, v))
|
|
2517
|
+
out.append('stack size: %s' % len(self.parser_state.state_stack))
|
|
2518
|
+
return '\n'.join(out)
|
|
2519
|
+
|
|
2520
|
+
def choices(self):
|
|
2521
|
+
#--
|
|
2522
|
+
return self.parser_state.parse_conf.parse_table.states[self.parser_state.position]
|
|
2523
|
+
|
|
2524
|
+
def accepts(self):
|
|
2525
|
+
#--
|
|
2526
|
+
accepts = set()
|
|
2527
|
+
conf_no_callbacks = copy(self.parser_state.parse_conf)
|
|
2528
|
+
##
|
|
2529
|
+
|
|
2530
|
+
##
|
|
2531
|
+
|
|
2532
|
+
conf_no_callbacks.callbacks = {}
|
|
2533
|
+
for t in self.choices():
|
|
2534
|
+
if t.isupper(): ##
|
|
2535
|
+
|
|
2536
|
+
new_cursor = self.copy(deepcopy_values=False)
|
|
2537
|
+
new_cursor.parser_state.parse_conf = conf_no_callbacks
|
|
2538
|
+
try:
|
|
2539
|
+
new_cursor.feed_token(self.lexer_thread._Token(t, ''))
|
|
2540
|
+
except UnexpectedToken:
|
|
2541
|
+
pass
|
|
2542
|
+
else:
|
|
2543
|
+
accepts.add(t)
|
|
2544
|
+
return accepts
|
|
2545
|
+
|
|
2546
|
+
def resume_parse(self):
|
|
2547
|
+
#--
|
|
2548
|
+
return self.parser.parse_from_state(self.parser_state, last_token=self.lexer_thread.state.last_token)
|
|
2549
|
+
|
|
2550
|
+
|
|
2551
|
+
|
|
2552
|
+
class ImmutableInteractiveParser(InteractiveParser):
|
|
2553
|
+
#--
|
|
2554
|
+
|
|
2555
|
+
result = None
|
|
2556
|
+
|
|
2557
|
+
def __hash__(self):
|
|
2558
|
+
return hash((self.parser_state, self.lexer_thread))
|
|
2559
|
+
|
|
2560
|
+
def feed_token(self, token):
|
|
2561
|
+
c = copy(self)
|
|
2562
|
+
c.result = InteractiveParser.feed_token(c, token)
|
|
2563
|
+
return c
|
|
2564
|
+
|
|
2565
|
+
def exhaust_lexer(self):
|
|
2566
|
+
#--
|
|
2567
|
+
cursor = self.as_mutable()
|
|
2568
|
+
cursor.exhaust_lexer()
|
|
2569
|
+
return cursor.as_immutable()
|
|
2570
|
+
|
|
2571
|
+
def as_mutable(self):
|
|
2572
|
+
#--
|
|
2573
|
+
p = copy(self)
|
|
2574
|
+
return InteractiveParser(p.parser, p.parser_state, p.lexer_thread)
|
|
2575
|
+
|
|
2576
|
+
|
|
2577
|
+
|
|
2578
|
+
def _wrap_lexer(lexer_class):
|
|
2579
|
+
future_interface = getattr(lexer_class, '__future_interface__', False)
|
|
2580
|
+
if future_interface:
|
|
2581
|
+
return lexer_class
|
|
2582
|
+
else:
|
|
2583
|
+
class CustomLexerWrapper(Lexer):
|
|
2584
|
+
def __init__(self, lexer_conf):
|
|
2585
|
+
self.lexer = lexer_class(lexer_conf)
|
|
2586
|
+
def lex(self, lexer_state, parser_state):
|
|
2587
|
+
return self.lexer.lex(lexer_state.text)
|
|
2588
|
+
return CustomLexerWrapper
|
|
2589
|
+
|
|
2590
|
+
|
|
2591
|
+
def _deserialize_parsing_frontend(data, memo, lexer_conf, callbacks, options):
|
|
2592
|
+
parser_conf = ParserConf.deserialize(data['parser_conf'], memo)
|
|
2593
|
+
cls = (options and options._plugins.get('LALR_Parser')) or LALR_Parser
|
|
2594
|
+
parser = cls.deserialize(data['parser'], memo, callbacks, options.debug)
|
|
2595
|
+
parser_conf.callbacks = callbacks
|
|
2596
|
+
return ParsingFrontend(lexer_conf, parser_conf, options, parser=parser)
|
|
2597
|
+
|
|
2598
|
+
|
|
2599
|
+
_parser_creators: 'Dict[str, Callable[[LexerConf, Any, Any], Any]]' = {}
|
|
2600
|
+
|
|
2601
|
+
|
|
2602
|
+
class ParsingFrontend(Serialize):
|
|
2603
|
+
__serialize_fields__ = 'lexer_conf', 'parser_conf', 'parser'
|
|
2604
|
+
|
|
2605
|
+
lexer_conf: LexerConf
|
|
2606
|
+
parser_conf: ParserConf
|
|
2607
|
+
options: Any
|
|
2608
|
+
|
|
2609
|
+
def __init__(self, lexer_conf: LexerConf, parser_conf: ParserConf, options, parser=None):
|
|
2610
|
+
self.parser_conf = parser_conf
|
|
2611
|
+
self.lexer_conf = lexer_conf
|
|
2612
|
+
self.options = options
|
|
2613
|
+
|
|
2614
|
+
##
|
|
2615
|
+
|
|
2616
|
+
if parser: ##
|
|
2617
|
+
|
|
2618
|
+
self.parser = parser
|
|
2619
|
+
else:
|
|
2620
|
+
create_parser = _parser_creators.get(parser_conf.parser_type)
|
|
2621
|
+
assert create_parser is not None, "{} is not supported in standalone mode".format(
|
|
2622
|
+
parser_conf.parser_type
|
|
2623
|
+
)
|
|
2624
|
+
self.parser = create_parser(lexer_conf, parser_conf, options)
|
|
2625
|
+
|
|
2626
|
+
##
|
|
2627
|
+
|
|
2628
|
+
lexer_type = lexer_conf.lexer_type
|
|
2629
|
+
self.skip_lexer = False
|
|
2630
|
+
if lexer_type in ('dynamic', 'dynamic_complete'):
|
|
2631
|
+
assert lexer_conf.postlex is None
|
|
2632
|
+
self.skip_lexer = True
|
|
2633
|
+
return
|
|
2634
|
+
|
|
2635
|
+
if isinstance(lexer_type, type):
|
|
2636
|
+
assert issubclass(lexer_type, Lexer)
|
|
2637
|
+
self.lexer = _wrap_lexer(lexer_type)(lexer_conf)
|
|
2638
|
+
elif isinstance(lexer_type, str):
|
|
2639
|
+
create_lexer = {
|
|
2640
|
+
'basic': create_basic_lexer,
|
|
2641
|
+
'contextual': create_contextual_lexer,
|
|
2642
|
+
}[lexer_type]
|
|
2643
|
+
self.lexer = create_lexer(lexer_conf, self.parser, lexer_conf.postlex, options)
|
|
2644
|
+
else:
|
|
2645
|
+
raise TypeError("Bad value for lexer_type: {lexer_type}")
|
|
2646
|
+
|
|
2647
|
+
if lexer_conf.postlex:
|
|
2648
|
+
self.lexer = PostLexConnector(self.lexer, lexer_conf.postlex)
|
|
2649
|
+
|
|
2650
|
+
def _verify_start(self, start=None):
|
|
2651
|
+
if start is None:
|
|
2652
|
+
start_decls = self.parser_conf.start
|
|
2653
|
+
if len(start_decls) > 1:
|
|
2654
|
+
raise ConfigurationError("Lark initialized with more than 1 possible start rule. Must specify which start rule to parse", start_decls)
|
|
2655
|
+
start ,= start_decls
|
|
2656
|
+
elif start not in self.parser_conf.start:
|
|
2657
|
+
raise ConfigurationError("Unknown start rule %s. Must be one of %r" % (start, self.parser_conf.start))
|
|
2658
|
+
return start
|
|
2659
|
+
|
|
2660
|
+
def _make_lexer_thread(self, text: str) -> Union[str, LexerThread]:
|
|
2661
|
+
cls = (self.options and self.options._plugins.get('LexerThread')) or LexerThread
|
|
2662
|
+
return text if self.skip_lexer else cls.from_text(self.lexer, text)
|
|
2663
|
+
|
|
2664
|
+
def parse(self, text: str, start=None, on_error=None):
|
|
2665
|
+
chosen_start = self._verify_start(start)
|
|
2666
|
+
kw = {} if on_error is None else {'on_error': on_error}
|
|
2667
|
+
stream = self._make_lexer_thread(text)
|
|
2668
|
+
return self.parser.parse(stream, chosen_start, **kw)
|
|
2669
|
+
|
|
2670
|
+
def parse_interactive(self, text: Optional[str]=None, start=None):
|
|
2671
|
+
##
|
|
2672
|
+
|
|
2673
|
+
##
|
|
2674
|
+
|
|
2675
|
+
chosen_start = self._verify_start(start)
|
|
2676
|
+
if self.parser_conf.parser_type != 'lalr':
|
|
2677
|
+
raise ConfigurationError("parse_interactive() currently only works with parser='lalr' ")
|
|
2678
|
+
stream = self._make_lexer_thread(text) ##
|
|
2679
|
+
|
|
2680
|
+
return self.parser.parse_interactive(stream, chosen_start)
|
|
2681
|
+
|
|
2682
|
+
|
|
2683
|
+
def _validate_frontend_args(parser, lexer) -> None:
|
|
2684
|
+
assert_config(parser, ('lalr', 'earley', 'cyk'))
|
|
2685
|
+
if not isinstance(lexer, type): ##
|
|
2686
|
+
|
|
2687
|
+
expected = {
|
|
2688
|
+
'lalr': ('basic', 'contextual'),
|
|
2689
|
+
'earley': ('basic', 'dynamic', 'dynamic_complete'),
|
|
2690
|
+
'cyk': ('basic', ),
|
|
2691
|
+
}[parser]
|
|
2692
|
+
assert_config(lexer, expected, 'Parser %r does not support lexer %%r, expected one of %%s' % parser)
|
|
2693
|
+
|
|
2694
|
+
|
|
2695
|
+
def _get_lexer_callbacks(transformer, terminals):
|
|
2696
|
+
result = {}
|
|
2697
|
+
for terminal in terminals:
|
|
2698
|
+
callback = getattr(transformer, terminal.name, None)
|
|
2699
|
+
if callback is not None:
|
|
2700
|
+
result[terminal.name] = callback
|
|
2701
|
+
return result
|
|
2702
|
+
|
|
2703
|
+
class PostLexConnector:
|
|
2704
|
+
def __init__(self, lexer, postlexer):
|
|
2705
|
+
self.lexer = lexer
|
|
2706
|
+
self.postlexer = postlexer
|
|
2707
|
+
|
|
2708
|
+
def lex(self, lexer_state, parser_state):
|
|
2709
|
+
i = self.lexer.lex(lexer_state, parser_state)
|
|
2710
|
+
return self.postlexer.process(i)
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
def create_basic_lexer(lexer_conf, parser, postlex, options) -> BasicLexer:
|
|
2715
|
+
cls = (options and options._plugins.get('BasicLexer')) or BasicLexer
|
|
2716
|
+
return cls(lexer_conf)
|
|
2717
|
+
|
|
2718
|
+
def create_contextual_lexer(lexer_conf: LexerConf, parser, postlex, options) -> ContextualLexer:
|
|
2719
|
+
cls = (options and options._plugins.get('ContextualLexer')) or ContextualLexer
|
|
2720
|
+
parse_table: ParseTableBase[int] = parser._parse_table
|
|
2721
|
+
states: Dict[int, Collection[str]] = {idx:list(t.keys()) for idx, t in parse_table.states.items()}
|
|
2722
|
+
always_accept: Collection[str] = postlex.always_accept if postlex else ()
|
|
2723
|
+
return cls(lexer_conf, states, always_accept=always_accept)
|
|
2724
|
+
|
|
2725
|
+
def create_lalr_parser(lexer_conf: LexerConf, parser_conf: ParserConf, options=None) -> LALR_Parser:
|
|
2726
|
+
debug = options.debug if options else False
|
|
2727
|
+
strict = options.strict if options else False
|
|
2728
|
+
cls = (options and options._plugins.get('LALR_Parser')) or LALR_Parser
|
|
2729
|
+
return cls(parser_conf, debug=debug, strict=strict)
|
|
2730
|
+
|
|
2731
|
+
_parser_creators['lalr'] = create_lalr_parser
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
|
|
2735
|
+
|
|
2736
|
+
class PostLex(ABC):
|
|
2737
|
+
@abstractmethod
|
|
2738
|
+
def process(self, stream: Iterator[Token]) -> Iterator[Token]:
|
|
2739
|
+
return stream
|
|
2740
|
+
|
|
2741
|
+
always_accept: Iterable[str] = ()
|
|
2742
|
+
|
|
2743
|
+
class LarkOptions(Serialize):
|
|
2744
|
+
#--
|
|
2745
|
+
|
|
2746
|
+
start: List[str]
|
|
2747
|
+
debug: bool
|
|
2748
|
+
strict: bool
|
|
2749
|
+
transformer: 'Optional[Transformer]'
|
|
2750
|
+
propagate_positions: Union[bool, str]
|
|
2751
|
+
maybe_placeholders: bool
|
|
2752
|
+
cache: Union[bool, str]
|
|
2753
|
+
regex: bool
|
|
2754
|
+
g_regex_flags: int
|
|
2755
|
+
keep_all_tokens: bool
|
|
2756
|
+
tree_class: Optional[Callable[[str, List], Any]]
|
|
2757
|
+
parser: _ParserArgType
|
|
2758
|
+
lexer: _LexerArgType
|
|
2759
|
+
ambiguity: 'Literal["auto", "resolve", "explicit", "forest"]'
|
|
2760
|
+
postlex: Optional[PostLex]
|
|
2761
|
+
priority: 'Optional[Literal["auto", "normal", "invert"]]'
|
|
2762
|
+
lexer_callbacks: Dict[str, Callable[[Token], Token]]
|
|
2763
|
+
use_bytes: bool
|
|
2764
|
+
ordered_sets: bool
|
|
2765
|
+
edit_terminals: Optional[Callable[[TerminalDef], TerminalDef]]
|
|
2766
|
+
import_paths: 'List[Union[str, Callable[[Union[None, str, PackageResource], str], Tuple[str, str]]]]'
|
|
2767
|
+
source_path: Optional[str]
|
|
2768
|
+
|
|
2769
|
+
OPTIONS_DOC = r"""
|
|
2770
|
+
**=== General Options ===**
|
|
2771
|
+
|
|
2772
|
+
start
|
|
2773
|
+
The start symbol. Either a string, or a list of strings for multiple possible starts (Default: "start")
|
|
2774
|
+
debug
|
|
2775
|
+
Display debug information and extra warnings. Use only when debugging (Default: ``False``)
|
|
2776
|
+
When used with Earley, it generates a forest graph as "sppf.png", if 'dot' is installed.
|
|
2777
|
+
strict
|
|
2778
|
+
Throw an exception on any potential ambiguity, including shift/reduce conflicts, and regex collisions.
|
|
2779
|
+
transformer
|
|
2780
|
+
Applies the transformer to every parse tree (equivalent to applying it after the parse, but faster)
|
|
2781
|
+
propagate_positions
|
|
2782
|
+
Propagates positional attributes into the 'meta' attribute of all tree branches.
|
|
2783
|
+
Sets attributes: (line, column, end_line, end_column, start_pos, end_pos,
|
|
2784
|
+
container_line, container_column, container_end_line, container_end_column)
|
|
2785
|
+
Accepts ``False``, ``True``, or a callable, which will filter which nodes to ignore when propagating.
|
|
2786
|
+
maybe_placeholders
|
|
2787
|
+
When ``True``, the ``[]`` operator returns ``None`` when not matched.
|
|
2788
|
+
When ``False``, ``[]`` behaves like the ``?`` operator, and returns no value at all.
|
|
2789
|
+
(default= ``True``)
|
|
2790
|
+
cache
|
|
2791
|
+
Cache the results of the Lark grammar analysis, for x2 to x3 faster loading. LALR only for now.
|
|
2792
|
+
|
|
2793
|
+
- When ``False``, does nothing (default)
|
|
2794
|
+
- When ``True``, caches to a temporary file in the local directory
|
|
2795
|
+
- When given a string, caches to the path pointed by the string
|
|
2796
|
+
regex
|
|
2797
|
+
When True, uses the ``regex`` module instead of the stdlib ``re``.
|
|
2798
|
+
g_regex_flags
|
|
2799
|
+
Flags that are applied to all terminals (both regex and strings)
|
|
2800
|
+
keep_all_tokens
|
|
2801
|
+
Prevent the tree builder from automagically removing "punctuation" tokens (Default: ``False``)
|
|
2802
|
+
tree_class
|
|
2803
|
+
Lark will produce trees comprised of instances of this class instead of the default ``lark.Tree``.
|
|
2804
|
+
|
|
2805
|
+
**=== Algorithm Options ===**
|
|
2806
|
+
|
|
2807
|
+
parser
|
|
2808
|
+
Decides which parser engine to use. Accepts "earley" or "lalr". (Default: "earley").
|
|
2809
|
+
(there is also a "cyk" option for legacy)
|
|
2810
|
+
lexer
|
|
2811
|
+
Decides whether or not to use a lexer stage
|
|
2812
|
+
|
|
2813
|
+
- "auto" (default): Choose for me based on the parser
|
|
2814
|
+
- "basic": Use a basic lexer
|
|
2815
|
+
- "contextual": Stronger lexer (only works with parser="lalr")
|
|
2816
|
+
- "dynamic": Flexible and powerful (only with parser="earley")
|
|
2817
|
+
- "dynamic_complete": Same as dynamic, but tries *every* variation of tokenizing possible.
|
|
2818
|
+
ambiguity
|
|
2819
|
+
Decides how to handle ambiguity in the parse. Only relevant if parser="earley"
|
|
2820
|
+
|
|
2821
|
+
- "resolve": The parser will automatically choose the simplest derivation
|
|
2822
|
+
(it chooses consistently: greedy for tokens, non-greedy for rules)
|
|
2823
|
+
- "explicit": The parser will return all derivations wrapped in "_ambig" tree nodes (i.e. a forest).
|
|
2824
|
+
- "forest": The parser will return the root of the shared packed parse forest.
|
|
2825
|
+
|
|
2826
|
+
**=== Misc. / Domain Specific Options ===**
|
|
2827
|
+
|
|
2828
|
+
postlex
|
|
2829
|
+
Lexer post-processing (Default: ``None``) Only works with the basic and contextual lexers.
|
|
2830
|
+
priority
|
|
2831
|
+
How priorities should be evaluated - "auto", ``None``, "normal", "invert" (Default: "auto")
|
|
2832
|
+
lexer_callbacks
|
|
2833
|
+
Dictionary of callbacks for the lexer. May alter tokens during lexing. Use with caution.
|
|
2834
|
+
use_bytes
|
|
2835
|
+
Accept an input of type ``bytes`` instead of ``str``.
|
|
2836
|
+
ordered_sets
|
|
2837
|
+
Should Earley use ordered-sets to achieve stable output (~10% slower than regular sets. Default: True)
|
|
2838
|
+
edit_terminals
|
|
2839
|
+
A callback for editing the terminals before parse.
|
|
2840
|
+
import_paths
|
|
2841
|
+
A List of either paths or loader functions to specify from where grammars are imported
|
|
2842
|
+
source_path
|
|
2843
|
+
Override the source of from where the grammar was loaded. Useful for relative imports and unconventional grammar loading
|
|
2844
|
+
**=== End of Options ===**
|
|
2845
|
+
"""
|
|
2846
|
+
if __doc__:
|
|
2847
|
+
__doc__ += OPTIONS_DOC
|
|
2848
|
+
|
|
2849
|
+
|
|
2850
|
+
##
|
|
2851
|
+
|
|
2852
|
+
##
|
|
2853
|
+
|
|
2854
|
+
##
|
|
2855
|
+
|
|
2856
|
+
##
|
|
2857
|
+
|
|
2858
|
+
##
|
|
2859
|
+
|
|
2860
|
+
##
|
|
2861
|
+
|
|
2862
|
+
_defaults: Dict[str, Any] = {
|
|
2863
|
+
'debug': False,
|
|
2864
|
+
'strict': False,
|
|
2865
|
+
'keep_all_tokens': False,
|
|
2866
|
+
'tree_class': None,
|
|
2867
|
+
'cache': False,
|
|
2868
|
+
'postlex': None,
|
|
2869
|
+
'parser': 'earley',
|
|
2870
|
+
'lexer': 'auto',
|
|
2871
|
+
'transformer': None,
|
|
2872
|
+
'start': 'start',
|
|
2873
|
+
'priority': 'auto',
|
|
2874
|
+
'ambiguity': 'auto',
|
|
2875
|
+
'regex': False,
|
|
2876
|
+
'propagate_positions': False,
|
|
2877
|
+
'lexer_callbacks': {},
|
|
2878
|
+
'maybe_placeholders': True,
|
|
2879
|
+
'edit_terminals': None,
|
|
2880
|
+
'g_regex_flags': 0,
|
|
2881
|
+
'use_bytes': False,
|
|
2882
|
+
'ordered_sets': True,
|
|
2883
|
+
'import_paths': [],
|
|
2884
|
+
'source_path': None,
|
|
2885
|
+
'_plugins': {},
|
|
2886
|
+
}
|
|
2887
|
+
|
|
2888
|
+
def __init__(self, options_dict: Dict[str, Any]) -> None:
|
|
2889
|
+
o = dict(options_dict)
|
|
2890
|
+
|
|
2891
|
+
options = {}
|
|
2892
|
+
for name, default in self._defaults.items():
|
|
2893
|
+
if name in o:
|
|
2894
|
+
value = o.pop(name)
|
|
2895
|
+
if isinstance(default, bool) and name not in ('cache', 'use_bytes', 'propagate_positions'):
|
|
2896
|
+
value = bool(value)
|
|
2897
|
+
else:
|
|
2898
|
+
value = default
|
|
2899
|
+
|
|
2900
|
+
options[name] = value
|
|
2901
|
+
|
|
2902
|
+
if isinstance(options['start'], str):
|
|
2903
|
+
options['start'] = [options['start']]
|
|
2904
|
+
|
|
2905
|
+
self.__dict__['options'] = options
|
|
2906
|
+
|
|
2907
|
+
|
|
2908
|
+
assert_config(self.parser, ('earley', 'lalr', 'cyk', None))
|
|
2909
|
+
|
|
2910
|
+
if self.parser == 'earley' and self.transformer:
|
|
2911
|
+
raise ConfigurationError('Cannot specify an embedded transformer when using the Earley algorithm. '
|
|
2912
|
+
'Please use your transformer on the resulting parse tree, or use a different algorithm (i.e. LALR)')
|
|
2913
|
+
|
|
2914
|
+
if o:
|
|
2915
|
+
raise ConfigurationError("Unknown options: %s" % o.keys())
|
|
2916
|
+
|
|
2917
|
+
def __getattr__(self, name: str) -> Any:
|
|
2918
|
+
try:
|
|
2919
|
+
return self.__dict__['options'][name]
|
|
2920
|
+
except KeyError as e:
|
|
2921
|
+
raise AttributeError(e)
|
|
2922
|
+
|
|
2923
|
+
def __setattr__(self, name: str, value: str) -> None:
|
|
2924
|
+
assert_config(name, self.options.keys(), "%r isn't a valid option. Expected one of: %s")
|
|
2925
|
+
self.options[name] = value
|
|
2926
|
+
|
|
2927
|
+
def serialize(self, memo = None) -> Dict[str, Any]:
|
|
2928
|
+
return self.options
|
|
2929
|
+
|
|
2930
|
+
@classmethod
|
|
2931
|
+
def deserialize(cls, data: Dict[str, Any], memo: Dict[int, Union[TerminalDef, Rule]]) -> "LarkOptions":
|
|
2932
|
+
return cls(data)
|
|
2933
|
+
|
|
2934
|
+
|
|
2935
|
+
##
|
|
2936
|
+
|
|
2937
|
+
##
|
|
2938
|
+
|
|
2939
|
+
_LOAD_ALLOWED_OPTIONS = {'postlex', 'transformer', 'lexer_callbacks', 'use_bytes', 'debug', 'g_regex_flags', 'regex', 'propagate_positions', 'tree_class', '_plugins'}
|
|
2940
|
+
|
|
2941
|
+
_VALID_PRIORITY_OPTIONS = ('auto', 'normal', 'invert', None)
|
|
2942
|
+
_VALID_AMBIGUITY_OPTIONS = ('auto', 'resolve', 'explicit', 'forest')
|
|
2943
|
+
|
|
2944
|
+
|
|
2945
|
+
_T = TypeVar('_T', bound="Lark")
|
|
2946
|
+
|
|
2947
|
+
class Lark(Serialize):
|
|
2948
|
+
#--
|
|
2949
|
+
|
|
2950
|
+
source_path: str
|
|
2951
|
+
source_grammar: str
|
|
2952
|
+
grammar: 'Grammar'
|
|
2953
|
+
options: LarkOptions
|
|
2954
|
+
lexer: Lexer
|
|
2955
|
+
parser: 'ParsingFrontend'
|
|
2956
|
+
terminals: Collection[TerminalDef]
|
|
2957
|
+
|
|
2958
|
+
def __init__(self, grammar: 'Union[Grammar, str, IO[str]]', **options) -> None:
|
|
2959
|
+
self.options = LarkOptions(options)
|
|
2960
|
+
re_module: types.ModuleType
|
|
2961
|
+
|
|
2962
|
+
##
|
|
2963
|
+
|
|
2964
|
+
use_regex = self.options.regex
|
|
2965
|
+
if use_regex:
|
|
2966
|
+
if _has_regex:
|
|
2967
|
+
re_module = regex
|
|
2968
|
+
else:
|
|
2969
|
+
raise ImportError('`regex` module must be installed if calling `Lark(regex=True)`.')
|
|
2970
|
+
else:
|
|
2971
|
+
re_module = re
|
|
2972
|
+
|
|
2973
|
+
##
|
|
2974
|
+
|
|
2975
|
+
if self.options.source_path is None:
|
|
2976
|
+
try:
|
|
2977
|
+
self.source_path = grammar.name ##
|
|
2978
|
+
|
|
2979
|
+
except AttributeError:
|
|
2980
|
+
self.source_path = '<string>'
|
|
2981
|
+
else:
|
|
2982
|
+
self.source_path = self.options.source_path
|
|
2983
|
+
|
|
2984
|
+
##
|
|
2985
|
+
|
|
2986
|
+
try:
|
|
2987
|
+
read = grammar.read ##
|
|
2988
|
+
|
|
2989
|
+
except AttributeError:
|
|
2990
|
+
pass
|
|
2991
|
+
else:
|
|
2992
|
+
grammar = read()
|
|
2993
|
+
|
|
2994
|
+
cache_fn = None
|
|
2995
|
+
cache_sha256 = None
|
|
2996
|
+
if isinstance(grammar, str):
|
|
2997
|
+
self.source_grammar = grammar
|
|
2998
|
+
if self.options.use_bytes:
|
|
2999
|
+
if not grammar.isascii():
|
|
3000
|
+
raise ConfigurationError("Grammar must be ascii only, when use_bytes=True")
|
|
3001
|
+
|
|
3002
|
+
if self.options.cache:
|
|
3003
|
+
if self.options.parser != 'lalr':
|
|
3004
|
+
raise ConfigurationError("cache only works with parser='lalr' for now")
|
|
3005
|
+
|
|
3006
|
+
unhashable = ('transformer', 'postlex', 'lexer_callbacks', 'edit_terminals', '_plugins')
|
|
3007
|
+
options_str = ''.join(k+str(v) for k, v in options.items() if k not in unhashable)
|
|
3008
|
+
from . import __version__
|
|
3009
|
+
s = grammar + options_str + __version__ + str(sys.version_info[:2])
|
|
3010
|
+
cache_sha256 = sha256_digest(s)
|
|
3011
|
+
|
|
3012
|
+
if isinstance(self.options.cache, str):
|
|
3013
|
+
cache_fn = self.options.cache
|
|
3014
|
+
else:
|
|
3015
|
+
if self.options.cache is not True:
|
|
3016
|
+
raise ConfigurationError("cache argument must be bool or str")
|
|
3017
|
+
|
|
3018
|
+
try:
|
|
3019
|
+
username = getpass.getuser()
|
|
3020
|
+
except Exception:
|
|
3021
|
+
##
|
|
3022
|
+
|
|
3023
|
+
##
|
|
3024
|
+
|
|
3025
|
+
##
|
|
3026
|
+
|
|
3027
|
+
username = "unknown"
|
|
3028
|
+
|
|
3029
|
+
cache_fn = tempfile.gettempdir() + "/.lark_cache_%s_%s_%s_%s.tmp" % (username, cache_sha256, *sys.version_info[:2])
|
|
3030
|
+
|
|
3031
|
+
old_options = self.options
|
|
3032
|
+
try:
|
|
3033
|
+
with FS.open(cache_fn, 'rb') as f:
|
|
3034
|
+
logger.debug('Loading grammar from cache: %s', cache_fn)
|
|
3035
|
+
##
|
|
3036
|
+
|
|
3037
|
+
for name in (set(options) - _LOAD_ALLOWED_OPTIONS):
|
|
3038
|
+
del options[name]
|
|
3039
|
+
file_sha256 = f.readline().rstrip(b'\n')
|
|
3040
|
+
cached_used_files = pickle.load(f)
|
|
3041
|
+
if file_sha256 == cache_sha256.encode('utf8') and verify_used_files(cached_used_files):
|
|
3042
|
+
cached_parser_data = pickle.load(f)
|
|
3043
|
+
self._load(cached_parser_data, **options)
|
|
3044
|
+
return
|
|
3045
|
+
except FileNotFoundError:
|
|
3046
|
+
##
|
|
3047
|
+
|
|
3048
|
+
pass
|
|
3049
|
+
except Exception: ##
|
|
3050
|
+
|
|
3051
|
+
logger.exception("Failed to load Lark from cache: %r. We will try to carry on.", cache_fn)
|
|
3052
|
+
|
|
3053
|
+
##
|
|
3054
|
+
|
|
3055
|
+
##
|
|
3056
|
+
|
|
3057
|
+
self.options = old_options
|
|
3058
|
+
|
|
3059
|
+
|
|
3060
|
+
##
|
|
3061
|
+
|
|
3062
|
+
self.grammar, used_files = load_grammar(grammar, self.source_path, self.options.import_paths, self.options.keep_all_tokens)
|
|
3063
|
+
else:
|
|
3064
|
+
assert isinstance(grammar, Grammar)
|
|
3065
|
+
self.grammar = grammar
|
|
3066
|
+
|
|
3067
|
+
|
|
3068
|
+
if self.options.lexer == 'auto':
|
|
3069
|
+
if self.options.parser == 'lalr':
|
|
3070
|
+
self.options.lexer = 'contextual'
|
|
3071
|
+
elif self.options.parser == 'earley':
|
|
3072
|
+
if self.options.postlex is not None:
|
|
3073
|
+
logger.info("postlex can't be used with the dynamic lexer, so we use 'basic' instead. "
|
|
3074
|
+
"Consider using lalr with contextual instead of earley")
|
|
3075
|
+
self.options.lexer = 'basic'
|
|
3076
|
+
else:
|
|
3077
|
+
self.options.lexer = 'dynamic'
|
|
3078
|
+
elif self.options.parser == 'cyk':
|
|
3079
|
+
self.options.lexer = 'basic'
|
|
3080
|
+
else:
|
|
3081
|
+
assert False, self.options.parser
|
|
3082
|
+
lexer = self.options.lexer
|
|
3083
|
+
if isinstance(lexer, type):
|
|
3084
|
+
assert issubclass(lexer, Lexer) ##
|
|
3085
|
+
|
|
3086
|
+
else:
|
|
3087
|
+
assert_config(lexer, ('basic', 'contextual', 'dynamic', 'dynamic_complete'))
|
|
3088
|
+
if self.options.postlex is not None and 'dynamic' in lexer:
|
|
3089
|
+
raise ConfigurationError("Can't use postlex with a dynamic lexer. Use basic or contextual instead")
|
|
3090
|
+
|
|
3091
|
+
if self.options.ambiguity == 'auto':
|
|
3092
|
+
if self.options.parser == 'earley':
|
|
3093
|
+
self.options.ambiguity = 'resolve'
|
|
3094
|
+
else:
|
|
3095
|
+
assert_config(self.options.parser, ('earley', 'cyk'), "%r doesn't support disambiguation. Use one of these parsers instead: %s")
|
|
3096
|
+
|
|
3097
|
+
if self.options.priority == 'auto':
|
|
3098
|
+
self.options.priority = 'normal'
|
|
3099
|
+
|
|
3100
|
+
if self.options.priority not in _VALID_PRIORITY_OPTIONS:
|
|
3101
|
+
raise ConfigurationError("invalid priority option: %r. Must be one of %r" % (self.options.priority, _VALID_PRIORITY_OPTIONS))
|
|
3102
|
+
if self.options.ambiguity not in _VALID_AMBIGUITY_OPTIONS:
|
|
3103
|
+
raise ConfigurationError("invalid ambiguity option: %r. Must be one of %r" % (self.options.ambiguity, _VALID_AMBIGUITY_OPTIONS))
|
|
3104
|
+
|
|
3105
|
+
if self.options.parser is None:
|
|
3106
|
+
terminals_to_keep = '*'
|
|
3107
|
+
elif self.options.postlex is not None:
|
|
3108
|
+
terminals_to_keep = set(self.options.postlex.always_accept)
|
|
3109
|
+
else:
|
|
3110
|
+
terminals_to_keep = set()
|
|
3111
|
+
|
|
3112
|
+
##
|
|
3113
|
+
|
|
3114
|
+
self.terminals, self.rules, self.ignore_tokens = self.grammar.compile(self.options.start, terminals_to_keep)
|
|
3115
|
+
|
|
3116
|
+
if self.options.edit_terminals:
|
|
3117
|
+
for t in self.terminals:
|
|
3118
|
+
self.options.edit_terminals(t)
|
|
3119
|
+
|
|
3120
|
+
self._terminals_dict = {t.name: t for t in self.terminals}
|
|
3121
|
+
|
|
3122
|
+
##
|
|
3123
|
+
|
|
3124
|
+
if self.options.priority == 'invert':
|
|
3125
|
+
for rule in self.rules:
|
|
3126
|
+
if rule.options.priority is not None:
|
|
3127
|
+
rule.options.priority = -rule.options.priority
|
|
3128
|
+
for term in self.terminals:
|
|
3129
|
+
term.priority = -term.priority
|
|
3130
|
+
##
|
|
3131
|
+
|
|
3132
|
+
##
|
|
3133
|
+
|
|
3134
|
+
##
|
|
3135
|
+
|
|
3136
|
+
elif self.options.priority is None:
|
|
3137
|
+
for rule in self.rules:
|
|
3138
|
+
if rule.options.priority is not None:
|
|
3139
|
+
rule.options.priority = None
|
|
3140
|
+
for term in self.terminals:
|
|
3141
|
+
term.priority = 0
|
|
3142
|
+
|
|
3143
|
+
##
|
|
3144
|
+
|
|
3145
|
+
self.lexer_conf = LexerConf(
|
|
3146
|
+
self.terminals, re_module, self.ignore_tokens, self.options.postlex,
|
|
3147
|
+
self.options.lexer_callbacks, self.options.g_regex_flags, use_bytes=self.options.use_bytes, strict=self.options.strict
|
|
3148
|
+
)
|
|
3149
|
+
|
|
3150
|
+
if self.options.parser:
|
|
3151
|
+
self.parser = self._build_parser()
|
|
3152
|
+
elif lexer:
|
|
3153
|
+
self.lexer = self._build_lexer()
|
|
3154
|
+
|
|
3155
|
+
if cache_fn:
|
|
3156
|
+
logger.debug('Saving grammar to cache: %s', cache_fn)
|
|
3157
|
+
try:
|
|
3158
|
+
with FS.open(cache_fn, 'wb') as f:
|
|
3159
|
+
assert cache_sha256 is not None
|
|
3160
|
+
f.write(cache_sha256.encode('utf8') + b'\n')
|
|
3161
|
+
pickle.dump(used_files, f)
|
|
3162
|
+
self.save(f, _LOAD_ALLOWED_OPTIONS)
|
|
3163
|
+
except IOError as e:
|
|
3164
|
+
logger.exception("Failed to save Lark to cache: %r.", cache_fn, e)
|
|
3165
|
+
|
|
3166
|
+
if __doc__:
|
|
3167
|
+
__doc__ += "\n\n" + LarkOptions.OPTIONS_DOC
|
|
3168
|
+
|
|
3169
|
+
__serialize_fields__ = 'parser', 'rules', 'options'
|
|
3170
|
+
|
|
3171
|
+
def _build_lexer(self, dont_ignore: bool=False) -> BasicLexer:
|
|
3172
|
+
lexer_conf = self.lexer_conf
|
|
3173
|
+
if dont_ignore:
|
|
3174
|
+
from copy import copy
|
|
3175
|
+
lexer_conf = copy(lexer_conf)
|
|
3176
|
+
lexer_conf.ignore = ()
|
|
3177
|
+
return BasicLexer(lexer_conf)
|
|
3178
|
+
|
|
3179
|
+
def _prepare_callbacks(self) -> None:
|
|
3180
|
+
self._callbacks = {}
|
|
3181
|
+
##
|
|
3182
|
+
|
|
3183
|
+
if self.options.ambiguity != 'forest':
|
|
3184
|
+
self._parse_tree_builder = ParseTreeBuilder(
|
|
3185
|
+
self.rules,
|
|
3186
|
+
self.options.tree_class or Tree,
|
|
3187
|
+
self.options.propagate_positions,
|
|
3188
|
+
self.options.parser != 'lalr' and self.options.ambiguity == 'explicit',
|
|
3189
|
+
self.options.maybe_placeholders
|
|
3190
|
+
)
|
|
3191
|
+
self._callbacks = self._parse_tree_builder.create_callback(self.options.transformer)
|
|
3192
|
+
self._callbacks.update(_get_lexer_callbacks(self.options.transformer, self.terminals))
|
|
3193
|
+
|
|
3194
|
+
def _build_parser(self) -> "ParsingFrontend":
|
|
3195
|
+
self._prepare_callbacks()
|
|
3196
|
+
_validate_frontend_args(self.options.parser, self.options.lexer)
|
|
3197
|
+
parser_conf = ParserConf(self.rules, self._callbacks, self.options.start)
|
|
3198
|
+
return _construct_parsing_frontend(
|
|
3199
|
+
self.options.parser,
|
|
3200
|
+
self.options.lexer,
|
|
3201
|
+
self.lexer_conf,
|
|
3202
|
+
parser_conf,
|
|
3203
|
+
options=self.options
|
|
3204
|
+
)
|
|
3205
|
+
|
|
3206
|
+
def save(self, f, exclude_options: Collection[str] = ()) -> None:
|
|
3207
|
+
#--
|
|
3208
|
+
if self.options.parser != 'lalr':
|
|
3209
|
+
raise NotImplementedError("Lark.save() is only implemented for the LALR(1) parser.")
|
|
3210
|
+
data, m = self.memo_serialize([TerminalDef, Rule])
|
|
3211
|
+
if exclude_options:
|
|
3212
|
+
data["options"] = {n: v for n, v in data["options"].items() if n not in exclude_options}
|
|
3213
|
+
pickle.dump({'data': data, 'memo': m}, f, protocol=pickle.HIGHEST_PROTOCOL)
|
|
3214
|
+
|
|
3215
|
+
@classmethod
|
|
3216
|
+
def load(cls: Type[_T], f) -> _T:
|
|
3217
|
+
#--
|
|
3218
|
+
inst = cls.__new__(cls)
|
|
3219
|
+
return inst._load(f)
|
|
3220
|
+
|
|
3221
|
+
def _deserialize_lexer_conf(self, data: Dict[str, Any], memo: Dict[int, Union[TerminalDef, Rule]], options: LarkOptions) -> LexerConf:
|
|
3222
|
+
lexer_conf = LexerConf.deserialize(data['lexer_conf'], memo)
|
|
3223
|
+
lexer_conf.callbacks = options.lexer_callbacks or {}
|
|
3224
|
+
lexer_conf.re_module = regex if options.regex else re
|
|
3225
|
+
lexer_conf.use_bytes = options.use_bytes
|
|
3226
|
+
lexer_conf.g_regex_flags = options.g_regex_flags
|
|
3227
|
+
lexer_conf.skip_validation = True
|
|
3228
|
+
lexer_conf.postlex = options.postlex
|
|
3229
|
+
return lexer_conf
|
|
3230
|
+
|
|
3231
|
+
def _load(self: _T, f: Any, **kwargs) -> _T:
|
|
3232
|
+
if isinstance(f, dict):
|
|
3233
|
+
d = f
|
|
3234
|
+
else:
|
|
3235
|
+
d = pickle.load(f)
|
|
3236
|
+
memo_json = d['memo']
|
|
3237
|
+
data = d['data']
|
|
3238
|
+
|
|
3239
|
+
assert memo_json
|
|
3240
|
+
memo = SerializeMemoizer.deserialize(memo_json, {'Rule': Rule, 'TerminalDef': TerminalDef}, {})
|
|
3241
|
+
options = dict(data['options'])
|
|
3242
|
+
if (set(kwargs) - _LOAD_ALLOWED_OPTIONS) & set(LarkOptions._defaults):
|
|
3243
|
+
raise ConfigurationError("Some options are not allowed when loading a Parser: {}"
|
|
3244
|
+
.format(set(kwargs) - _LOAD_ALLOWED_OPTIONS))
|
|
3245
|
+
options.update(kwargs)
|
|
3246
|
+
self.options = LarkOptions.deserialize(options, memo)
|
|
3247
|
+
self.rules = [Rule.deserialize(r, memo) for r in data['rules']]
|
|
3248
|
+
self.source_path = '<deserialized>'
|
|
3249
|
+
_validate_frontend_args(self.options.parser, self.options.lexer)
|
|
3250
|
+
self.lexer_conf = self._deserialize_lexer_conf(data['parser'], memo, self.options)
|
|
3251
|
+
self.terminals = self.lexer_conf.terminals
|
|
3252
|
+
self._prepare_callbacks()
|
|
3253
|
+
self._terminals_dict = {t.name: t for t in self.terminals}
|
|
3254
|
+
self.parser = _deserialize_parsing_frontend(
|
|
3255
|
+
data['parser'],
|
|
3256
|
+
memo,
|
|
3257
|
+
self.lexer_conf,
|
|
3258
|
+
self._callbacks,
|
|
3259
|
+
self.options, ##
|
|
3260
|
+
|
|
3261
|
+
)
|
|
3262
|
+
return self
|
|
3263
|
+
|
|
3264
|
+
@classmethod
|
|
3265
|
+
def _load_from_dict(cls, data, memo, **kwargs):
|
|
3266
|
+
inst = cls.__new__(cls)
|
|
3267
|
+
return inst._load({'data': data, 'memo': memo}, **kwargs)
|
|
3268
|
+
|
|
3269
|
+
@classmethod
|
|
3270
|
+
def open(cls: Type[_T], grammar_filename: str, rel_to: Optional[str]=None, **options) -> _T:
|
|
3271
|
+
#--
|
|
3272
|
+
if rel_to:
|
|
3273
|
+
basepath = os.path.dirname(rel_to)
|
|
3274
|
+
grammar_filename = os.path.join(basepath, grammar_filename)
|
|
3275
|
+
with open(grammar_filename, encoding='utf8') as f:
|
|
3276
|
+
return cls(f, **options)
|
|
3277
|
+
|
|
3278
|
+
@classmethod
|
|
3279
|
+
def open_from_package(cls: Type[_T], package: str, grammar_path: str, search_paths: 'Sequence[str]'=[""], **options) -> _T:
|
|
3280
|
+
#--
|
|
3281
|
+
package_loader = FromPackageLoader(package, search_paths)
|
|
3282
|
+
full_path, text = package_loader(None, grammar_path)
|
|
3283
|
+
options.setdefault('source_path', full_path)
|
|
3284
|
+
options.setdefault('import_paths', [])
|
|
3285
|
+
options['import_paths'].append(package_loader)
|
|
3286
|
+
return cls(text, **options)
|
|
3287
|
+
|
|
3288
|
+
def __repr__(self):
|
|
3289
|
+
return 'Lark(open(%r), parser=%r, lexer=%r, ...)' % (self.source_path, self.options.parser, self.options.lexer)
|
|
3290
|
+
|
|
3291
|
+
|
|
3292
|
+
def lex(self, text: str, dont_ignore: bool=False) -> Iterator[Token]:
|
|
3293
|
+
#--
|
|
3294
|
+
lexer: Lexer
|
|
3295
|
+
if not hasattr(self, 'lexer') or dont_ignore:
|
|
3296
|
+
lexer = self._build_lexer(dont_ignore)
|
|
3297
|
+
else:
|
|
3298
|
+
lexer = self.lexer
|
|
3299
|
+
lexer_thread = LexerThread.from_text(lexer, text)
|
|
3300
|
+
stream = lexer_thread.lex(None)
|
|
3301
|
+
if self.options.postlex:
|
|
3302
|
+
return self.options.postlex.process(stream)
|
|
3303
|
+
return stream
|
|
3304
|
+
|
|
3305
|
+
def get_terminal(self, name: str) -> TerminalDef:
|
|
3306
|
+
#--
|
|
3307
|
+
return self._terminals_dict[name]
|
|
3308
|
+
|
|
3309
|
+
def parse_interactive(self, text: Optional[str]=None, start: Optional[str]=None) -> 'InteractiveParser':
|
|
3310
|
+
#--
|
|
3311
|
+
return self.parser.parse_interactive(text, start=start)
|
|
3312
|
+
|
|
3313
|
+
def parse(self, text: str, start: Optional[str]=None, on_error: 'Optional[Callable[[UnexpectedInput], bool]]'=None) -> 'ParseTree':
|
|
3314
|
+
#--
|
|
3315
|
+
return self.parser.parse(text, start=start, on_error=on_error)
|
|
3316
|
+
|
|
3317
|
+
|
|
3318
|
+
|
|
3319
|
+
|
|
3320
|
+
class DedentError(LarkError):
|
|
3321
|
+
pass
|
|
3322
|
+
|
|
3323
|
+
class Indenter(PostLex, ABC):
|
|
3324
|
+
#--
|
|
3325
|
+
paren_level: int
|
|
3326
|
+
indent_level: List[int]
|
|
3327
|
+
|
|
3328
|
+
def __init__(self) -> None:
|
|
3329
|
+
self.paren_level = 0
|
|
3330
|
+
self.indent_level = [0]
|
|
3331
|
+
assert self.tab_len > 0
|
|
3332
|
+
|
|
3333
|
+
def handle_NL(self, token: Token) -> Iterator[Token]:
|
|
3334
|
+
if self.paren_level > 0:
|
|
3335
|
+
return
|
|
3336
|
+
|
|
3337
|
+
yield token
|
|
3338
|
+
|
|
3339
|
+
indent_str = token.rsplit('\n', 1)[1] ##
|
|
3340
|
+
|
|
3341
|
+
indent = indent_str.count(' ') + indent_str.count('\t') * self.tab_len
|
|
3342
|
+
|
|
3343
|
+
if indent > self.indent_level[-1]:
|
|
3344
|
+
self.indent_level.append(indent)
|
|
3345
|
+
yield Token.new_borrow_pos(self.INDENT_type, indent_str, token)
|
|
3346
|
+
else:
|
|
3347
|
+
while indent < self.indent_level[-1]:
|
|
3348
|
+
self.indent_level.pop()
|
|
3349
|
+
yield Token.new_borrow_pos(self.DEDENT_type, indent_str, token)
|
|
3350
|
+
|
|
3351
|
+
if indent != self.indent_level[-1]:
|
|
3352
|
+
raise DedentError('Unexpected dedent to column %s. Expected dedent to %s' % (indent, self.indent_level[-1]))
|
|
3353
|
+
|
|
3354
|
+
def _process(self, stream):
|
|
3355
|
+
for token in stream:
|
|
3356
|
+
if token.type == self.NL_type:
|
|
3357
|
+
yield from self.handle_NL(token)
|
|
3358
|
+
else:
|
|
3359
|
+
yield token
|
|
3360
|
+
|
|
3361
|
+
if token.type in self.OPEN_PAREN_types:
|
|
3362
|
+
self.paren_level += 1
|
|
3363
|
+
elif token.type in self.CLOSE_PAREN_types:
|
|
3364
|
+
self.paren_level -= 1
|
|
3365
|
+
assert self.paren_level >= 0
|
|
3366
|
+
|
|
3367
|
+
while len(self.indent_level) > 1:
|
|
3368
|
+
self.indent_level.pop()
|
|
3369
|
+
yield Token(self.DEDENT_type, '')
|
|
3370
|
+
|
|
3371
|
+
assert self.indent_level == [0], self.indent_level
|
|
3372
|
+
|
|
3373
|
+
def process(self, stream):
|
|
3374
|
+
self.paren_level = 0
|
|
3375
|
+
self.indent_level = [0]
|
|
3376
|
+
return self._process(stream)
|
|
3377
|
+
|
|
3378
|
+
##
|
|
3379
|
+
|
|
3380
|
+
@property
|
|
3381
|
+
def always_accept(self):
|
|
3382
|
+
return (self.NL_type,)
|
|
3383
|
+
|
|
3384
|
+
@property
|
|
3385
|
+
@abstractmethod
|
|
3386
|
+
def NL_type(self) -> str:
|
|
3387
|
+
#--
|
|
3388
|
+
raise NotImplementedError()
|
|
3389
|
+
|
|
3390
|
+
@property
|
|
3391
|
+
@abstractmethod
|
|
3392
|
+
def OPEN_PAREN_types(self) -> List[str]:
|
|
3393
|
+
#--
|
|
3394
|
+
raise NotImplementedError()
|
|
3395
|
+
|
|
3396
|
+
@property
|
|
3397
|
+
@abstractmethod
|
|
3398
|
+
def CLOSE_PAREN_types(self) -> List[str]:
|
|
3399
|
+
#--
|
|
3400
|
+
raise NotImplementedError()
|
|
3401
|
+
|
|
3402
|
+
@property
|
|
3403
|
+
@abstractmethod
|
|
3404
|
+
def INDENT_type(self) -> str:
|
|
3405
|
+
#--
|
|
3406
|
+
raise NotImplementedError()
|
|
3407
|
+
|
|
3408
|
+
@property
|
|
3409
|
+
@abstractmethod
|
|
3410
|
+
def DEDENT_type(self) -> str:
|
|
3411
|
+
#--
|
|
3412
|
+
raise NotImplementedError()
|
|
3413
|
+
|
|
3414
|
+
@property
|
|
3415
|
+
@abstractmethod
|
|
3416
|
+
def tab_len(self) -> int:
|
|
3417
|
+
#--
|
|
3418
|
+
raise NotImplementedError()
|
|
3419
|
+
|
|
3420
|
+
|
|
3421
|
+
class PythonIndenter(Indenter):
|
|
3422
|
+
#--
|
|
3423
|
+
|
|
3424
|
+
NL_type = '_NEWLINE'
|
|
3425
|
+
OPEN_PAREN_types = ['LPAR', 'LSQB', 'LBRACE']
|
|
3426
|
+
CLOSE_PAREN_types = ['RPAR', 'RSQB', 'RBRACE']
|
|
3427
|
+
INDENT_type = '_INDENT'
|
|
3428
|
+
DEDENT_type = '_DEDENT'
|
|
3429
|
+
tab_len = 8
|
|
3430
|
+
|
|
3431
|
+
|
|
3432
|
+
import pickle, zlib, base64
|
|
3433
|
+
DATA = (
|
|
3434
|
+
b'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K9Wze9q62q+0vEp9sGO2BlerM2hMq72rZ/DcBNVr2rsODG5rhbM56mLYax+oVO95oG3XkFmEnKvzXJSzV+fidHSN2hbHZBwXqiq0tQJrQWvVpDPb1t52cDBCRsPq46y9mPm+zrmQxEM25C1JR6v1yXBmgAnu0RpnU86Fe5tLLUtHI4U6Lml3NU+bbfSno7WFJlWznxZVb2mnqtm7OnWIRLg1r6ovTE1qNcFBzQzxhuqT1quzY59JRzeoUy9flo42OJso3N78ZVk62ujsqLxOzFPqPZvMJLOZqHNpbCx0elwd7tqXjm5SnzTITiku2ixeof9is9q1QdZ1tmisUCf3v3cFm8/0paNxZ3NEwmuNSh33LeqdTdJk9ilhDvtQDmdfqWZAS6FNjnQuno5uLUxNbm2F/doDpz6w1XkXnc9pB+qyW7LUm45uU5937vF0tM15G+eRg9fgxepttqtjhafS0Xblfmaav6yjdjgffO4ysRNsaTraWZia1tr6+xHKbrI6ZTvU5FB/6diceVTt807j/Oec0m6ccv4r1UmST6Sju2yYGJrEdkfUzLzK8ezfi6L2s73p7tR5joPYgqzzv0hBdE9xbzpSqAafK1KDIjXIutSgWA0O66dcanC1HrjVyzcrPU89cL9+YJga3K4Hw9XgVj0YoQYBNeiO6AJwZKSWK51+RfXkKNBo0BjQ+aAS0FjQONB40ATQRNAFoEmgyaApoKmgaaALQdNBM0AXgWaCLgZdAroUNAt0GWg2aA7octBc0DzQfFApaAHoCtBC0CLQYtAS0FKQB1QG8oJ8oGUgP6gcFAAtB60ArQStAq0GBUEVoEpQCLQGVAVaCwqD1oGqQTWgCKgWFAXVgepB60EbQA2gRlATaCNoE6gZtBkUA8VBW0AJUAtoK6gVtA3UBtoOagd1gDpBO0A7JXVHiqRTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC44pQtO6YJTuuCULjilC07pglO64JQuOKULTumCU7rglC7jlMXaKa+0j32wSL9iF+gq0NWg3aAa0B7QXtA+UB1oImg/6BrQAdBB0HxQF6gb1AC6FnQdqAe0EHQ9KAlaAvKAbgC9AeQHHQLdCLoJtAWUAN0MugX0RtCtoNtAt4PWgHpBd4B8oJWgO0HDQdNBI0BuUDHoLlAbqAA0DHQ36DAoBboHdAR0L+g+0P2gB0APgtKgh0APgx4BPQp6DPQ46AlQE+hJ0DTQU6CnQc+AngXVg/pAz4GeB5WAXgCNBI0CjQaNAY0DjQdNAE0CTQHNAM2U1B1xvXxRYKgWoKsDB/XgTWrgK+wV1YFXVRVwH9KHrSB6ofrTg5Hz9KcNZnHLi/X2hEGXgNaCakGzQLNBk0FzQfNAjaCNoEWgxaClIA+oGVQG8oHiID9oGSgAagGtAG0FtYKCoErQNlAHqBNUCtoJqpLUHRmmz7dfnf536lnxd2qiLXYOV0EkqPTN6omrCp04UxDdrQcH9EQsdLy/IJrSg7eowTv0YJ8afFAP3qoGb9aDwbygB3lBD/KCHkSEHmQJPcgSepAX9CAv6EEm0INMoAeZQA+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ+ifQ8ieg9ieA9ieA9ieA9ieA9ieA8ibA8ieg9ieA9ieA9ieA9yqR7EcEM1oDtAPtBK0J2g4aDpIDdoGKgYdBeoDVQAGgF6HPQEqAl0GPQkaBroKdDToGdAz4LqQfeD+kDPgZ4HlYBekNQdGa594LA6IneIT59YLN/T0OOSuiMjXm3JWleqr/tfB6eR+u2bFE4oFPOjE+tmQ/tBKyV1R0bJeo4b9Rw36jlu1HPcqOe4Uc9xo57jRj3HjXqOG/UcN+o5btRz3KjnuFHPcaOe40Y9x416jhv1HDfqOW7Uc9yo57hRz3GjnuNGPceNeo4b9Rw36jlu1HPcqOe4Uc9xo57jRj3HjXqOG/UcN+o5btRz3KjnuFHPcaOe40Y9x416jhv1HDfqOW7Uc9yYl27Uc9yo57hRz3GjnuNGPceNeo4bs9uNeo4b9Rw36jlu1HPcqOe4Uc9xo57jRj3HjXqOG/UcN+o5btRz3KjnuFHPcaOe40Y9x416jhv1HDfqOW7Uc9yo57hRz3GjnuNGPceNeo4b9Rw36jlu1HPcqOe4Uc9xo57jRj3HjXqOG/UcN+o5btRz3KjnuFHPcaOe40Y9x416jhv1HLdxytHaKWuU4a7URvz3avBQsXMUCqKn9eAf1ODBImeWF0RucWZ0QeRypW9TepnSt6sXfFy/8h1q8AH9yoy2dT34RzXYV+gc74LozfqRd6o/+o7Sd6kHPqQfeLca/LTIOV0F0QN68B41eH+xM80Lou8tdq7EgmixHhxVg279fu9Vg6/pF79PDZbop/5JDaqKnQNREN2gB+/XUabQMaqCaLLIuYYLokuLHXsqiP5KP/IBNXiu0Dl5BdHP6Ef+WQ2uKXZOhPqrYsePC6KH9KBfDXqLHc8qiG7WL/6gGlTrRz6kBm/Vj3xYBzs9yKrBw4WObRVE31fkzP+CaFi/+CNq8P0i5ywVRAf0IKcGPyhyrt6C6C+LHCsqiH5JD46pwYki51IuiO7Vb/hRNThb5EycguhP9OBF/RGFjrkVRAuKndlXEG3Qg4+pwc+LHFcqiB7Xg3/Rf6Wf+rjeCz34hBrU6qc+qQZb9SOfUoOj+g0/rQbvKXTMSZ2vQsdDCqK/KXIu4ILoMT24WA1mFjuXg1pT6sG/qsHFevAZNZilB/+mBvP14LNqcEWxcyUVRC8pdqymIDqn2HG8gmhQDz6nBiv04PN6oVvkmExB9NEix4kKoqFi54IqiK7Sgy+oQY0efFEN6oudq6sgulMP5qlBa7HjbQXRK/Vgvn6Nfp9FavCMXf9E+/TgS2rweLFzeRREXyxy3KRA5Upq8GU1uFEPLlGD7+jBV9TghiLHCwui1+pBQA1+qAdL1GCZk8mMOaR9uyC63qWX2efry+yreu/1Ufya3lc9KFGDuiLH5dQVqB+ZpgaPufQblNg3mO6s08fqN9DL9jt1lvWsuo4S+kXjZKITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITR6ITN4nO+D+28HWXGozVg8fVYN2rLIV1RybozxssaRxxltLFoAKQGzQMNEJSd2Sifme1eZGa3qFCReTT4gI1cJeElRI8EqZJaJKwX0B35AL9qferT+3pFcWSQvFJlppAhyV1Rybpd1FHNNLde67sMAFlhwkoO0ww+zxZ/93gYz9GoefHKPf9GMWVH6Pw8mNT+pjylyyBqiMUfbczAaYeMmE96sTvaWbHzYZMQa1oCqo1U1ABmoKq2RRUlaagvjbF7NyF+nOeUB/7jWIxIV6UE+JFOSFedP5qukwjjiCNOII04gjSiCNII44gjTiCNOII0ogjSCOOII04gjTiCNKII0gjjiCNOII04gjSiCNII44gjTiCNOII0ogjSCOOII04Yib0DHleJ+O8TsZ5nYzzOhnndTLO62Sc18nmvF4kz1ACZyiBM5TAGUrgDCVwhhI4QwmcoQTOUAJnKIEzlMAZSuAMJXCGEjhDCZyhBM5QAmcogTOUwBlK4AwlcIYSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSSPQSCLMJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJJHoJ48gz/0BFS1dAxutQ/Xpp6/+v0tbrFa3ev2hF6+LB7+Ya5Hdz7YgYhvaDVkrqjlwiM5kkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkkMpkk5mUSmUwSmUwSmUwSmUwSmUwSmUwSszuJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCaJTCZpnPJSW0EIOBWEWfb7gCudLxQuk33YR9FvdRT9VkfRYXUUHVZH0b1zFP1WR9FvZWgfqA40EbQfdA3oAOggaD6oC9QNagBdC7oO1ANaCLoelAQtAXlAN4DeAPKDDoFuBN0E2gJKgG4G3QJ6I+hW0G2g20FrQL2gO0A+0ErQnaDhoOmgESA3qBh0F6gNVAAaBrobdBiUAt0DOgK6F3Qf6H7QA6AHQWnQQ6CHQY+AHgU9Bnoc9ASoCfQkaBroKdDToGdAz4LqQX2g50DPg0pAL4BGgkaBRoPGgMaBxoMmgCaBpoBmgGZK6o7M1g77dWW4awsdQyuIXq7T6W/o1ZyprRZEv6oz5G+qwdv04FtqsMhJlefov/22Xn0UOhOxIPp2pyZ8+cuvTfWS9H79yqF+ulfff+FWL/imfsFLV6vfUYOTr51l6zg1OKNf83+wfh3sKDy3kB2vBhUvv6IdalH8P1jaDrVODq1x0c9/HRokX2H5O9Rn+dJ18FBb5WttQTzUAfr/28p4rr6s1dUc+aKduU+65DX8Xb2Xha9wDX9PvSCGC/Ul1+fQ1Th07Q1dV69wFQ1dM0OXytDFM1UfqaKXvXheofgzdGG89Hp46WUw2Mtybq4PzeOXztpXmHY6B64slPPvpbNtqJPmFcov/6sp9VV14BfJqTU0kb6mnil95Qk1NI/+XQ0+4Xp1E6o7Mk+WRgIojQRQGgmgNBJAaSSA0kgApZEASiMBlEYCKI0EUBoJoDQSQGkkgNJIAKWRAEojAZRGAiiNBFAaCaA0EkBpJIDSSAClkQBKIwGURgIojQRQGgmgNBJAaSSA0kgApZEASiMBlEYCKI0EUBoJoDQSQGkkgNJIAKWRAEojAZRGAiiNBFAaCaA0EkBpJIDSSAClkQBKIwGURgIojQRQGgmgNBJAaSSA0kgApZEASiMBlEYCKI0EUBoJoDQSQGkkgNJIAKWRAEojAZRGAiiNBFAaCaA0EkBpJIDSSAClkQBKIwGURgIojQRQGgmgNBJAaSSA0kgApZEASiMBlEYCKI0EUBoJoDQSQGkkgNJIAKWRAEojAZRGAiiNBFAaCaA0EkBpJIDSSMCURuYfMlFuS5EuhpRq3xx0vNXF0mUM1UvqjizQr/+++vO3FPeaosq79UB3+rzNCehXyF9FlsBUSmAqJTCVEphKCQy1BBZTAospgcWUwDRLYDglMJwSGE4J7LUE9lMC+ymB/ZTAXktgRiUwoxKYUQnMqARmVAIzKoEZlcCMDI0E+UDLQH7QGFA5KAAaBxoPWg5aAVoJWgW6ALQaFARVgCpBM0Ah0BpQFWgtKAxaB6oG1YDOB0VAtaCxoCioDlQPmgiaDJoCWg/aAGoATQc1gppAG0EzQZtAzaDNoFGg0aAYKA4qAW0BJUAtoK2gVtAk0DZQG2g7qB3UAeoEXQjaAdopqTuyUDulXvJ8SDvoD9SgH2uJlyxk9G8O39MrVglD+f5Q9jy0oBlaxwxlz+dy5UXS84Pw/CA8P2g8f7EsmPehYN6HEnkfSuR9KIr3objWh6J4H4rbfShu96G43YeiXB8K2H0oYPehgN2HAnYfCth9KFn3oWTdh5J1H0q6fShg96GA3YcCdh+Kh30osfahlNiHAm8fisZ9KBr3oYDdh1JwH8q9fShP9qE82YcvGfpQ3O5DmbgPpe4+lKUNXQXaC6oD1YMmgvaD7gf1gYaDukDdoAbQdFAT6DlQEvQ86EbQTaAtoASoBHQz6BbQC6C7QG2gW0FPgB4H3Qa6HVQDugM0EjQKNBo0BjQONB40ATQJNAU0AzQTlALdAzoCuheUBj0Eegx0N+g+0AOgB0EPgx4BPSqpO7LE9nZHpxX1mqw64RS9l+rHB70ogtuBRHCDjAhuyBHBzUEiuNFFBDfriOBmHRHcICOCm5FEcHuOiIkMnsEQNhWRS8eyh/6iIaxMhqR+hKR+mFE/AlQ/AlQ/pn0/wlU/TKwf4aofltYPE+uHifXDXvsR5voR5voR5vphaf2wtH5YWj9CYD9CYD9CYD9CYD9CYD/srh8BsR8BsR8BsR8hsB8hsB8hsB+m2Q/T7Idp9sM0+2GT/bDJfoTAflhhP+yuH3bXjzDXj8DWD/PrR8DvRzjuRzjuR0jqR6DpR7DsR4jvR+Duh9X3w+r7EdT7EZz7YVSGDoNSoHtAR0D3gu4D3Q96APQgKA16CPQw6BHQo6DHQI+DngA1gZ4ETQM9BXoa9AzoWVA9qA/0HOh5UAnoBdBI0CjQaNAY0DjQeNAE0CTQFNAM0ExJ3RGv7ZkZ5XTQ+GR5vRnrumas65pRW2jGOrkZ67pmrIybUWloRqWhGdWgZqyMm1FNaMYqrxmr5masmptRKWpG/acZK7lmrJqbUXdoRv2nGetkQxeDLgFdCpoFugw0GzQHdDloLmgeaD6oFLQAdAVoIWgRaDFoCWgpyAMqA3lBPtAykB9UDgqAloNWgFaCVoFWg4KgClAlKARaA6oCrQWFQetA1aAaUARUC4qC6kD1oPWgDaAGUCOoCbQRtAnUDNoMioHioC2gBKgFtBXUCtoGagNtB7WDOkCdoB2gnZK6I8ukU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQxOGUMThmDU8bglDE4ZQxOGYNTxuCUMThlDE4Zg1PG4JQx45R+7ZRDzYG6JzCCnkDdLhgr7DVp6Gbzw5kCZbP6b8vlt4ybiuTsMHQJaC1oHSgCqgXNAs0GTQbNBc0DzQc1gBpBG0GLQItBS0BLQR5QM6gMFAP5QHGQH7QMtAWUAAVAy0EtoBWgVaBW0FZQELQTVAGqBG0DdYA6QWtApaAaUJWk7khA5gIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIh5AIhkwss1045RoX3jxc5dlMQva3YccuC6E+LHXsoiLpcji8VRG5U+h/qga/qZwZ0H6rL8cuCaMDlmGpBtEkP9E3jNrgcqymILnQ5blgQfdHlWF9B9Jc6pfihGvj1Zx5Xg7F6cEINKop6TZvvHJfjYgXRa/TgpBrcoQen1KDW5VhaQfTtrl7RsHtaDZ7WgzNqkNJb+J9q8Cn9yH+pwQddvaad/w168CM1+Jwe/FgNvqwH+v52R/TgJ2rwJpfjywXRj7gc8y6IfhgNuz9Vg016cFbvhX5qpD5yRb2mZ39HkRMqCqJ7i845c+RdzgFfYct7W5zy3koZqHwIVD4EKh8ClQ+ByodA5UOg8iFQ+RCofAhUPgQqHwKVD4HKh0DlQ6DyIVD5EKh8CFQ+BCofApUPgcqHQOVDoPIhUPkQqHwIVD4EKh8ClQ+ByodA5UOg8iFQ+RCofAhUPgQqHwKVD4HKh0DlQ6DyIVD5EKh8CFQ+BCofApUPgcqHQOVDoPIhUPkQqHwIVD4EKh8ClQ+ByodA5UOg8iFQ+RCofAhUPgQqHwKVD4HKh0DlQ6DyIVD5EKh8CFQ+BCofApUPgcqHQOVDoPIhUPkQqHwIVD4EKh8ClQ+ByodA5UOg8iFQ+RCofAhUPgQqHwKVD4HKh0DlQ6DyIVD5EKh8CFQ+BCofApUPgcqHQOUzgWqVdEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSD6f0wyn9cEo/nNIPp/TDKf1wSj+c0g+n9MMp/XBKP5zSb5xytXbKvEoxbxr8Qds9TutO8DVy2/T/1r9b03m17l96trj35X62+zM1uEu/Rv8e+G5X75/8Q179c+XD+n1ezQ95X/73uym7DHpN3X+qSw0+qh8Z+rWuvuXrQ/gF4594Ryp9U9GH9Rv+ib/E1bcZfcLV+8f+JPfnavC9P/BrSV3UfkZ/xF/3b3MrZK7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jQa7jMblOpXZK/X1lE2548tLvNPU3mFWD32lucL7KDB0yMelxpxK3xtbl4g5VSQf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvXBgLxzYCwf2woG9cGAvHNgLB/bCgb1wYC8c2AsH9sKBvcaB12qnHFpL/UINLnjZdaBe7H1be/Mv1WD2y//MZCiBfumvVIay5MHlVnck/JLf7mx0fH2d+bcmzFZuwD+tu8H8eqZauHvki8LcDYyWMEbC+RJKJIyVME7CeAkTJEyUcIGESRImS5giYaqEaRIulDBdwgwJF0mYKeFiCZdIuFTCLAmXSZgtYY6EyyXMlTBPwnwJpRIWSLhCwkIJiyQslrBEwlIJHgllErwSfBKWSfBLKJcQkLBcwgoJKyWskrBaQlBChYRKCSEJayRUSVgrISxhnYRqCTUSIhJqJUQl1Emol7BewgYJDRIaJTRJ2Chhk4RmCZslxCTEJWyRkJDQImGrhFYJ2yS0SdguoV1Ch4ROCTsk7BTQHamB/77Edl9qsq/CWx2zHiYduTsSkZ55RhrBGWmgZ6SBnpEGekZ65hlpk2ekTZ6RNnlGzpMz0jPPSJs8I23yjLTJM9Imz0ibPCOd8Yx0xjPSDM84B7lW7vwJufMn5M6fkDt/Qu78CbnzJ+TOn5A7f0Lu/Am58yfkzp+QO39C7vwJufMn5M6fkDt/Qu78CbnzJ+TOn3B2Pip3/rTc+dNy50/LnT8td/603PnTcudPy50/LXf+tNz503LnT8udPy13/rTc+dNy50/LnT8td/603PnTcudPOztfp3de5xbb9eWgs41fOyW6enlQTsmDckoelFPyoJySB+WUPCin5EE5JQ/KKXlQTsmDckoelFPyoJySB+WUPCin5EE5JQ/KKXlQTsmDckoelFPOQVkvd/6k3PmTcudPyp0/KXf+pNz5k3LnT8qdPyl3/qTc+ZNy50/KnT8pd/6k3PmTcudPyp0/KXf+pNz5k3LnTzo7v0Hu/HG588flzh+XO39c7vxxufPH5c4flzt/XO78cbnzx+XOH5c7f1zu/HG588flzh+XO39c7vxxufPH5c4fd3a+Qe78F+T+fkHu7xfk/jpwvoQSCWMljJMwXsIECRMlXCBhkoTJEqZImCphmoQLJUyXMEPCRRJmSrhYwiUSLpUwS8JlEmZLmCPhcglzJcyTMF9CqYQFEq6QsFDCIgmLJSyRsFSCR0KZBK8En4RlEvwSyiUEJCyXsELCSgmrJKyWEJRQIaFSQkjCGglVEtZKCEtYJ6FaQo2EiIRaCVEJdRLqJayXsEFCg4RGCU0SNkrYJKFZwmYJMQlxCVskJCS0SNgqoVXCNgltErZLaJfQIaFTwg4JOwV0Rxq1lw1ekwPy+hqQFjEgL7YBebENyAtnQF44A/LCGZBTfUBO6AFpeQNydg/I2T0gZ/eAnMMD0pcG5EwdkDN1QM7UATk5B+TkHJCTc0C69oCcnAPStQfk5ByQ3jwgHXhAOvCAnKkDcj4OSDcdkFNwQMaaARlEBuSsG5CzbkBOpwE5gwbkPBmQ82RAWviAtPAB6doD0rUdmCBhtoQ5EuZLmCZhgYQrJFwkYYmEpRI8EsokjJTgleCT4JcwRkK5hPESVkm4QMJqCRUSKiWEJIQlRCREJdRLWC+hQcJ0CY0SNkrYJGGzhNESYhLiElokbJXQKmGShDYJF0pol9AhoVTCTgHdkSbhZdFVxWJCWqoHTQRNBk0BTQVNA00HzQSNBI0CjQaNAZWAxoHGgyaBZkjqjmx8SVW6/v+oKr1J/kCysVjMakuXgNaC1oEioFrQLNBs0GTQXNA80HxQA6gRtBG0CLQYtAS0FOQBNYPKQDGQDxQH+UHLQFtACVAAtBzUAloBWgVqBW0FBUE7QRWgStA2UAeoE7QGVAqqAVVJ6o40y1naglnaglnaglnaglnagnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgnnZgpnYgpnYgpnYgpnYgpnYgpnYgpnYgrnXgrnXgvnVgrnXgtnWgtnWgtnWgtnWgtnWgtnWgtnWgtnWgtnWgtnWgtnWYmbbZnnTuLzzg91doKtAV4N2g2pAe0B7QftAdaCJoP2ga0AHQAdB80FdoG5QA+ha0HWgHtBC0PWgJGgJyAO6AfQGkB90CHQj6CbQFlACdDPoFtAbQbeCbgPdDloD6gXdAfKBVoLuBA0HTQeNALlBxaC7QG2gAtAw0N2gw6AU6B7QEdC9oPtA94MeAD0ISoMeAj0MegT0KOgx0OOgJ0BNoCdB00BPgZ4GPQN6FlQP6gM9B3oeVAJ6ATQSNAo0GjQGNA40HjQBNAk0BTQDNFNSdyQm+9XC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwujXy2MfrUw+tXC6FcLo18tjH61MPrVwuhXC6NfLYx+tTD61cLoVwubfrW4dspfqeX63XrZ/2s12KEHv1Gx+sLel/tHAHSJ4D5ZM3hpGeCAGjSiVKB/bbIR/9DZb9VgLX5l9DJ3V94il2XHYEnHYEnHYEnHYEnHYMfHYFDHYFDHYFDHYLnHYFfHYFfHYFfHYM7HYF7HYF7HYF7HYM7HYGXHYGXHYGXHYGXHYGXHYGXHYGXHYGWGRoJ8oGUgP2gMqBwUAI0DjQctB60ArQStAq0GBUEVoErQDFAItAZUBVoLCoPWgapBNaAIqBY0FhQF1YHqQRNBk0FTQOtBG0ANoOmgRlATaCNoJmgTqBm0GTQKNBoUA8VBJaAtoASoBbQV1AqaBNoGagNtB7WDOkCdoB2gnZK6Iwnpf78tkrPN0CWgtaB1oAioFjQLNBs0GTQcNBc0DzQf1ABqBG0ELQItBi0BLQV5QM2gMlAM5APFQX7QMtAWUAIUAC0HtYDcoBWgVaBW0FZQELQTNAxUAaoEbQMVgzpAnaAC0BpQKagGVAUaIak70qJn/tA/tDv0byrrf2g36+oV/3bu0D/8q/8R5c/r1wz9E7VD/wbv0L+mO/hPCndHtsorK4wSr6FLQbNAl4EmgGaD5oAuB00FzQXNA80HTQOVghaArgBdBFoIWgRaDFoCWgrygMpAXtBIkA+0DOQHjQGVgwKgcaDxoOWgFaCVoFWg1aAgaCeoAlQJmgH6HSgEWgOqAq0FhSVFCwrx5DpQNSgCqgWNBUVBdaB60ETQZNAU0HrQBlADaDqoEdQE2giaCdoEagZtBo0CjQbFQHFQCWgLKAFqAW0FtYJeAE0CbQO1gbaD2kEdoE7QDlCNpO5Iq7bK3ykz7lQTrVBbcYv+7njQPHNYluWwLMthWZbDsiyHZVkOy7IclmU5LMtyWJblsCzLYVmWw7Ish2VZDsuyHJZlOSzLcliW5bAsy2FZlsOyLIdlWQ7LshyWZTksy3JYluWwLMthWZbDsiyHZVkOy7IclmU5LMtyWJblsCzLYVmWw7Ish2VZDsuyHJZlOSzLcliW5bAsy2FZlsOyLIdlWQ7LshyWZTksy3JYluWwLMthWZbDsiyHZVkOy7IclmU5LMtyWJblsCzLYVmWw7Ish2VZDsuyHJZlOSzLcliW5bAsy2FZlsOyLIdlWQ7LshyWZTksy3JYluWwLMthWZbDsiyHZVkOy7IclmU5LMtyWJblsCzLYVmWw7Ish2VZDsuyHJZlOSzLcliW5bAsy5ll2bbBX1p+S+ebOvE85ZSr2tTj0aLBUNyLTMehaDGejLqA3ZHt+g3c2mKXKouNnqdHq/RomB4tL3RCQ0Fkr7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+83AfjOw3wzsNwP7zcB+M7DfDOw3A/vNwH4zsN8M7DcD+80Y+23X9nuTMsRFRWJKBoqkNRjaD7oT5AOtBA0DDQcVg+4CtYGmgwpAbtAI0OOgJ0CHQU2gJ0H1oPtBfaBpoOdAT4GeB5WAnga9AHoG9Kyk7kjHa+Q+fC+9696feI+9V3NrPf1t2nOFvf/TPfaSxb1/7D329B3+2v6yN9sbusfen+vWen/iHfX+uBvpvcL98/66b5vXqS+sb6r5/tHec7eA6o7skKXPs0gfzyJ9PIv08SzSx7NIH88ifTyL9PEs0sezSB/PIn08i/TxLNLHs0gfzyJ9PIv08SzSx7NIH88ifTyL9PGsTB8fKigoLND/2YeX4EVLQR5QGcgLGgnygZaB/KAxoHJQADQONB60HLQCtBK0CrQaFARVgCpBM0Ah0BpQFWgtKAxaB6oG1YAioFrQWFAUVAeqB00ETQZNAa0HbQA1gKaDGkFNoI2gmaBNoGbQZtAo0GhQDBQHlYC2gBKgFtBWUCtoEmgbqA20HdQO6gB1gnaAdkrqjuzUq+0CtbKOdKgl9nC9xN5ZKPzvRTjXi3CuF+FcL8K5XoTLvAiXeVG6jKVloABoHGg5aAVoJSgImgFaA6oCrQWtA1WDakC1oLGgOtBE0GTQFNAGUBNoJqgZNApUAtoCSoBeAG0DbQd1gnaALgZdApoFugw0ATQbNAc0HzQNtAB0Begi0BLQUpAHVAbygkaCfCA/aAyoHDQetAq0GlQBqgT9DhQChUERUBRUD1oPagBNBzWCNoI2gTaDRoNioDioBbQV1AqaBGoDtYM6QKWgnZK6I1e+/k8j/V/900gZ54Dvkk3sw2FtwzF1huMCM3Q+qAQ0FjQONB40ATQRdAFoEmgyaApoKmga6ELQdNAM0EWgmaCLQZeALgXNAl0Gmg2aA7ocNBc0DzQfVApaALoCtBC0CLQYtAS0FOQBlYG8IB9oGcgPKgcFQMtBK0ArQatAq0FBUAWoEhQCrQFVgdaCwqB1oGpQDSgCqgVFQXWgetB60AZQA6gR1ATaCNoEagZtBsVAcdAWUALUAtoKagVtA7WBtoPaQR2gTtAO0E5J3ZGrZEnjKK76o7jqj+KqP4qr/igc7yg84Cg84Cg84Chc7Sgc4Sgc4Sgc4Sj87yj84Sj84Sj84Sj87yjc4ijc4ijc4ijc4ijc4ijc4ijc4ijcwtBIkA+0DOQHjQGVgwKgcaDxoOWgFaCVoFWg1aAgqAJUCZoBCoHWgKpAa0Fh0DpQNagGFAHVgsaCoqA6UD1oImgyaApoPWgDqAE0HdQIagJtBM0EbQI1gzaDRoFGg2KgOKgEtAWUALWAtoJaQZNA20BtoO2gdlAHqBO0A7RTUnfkanOz/siT+l79uw/pr4kKom917ty/R1ujX+H+wX8IoG7wC4jbVcYaHaHLHjk9GqlHvsFC+LqX/55hqDT+NjVIF/e+9JuV6Cj9Ph919ZqvTR6RFfHoaP3ck7I2Hh2jH/qY3oDz9ehp/ViJHn1Gj8bq0WeLe81XFJ8v7n2Z3xtFx+kXfUk/p/+xn48P/ltKn3T1nqumR8frF31F/gYpOkE/9PXiXlFY19+RfFN/8ET93LeKe89V1qMX6Ie+g29k9DcO33WK7Xv1cca/s1Du3H173+vfbvX+sd9u6a+wNv6Br7le/3ar92/z2639+sIaXOUuQPvyAvTlL0CL8gK0KC9Ai/IC9OUvQLf9AjQlL0BH/QI0Hi9Av/sCNBcvQHPxAnS4L0A78QL0tC9AT7uhC0CTQBeCZkjqjlyjj9xga0Q5WiPK0RpRjtaIcjRDlKMZohzNEOVohihHM0Q5miHK0QxRjuaLcrRGlKM1ohytEeVojShHa0Q5WiPK0RpRjtaIcrRGlKM1ohytEeVojShHa0Q5WiPK0RpRjtaIcrRGlKM1oty0RhyQt5f9rJhIBkZLGCPhfAklEsZKGCdhvIQJEiZKuEDCJAmTJUyRMFXCNAkXSpguYYaEiyTMlHCxhEskXCphloTLJMyWMEfC5RLmSpgnYb6EUgkLJFwhYaGERRIWS1giYakEj4QyCV4JPgnLJPgllEsISFguYYWElRJWSVgtISihQkKlhJCENRKqJKyVEJawTkK1hBoJEQm1EqIS6iTUS1gvYYOEBgmNEpokbJSwSUKzhM0SYhLiErZISEhokbBVQquEbRLaJGyX0C6hQ0KnhB0Sdgrojhwc6m3epBMd+4OSwX5m88OSNfKHJVnUcbKo42RRx8mijpNFHSeLOk4WdZws6jhZ1HGyqONkUcfJoo6TRR0nizpOFnWcLOo4WdRxsqjjZFHHyaKOk0UdJ4s6ThZ1nCzqOFnUcbKo42RRx8mijpNFHSeLOk4WdZws6jhZ1HGyqONkUcfJoo6TRR0nizpOFnWcLOo4WdRxsqjjZFHHyaKOk0UdJ4s6ThZ1nCzqOFnUcbKo42RRx8mijpNFHSeLOk4WdZws6jhZ1HGyqONkUcfJoo6TRR0nizpOFnWcLOo4WdRxsqjjZFHHyaKOk0UdJ4s6ThZ1nCzqOFnUcbKo42RRx8mijpNFHSeLOk4WdZws6jhZ1HGyqONkUcfJoo6TRR0nizpOFnWcLOo4WdRxsqjjZE0dp0vne4eVI6Z7nRpC5M5e2bnX/Yr/tk10krbQisLeP/ZfuRlamqlle+S7+gOv1R+4W6+w9cODd7xbhR96r0Lf9Sr0XRu6A3QnyAdaCRoGGgEaDioG3QVqA00HFYDcoMdBT4AOg5pAT4LqQfeD+kDTQM+BngI9DyoBPQ16AfQM6FlJ3ZHr5D0pf+q8YhfoKtDVoN2gGtAe0F7QPlAdaCJoP+ga0AHQQdB8UBeoG9QAuhZ0HagHtBB0PSgJWgLygG4AvQHkBx0C3Qi6CbQFlADdDLoF9EbQraDbQLeD1oB6QXeAfKCVoDtBw0HTQSNAblAx6C5QG6gANAx0N+gwKAW6B3QEdC/oPtD9oAdAD4LSoIdAD4MeAT0Kegz0OOgJUBPoSdA00FOgp0HPgJ4F1YP6QM+BngeVgF4AjQSNAo0GjQGNA40HTQBNAk0BzQDNlNQd6flr/CZAl+D36kdeI18JvP5NQO/r3wT83jcB1+sLS3/0I/q4DcbjMuQNZYgtZYhCZYhCZYg7ZYgmZYgmZYgmZYhQZYgtZYhQZYg0ZYhlZfDlMvhyGaJQGVy6DP5aBl8ug4eWwUPL4Nll8PoyuHQZ4lUZPLsMTlyGGFGGOFAGdy8zzpgU7TuRXxzsPVfIdeBSCbMkXCZhgoTZEuZIuFzCVAlzJcyTMF/CNAmlEhZIuELCRRIWSlgkYbGEJRKWSvBIKJPglTBSgk/CMgl+CWMklEsISBgnYbyE5RJWSFgpYZWE1RKCEiokVEqYISEkYY2EKglrJYQlrJNQLaFGQkRCrYSxEqIS6iTUS5goYbKEKRLWS9ggoUHCdAmNEpokbJQwU8ImCc0SNksYJWG0hJiEuIQSCVskJCS0SNgqoVXCJAnbJLRJ2C6hXUKHhE4JOyTsFNAdueGQzWKKdVvNG17yj613OO0eh14jSZ7atMjZ3pdJ9qKTdZXo7GuxAUTnmhN1z87raV/v33bap2+p49Uz4VXlfze+2h+mvPZ/kPJn/x2K/tXJeD146Q9S/uffoXRHbnqN2NhfY9fan92rtC/+TL/mddPqfQ2b1qvyqptfsxeWnmVFrr/NK+z1C+uv/sK65c9+YUWnOM0qxX++S+w7avCjoj/9EtOXauX/0bXWpQbPvoYuuno1SMirLzpVn6aOotevw9fEdfjGQ7rwWBAZrVfJt+qLUuei39QHUV+dH9eDq/TJ0IOr1aBE//01+srQjwx+Ax3Dt4YxfMscw/egMXzLHMO3ojF8DxrDd6SG9oJuBu0HJUEHQfNB3aBbQdeCekC3gdaAFoKuBy0B+UArQXeCRoDcoGGg4aBi0F2gNtB0UAHocdAToMOgJtCToHrQ/aA+0DTQc6CnQM+DSkBPg14APQN6VlJ35LZDptfxJn1d3K6vi8GevU341wc24V8D2IR/fWAT7nq/CTdw34RboW/Cv0WwCfer32R+BdArfzObR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnn0WubRa5lHr2UevZZ59Frm0WuZR69lHr2WefRa5tFrmUevZR69lnnTa3nHH26mjPxIDabpwaTeP19T5Z36gwcP6GEY2mFMu8OwjcM4gYdxAg/DKAydDxoLGgcaD5oAmgi6ADQJNBk0BTQVdCFoOmgG6CLQTNClkrojd71mCyuv11N6X6+n/GXWcboQ8IB+5C+4oLtb5okTimSeaOhS0CzQZaAJoNmgOaDLQVNBc0HzQPNB00CloAWgK0AXgRaCFoEWg5aAloI8oDKQFzQS5AMtA/lBY0DloABoHGg8aDloBWglaBVoNSgIqgBVgmaAQqA1oCrQWlAYtA5UDaoBRUC1oLGgKKgOVA+aCJoMmgJaD9oAagBNBzWCmkAbQTNBm0DNoM2gUaDRoBgoDioBbQElQC2graBW0CTQNlAbaDuoHdQB6gTtAO2U1B05rP1PW+/XdAAZrB4FMUGDMApDu0H7QXeA7gT5QCtBw0HFoLtAbaDpoAKQGzQMNAL0OOgJ0GFQE+hJUD3oflAfaBroOdBToOdBJaCnQS+AngE9K6k7kvoDGeX/lEj+UfnjS9PGV8gWX5ok/oHc8Jai3r9AbjiUEv6vMsGhBPAV8j6dLa4v7H3FBPDV5H2vJt3745K7v8ra/D3Gyswsr4JLGboVdAh0E2gNaCFoP+gO0J0gH2glyA0aDioG3QVqA00HFYCGgUaAHgc9AToMagI9CaoH3Q/qA00DPQd6CvQ8qAT0NOgF0DOgZyV1R478La+e9SrqydeX0X+7y+i/oOXeK1fPE51L7xLQpaBZoMtAE0CzQXNAl4OmguaC5oHmg6aBSkELQFeALgItBC0CLQYtAS0FeUBlIC9oJMgHWgbyg8aAykEB0DjQeNBy0ArQStAq0GpQEFQBqgTNAIVAa0BVoLWgMGgdqBpUA4qAakFjQVFQHageNBE0GTQFtB60AdQAmg5qBDWBNoJmgjaBmkGbQaNAo0ExUBxUAtoCSoBaQFtBraBJoG2gNtB2UDuoA9QJ2gHaKak7cp+8rcB25xVXge4AXQ3aDToEqgHtAd0I2gK6CbQXdDNoImg/6CBoPqgL1A26FXQt6HpQD+g20DWgNaCFoCRoCcgHWgm6EzQcNB3kBg0DFYPuArWBCkAjQI+DngA1gQ6DngTVg+4H9YGmgZ4DPQV6HlQCehr0AugZ0LOSuiP3//6NZCM79MMPyNtdluJ2l6W43WUpbndZittdluJ2l6W43WUpbndZittdluJ2l6W43WUpbndZittdluJ2l6W43WUpbndZittdluJ2l6W43WUpbndZittdluJ2l6Wm0eXB1+s4vX+BOs5LlyJ/3Ark1Sw89AJvp37N6wWdXrm6SNvfJEZcuqvsIfnvxdSgXaAG7QI1aBeoQbtADfo9atA8UIPmgRo0D9SgeaAGzQM1aB6oQfNADZoHatA8UIPmgRq0StSglaAGrQQ1aCWoQStBDVoJDF0MugR0KWgW6DLQbNAc0OWguaB5oPmgUtAC0BWghaBFoMWgJaClIA+oDOQF+UDLQH5QOSgAWg5aAVoJWgVaDQqCKkCVoBBoDagKtBYUBq0DVYNqQBFQLSgKqgPVg9aDNoAaQI2gJtBG0CZQM2gzKAaKg7aAEqAW0FZQK2gbqA20HdQO6gB1gnaAdkrqjjw8+I8ivNMadGSxM/kLIkGlb1ZPXKXDzg1qsFsPDqjBHj24RQ1SevAWNXiHHuxTgw/qwVvV4M2FwtnKkWyVI00qR5pUjjSpHGlSORKxciQ45UiaypE0lSMpLEfKVo4UsdykSY/I6BFE9AgiegQRPYKIHkFEjyCiRxDRI4joEUT0CCJ6BBE9gogeQUSPIKJHENEjiOgRRPQIInoEET2CiB5BRI8gokcQ0SOI6BFE9AgiegQRPYKIHkFEjyCiRxDRI4joEUT0CCJ6BBE9gogeQUSPIKJHENEjiOgRRPQIInoEET2CiB5BRI8gokcQ0SOI6BFE9AgiegQRPYKIHkFEjyCiRxDRI4joEUT0CCJ6BBE9gogeQUSPIKJHENEjiOgRRPQIInoEET2CiB5BRI8gokcQ0SOI6BFE9AgiegQRPYKIHkFEjyCiRxDRI4joEUT0CCJ6BBE9gogeQUSPIKJHENEjiOgRRPQIInoEET2CiB5BRI+giR6P/i1/Wfb6d2S95hvD21//suzPvZx9TF9Y+l46XfrxwbvrdEcel1+iuYqlpbrw4ylDa0HrQLWgWaDZoMmguaB5oPmgBlAjaCNoEWgxaCnIA2oGlYF8oDjID1oGCoASoBbQCtBWUCsoCNoJqgRtA3WAOkFrQKWgGlCVpO7IE/Iec78Sk8bApRJmSbhMwgQJsyXMkXC5hKkS5kqYJ2G+hGkSSiUskHCFhIskLJSwSMJiCUskLJXgkVAmwSthpASfhGUS/BLGSCiXEJAwTsJ4CcslrJCwUsIqCaslBCVUSKiUMENCSMIaCVUS1koIS1gnoVpCjYSIhFoJYyVEJdRJqJcwUcJkCVMkrJewQUKDhOkSGiU0SdgoYaaETRKaJWyWMErCaAkxCXEJJRK2SEhIaJGwVUKrhEkStklok7BdQruEDgmdEnZI2CmgO/Kk/PeesvJIZOWRyMqryIHzJZRIGCthnITxEiZImCjhAgmTJEyWMEXCVAnTJFwoYbqEGRIukjBTwsUSLpFwqYRZEi6TMFvCHAmXS5grYZ6E+RJKJSyQcIWEhRIWSVgsYYmEpRI8EsokeCX4/h979x4fd3nnh16yTQHjC2MmZiA2k/EAYkZiGA/CMiADFuZmeWzGM8bY4yvYuCFASIJIyAaBBBFMIAnEJE64Dpdqd9tdtXvco54tLSo9Pa26Obpk2+5uvZuqdM+23bZJ9tJquz3t2aPfDFKe94ts9t7Ndp1/Mm9ZviD95vP9Pt/n+f0UoivExhBXh7gmxLUhukNsCnFdiOtD3BBic4ieEDeG2BLiphA3h7glxK0hbguxNURviG0hiiG2h9gR4vYQpRA7Q5RDVELsCnFHiN0h7gyxJ8TeENUQ+0LsD3EgxMEQh0IcDnFXiLtDHAlxNMQ9IY4F6Ot9pfmzQxofKu5ptGQvoyy6EOXQBvQoegU9g15FZ6BN6Gm0GL2GWlAdnYm2oLPRDvQgeh69js5Ca1AFvYHeRI+hlegtVEOH0RPoJfQiehI9Faqv99XoOnl0bq135aLGH9pS/JeLg39jDydsejjx0sOJlx7ODPVwaqeHs0Y9nHHp4TRMD6dhejjV0sPplB7OxvRw4qWHEy89nHjp4RRND+dfejhT08P5lx7Ov/Rw4qWH0zA9nH/p4fxLD+dfejj/0sP5lx7Ov/Rw/qWH8y89nH/p4fxLD+dfejj/0sP5l57m+ZfXwn2IHPsQOfYhcuxD5NiHyLEPkWMfIsc+RI59iBz7EDn2IXLsQ+TYh8ixD5FjHyLHPkSOfYgc+xA59iFy7EPk2IfIsQ+RYx8ixz5Ejn2IHPsQOfYhcuxD5NiHyLEPkWMfIsc+RI59iBz7EDn2IXLsQ+TYh8ixD5FjHyLHPkSOfYgc+xA59iFy7EPk2IfIsQ+RYx8ixz5Ejn2IHPsQOfYhcuxD5NiHyLEPkWMfIsc+RI59iBz7EDn2IXLsQ+TYh8ixD5FjHyLHPkSOfYgc+xA59iFy7EPk2IfIsQ+RYx8ixz5Ejn2IHPsQOfYhcuxD5NiHyLEPkWMfIsc+RI59iBz7EDn2IXLsQ+TYh8ixD5FjHyLHPkSOfYgc+xA59iFy7EPk2IfIsQ+Ra+5D1MOkjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRkjKWMkZYykjJGUMZIyRlLGSMoYSRlrJuXr4QbShxaF7/qm1qE0uhidhy5Bl6I2dAG6DGVQFl2I2lEHuhxdhHLoCpRH61EBXYk60VVoKdqAutBGtBxdja5BMbQKXYu60SZ0Hboe3YA2ox60Ft2ItqCb0M3oFnQrug1tRb1oGzoXFdF2tAPF0fkogW5HJbQTrUFlVEG7UBLdgXajO9E5aBnag/ailaiK9qH96AA6iFajQ+gwugvdjY6go+gedCxUX+8bYacYp1OM0ynG6RTjdIpxOsU4nWKcTjFOpxinU4zTKcbpFON0inE6xTidYpxOMU6nGKdTjNMpxukU43SKcTrFOJ1inE4xTqcYp1OM0ynG6RTjdIpxOsU4nWKcTjFOpxinU4zTKcbpFON0inE6xTidYpxOMU6nGKdTjNMpxukU43SKcTrFOJ1inE4xTqcYp1OM0ynG6RTjdIpxOsU4nWKcTjFOpxinU4zTKcbpFON0inE6xTidYpxOMU6nGKdTjNMpxukU43SKcTrFOJ1inE4xTqcYp1OM0ynG6RTjdIpxOsU4nWKcTjFOpxinU4zTKcbpFON0inE6xTidYpxOMU6nGKdTjNMpxukU43SKcTrFeLNTfPPR5k/zKi2K7qh5K3xgyhbmy009gR5Fj6EtKIceRE+hp9EGtAmdgc5Ci1ENHUZrUAs6E52NXkQvoWdQBb2MdqDn0evoQvQGegW9iVaiV9Fb6DVUD9XX+9fCFcUBjqQd4EjaAY6kHeBI2gGOpB3gSNoBjqQd4EjaAY6kHeBI2gH21g5wJO0AR9IOcCTtAEfSDnAkran1qICuRLtRJ9qA9qKNqAtV0T50DdqPutEBdBDdgI6hzagHHUJH0FG0BbWjreimUH29w9HVFp1Q/bloa2z+dvq/2rgwP4ruRR9D96Gt6H70ANqO4uhB9CmURQ+hPvQw+jT6DMqhR9Bn0Xr0OfQo6kePoSp6HA2iJ9CT6BNoCxpCT6ENaBN6Gp2F1qCz0RloMaqhw6gFnYleRC+hCnoGvYwuRK+gV9FrqI52oOfR6+gN9CZaid4K1df7449G/yEtvY9HPcJPRO/N6Naxn238x7YUR6J97F+ee3F0UeMN0lJsm3vXFj8c/ZiawUWN71xL8f73b+4v/tT7Nwo0b/ePWo97G2eef/L9RuTHG43IX5//caNLW4PLYrbZs/yN6Bdfm/vFFxY1vlItxS8vanypW4pfaPxZPxX+uIktxNsWitUWCktTD6Fr0DZ0CdqF0mgrmr96Pt4aXiEfp1H9ePM/9aej/5L5LylPSWh+IaMv+yPzX8jX57/YDza+CiNzv7f5XfjH798i0fiWLfwhC9+7hT9/4Y+d+0N6lzf/1N49zb+mt/HjXv9muLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOsLBOkFcJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtYJFtaJZnL/rSgpo6I5O/RCo1jVGqH8M6fvpRv6y30v3f/MW+ii+/b2LBn6y3Av3f/2fv94oNE/ngzHFasWhTW3qXUojS5G56FL0KWoDV2ALkMZlEUXonbUgS5HF6EcugLl0XpUQFeiTnQVWoo2oC60ES1HV6NrUAytQteibrQJXYeuRzegzagHrUU3oi3oJnQzugXdim5DW1Ev2obORUW0He1AcXQ+SqDbUQntRGtQGVXQLpREd6Dd6E50DlqG9qC9aCWqon1oPzqADqLV6BA6jO5Cd6Mj6Ci6Bx0L1df7t6O135po7VeL1uJro1eFuUJQvCh6tbXRivzv4aMqX2n8KR9FH0P3ofvRy+jj6JPoUyiLLkQPo0+jz6AcegStR1eiH0Mb0OfQRvQoegU9g15FZ6BN6Gk0iBajFvQaqqNPoC3oTDSEzkb3ogfQdrQDxdGD6Hn0OjoLPYT60E60BlXQG+iz6E3Ujx5DVbQPrUSPowH0Fqqhw+gJ9BJ6ET2JPo+2oqfQUnQOWoaWoxhahc5Dq1ECrUVJ9Cz6IvoS+jJ6AX0VfQN9AT2HvoKOo6+hE+jrofp6R6OEfWoucJ9fFFxM3bwdu4mwbt4s3URDNzHVTYh089bpJja6udC6udC6eet0EzDdhFY3sdFNUHRzSXZzuXYTi928ObspHt2ESDdB0U1QdFMuunmLdxPK3bzFu3mrdhPR3bw5uwnXbsK1u/nN/TvNh3c0P9bK17iV71Qr/9pW/n2t/Ita+Qq08lVtbf6t/0c4gE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE0zgE03B7A/Oz9pbZkrvsVktO55hXHiB6akD0VTt9a5T/5I9Mm/09pI35biovnR5dXRH5SKfq2VoeHCkG5hmLUwA/3gz1CeH1319f7dMMpTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp4jyFFGeIspTRHmKKE8R5SmiPEWUp5pR/vb7s/3rW6PZ/t8Lc7ON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsIzfbyM02crON3GwjN9vIzTZys43cbCM328jNNnKzjdxsa+bm3w+TMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWGpMyQlBmSMkNSZkjKDEmZISkzJGWmmZTvhEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMktSZknKLEmZJSmzJGWWpMySlFmSMttMyrHmnRnNj+V5tGS+efPWP3h/tf5q4yTeu2GylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC2RrCWStUSylkjWEslaIllLJGuJZC01k/UfhklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSskxSlknKMklZJinLJGWZpCyTlGWSstxMyv8zSsro1tcvcfvqB2+PjW6GfWv+9ti/1th1/0fR751PhXHe3ePk1Tjv9XHe6+O8Z8d5z47znh3n/TXOe2icPB7nHTXOO2qcd9Q475px0nKcd8Y474xx3hnjvBfGeS+Mc72PU0XGud7HqRTjVINxqsE4V/84V/g4qT7ONT1OJRynvo1zFY9zFY9zbY5zNY5zxY1zxY1TU8apKeNUkXGqyDgVdJyaMk5NGadSjFMXx6kU41SKcSrhONVgnGowTjUYpxqMUw2aWoo2oI1oOboarULXoevRMbQZ9aAb0S2oFxXRDnQ72onWoDLahe5Ad6JlaA/ai/ajA+ggWo0Oo7vREdSOtobq6/2/wi6zm/dWN/8l3Xy/m1qBVqJzUQytQuehOPoQWo3ORwl0AboQfRitQWvRRSiJPoJSaB1Ko4vRJehS1IYuQxmURe2oA12OcugKlEfrUQFdiTrRVWgD6kIb0dXoGnQt6kab0HXoenQD2ox60I1oC7oJ3YxuQbei29BW1Iu2oSLajnag21EJ7URlVEG70B1oN7oT7UF7URXtQ/vRAXQQHUKH0V3obnQEHUX3oGOh+nr/cZSU8yc5i+uic5/DP/Dc6N+d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809w0r6h4mJ+8fsn7Z9obgpun19j9E4Pfb+7+PfNkrWjdf5nVD8c/Zu+/zOqb2/8wvwaYt/isN/Yx8/W2se25j5+FNk+/rlNPYpeQc+gV9EZaBN6Gi1GLeg1VEdnoi3obPQA2oEeRM+j19FZaA2qoDfQm+gxtBK9hWroMHoCvYReRE+ip0L1FUut4dywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywwNywQCUqMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsMDcsNCv7ztbTJ5SHfoQPJkdr2ruj33X6hPLQX6wTyuXGO2u+h/lPrWEP01QNPYXOQM+gHNoRqq9YoffJ0/vk6X3y9D55ep88vU+e3idP75On98nT++TpffL0Pnl6nzy9T57eJ0/vk6f3ydP75Ol98vQ+eXqfPL1Pnt4nT++Tp/fJ0/vk6X3y9D55ep88vU+e3idP75On98nT++TpffL0PnkujTy9T57eJ0/vk6f3ydP75Ol98vQ+eXqfPL1Pnt4nT++Tp/fJ0/vk6X3y9D55ep88vU+e3idP75On98nT++TpffL0Pnl6nzy9T57eJ0/vk6f3ydP75Ol98vQ+eXqfPG/tPL1Pnt4nT++Tp/fJ0/vk6X3y9D55ep88vU+e3idP75On98nT++TpffL0Pnl6nzy9T57eJ0/vk6f3ydP75Ol98vQ+eXqffDMqd7UGx+16/0vwrm9iXYh0iItDnBfikhCXhmgLcUGIy0JkQmRDXBiiPURHiMtDXBQiF+KKEPkQ60MUQlwZojPEVSGWhtgQoivExhDLQ1wd4poQsRCrQlwbojvEphDXhbg+xA0hNofoCbE2xI0htoS4KcTNIW4JcWuI20JsDdEbYluIc0MUQ2wPsSNEPMT5IRIhbg9RCrEzxJoQ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7urAomcHFj07sBDXgYWxDiyMdWBpuAPLlR1YNOvA8mgHlkc7sPzbgaW+DiwDdmBpuAMLvh2Zxa9/MnxiT5sW+VQH9tQLOl42RT7fk3uf3YG9z+Gc3sPNWtzPHMWDHcZ7CsspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYyylhLKeEsZwSxnJKGMspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYyylhLKeEsZwSxnJKGMspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYyylhLKeEsZwSxnJKGMspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYyylhLKeEsZwSxnJKGMspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYSyZhLJmEsWQSxpJJGIskYSyEhLEQEsbyRhjLN2Es34SxDBPGwksYCy9hLK6EsbgSxuJKGMspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYyylhLKeEsZwSxnJKGMspYSynhLGcEsZyShjLKWEsp4SxnBLGckoYyylhLKeEsZwSxnJKGMspYSynhDPLKU+jtLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLWitLVmStteZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKNRZKPRTDbqRzaqIRvVkI1qyEY1ZKMaslEN2aiGbFRDNqohG9WQjWrIRjVkoxqyUQ3ZqIZsVEM2qiEb1ZCNashGNWSjGrJRDdmohmxUQzaqIRvVkI1qyEY1ZKMaslEN2aiGbFRDNqohG9WQjWrIRjVkoxqyUQ3ZqIZsVEM2qiEb1ZCNashGNWSjGrJRDdmohmxUQzaqIRvVkI1qyEY1ZKMaslEN2aiGbFRDNqohG9WQjWrIRjVkoxqyUQ3ZqIZsVEM2qiEb1ZCNashGNWSjGrJRDdmohmxUQzaqIRvVkI1qyEY1ZKMaslEN2aiGbFRDNqohG9WQjWrIRjVkoxqyUQ3ZqIZsVEM2qiEb1ZCNashGNWSjGrJRLZON7ldbENROgzPpg8cH0pHz74yhujcS+5D3WKhZ7Nce9IUW/2B8riXyYS+0GJ7QDerPpP/i7xj+LTXTq45Cz8mNZP5p72Crg9r88J56iBoP76b3PBwc/iKezlVfxKHhLfi/qxRAvl2ZXiN4Cnoa6oX8UAu0HzoAPQO1QkXQQegQFIAOQ1XQESgIOaCjUB/0LFQNHYNCkA2qgZ6DnofqoePQC9AJqBPqgk5CL0IvQf3QKSgMNUER6DRUCzVAUSgfKoHGQHlQLnQG8kI50GjoZej/Z+/e4+Os7zvR2xgKyBKWL7Gk0UyUxIOkTIi5CIy5DGBsbrKfsRjM1QYsxOUVkhASUEgId7C4mIvNMDdkPGDTFir3orM6Z7vq7qu7Z3tWq9X2dC/VbrcXbdPTvnbb3W222l73nNM980ho8nsfaEqTNKVZ5588b1m2sT3zeb7f7++rR/vRi+gl9DJ6BR1AB9GrqIBeQ0VUQmVUQVX0OhpFu9AhlEBvoMOoht5EO9Fb6Ag6ilaht9FqlELtqAutRGtRE2pBa1AzWh9qOHpgIWKfrQfwwROC92qWXjVLD59l1pClH83SuWbpXLP0qlk60CwdaJYONEtXm6UfzdLVZulOs/S/WXq5LL1clk4yS2eXpbPL0pNl6WOzdGhZesAs/VqWjjBL95ale8vSLWbp5bL0jll6x+xiN/Vg+HCm7f89/oxPhvhUiA0h0iHWhjg9RHeInhAdIXpDfDpEJkQixGdCnBHisyE+HmJjiDNDnBXi7BDnhOgLcW6I80I0hdgU4vwQm0O0hLggxIUhVodYE+KiEBeHyIa4JMSlIS4LsSXE5SFSIbaG2BbiihBXhrgqxNUhrgnRH2J7iB0hWkNEIXIhdoZYF6ItRHuIgRDXhsiHSIa4LsSuENeH6ApxQ4gbQ9wUYmWI5hA3h7glxKoQu0PsCXFriNtC3B5ifYi9IQZD3BFiKMSdIe4KcXeIewIMR8N8pe3iF9j+7NIa9balDmJ5fPEbcTez0Dh8ld6gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gl96gd7E3eGghYn87TmM2G+NJ0j9eMfIBi5b76/8/MfJBg6TG/l9jMPX+8dO31/6+1vheDT/D004+2t+r4fjG58j3vvH5dQ6A0hwApTkASnMAlOYAKM0BUJoDoDQHQGkOgNIcAKU5AEpzAJTmACjNAVCaA6A0B0BpDoDSHAClOQBKcwCU5gAozQFQmgOgNAdAaQ6A0hwApTkASnMAlOYAKM0BUJoDoDQHQGkOgNIcAKU5AEpzAJTmACjNAVCaA6A0B0BpDoDSHAClOQBKcwCU5gAozQFQmgOgNAdAaQ6A0hwApTkASnMAlOYAKM0BUJoDoDQHQGkOgNIcAKU5AEpzAJTmACjNAVCaA6A0B0BpDoDSHAClOQBKcwCU5gAozQFQmgOgNAdAaQ6A0hwApTkASnMAlOYAKM0BUJoDoDQHQGkOgNIcAKU5AEpzAJTmACjNAVCaA6A0B0BpDoDSHAClOQBKcwCU5gAozQFQevEA6GFaoLb4pv3t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dD1ahVajNagB3YDWokZ0I1qHbkI3o1vQrWg9ug1tQBtRE7odNaM70Ca0GbWgFNqCtqI70V1oG7obbUdpdA+6F92HdqCdaBfajTJoD9qL9qH96H70ADqADqIH0aFQ7anXozsN66LFkWnRnYY3KOa7KOa7KOa7KN+7KN+7KM66KOa7KOa7KOa7KOa7KOa7KOa7KA27KO27KOa7KOa7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KN+7KNi7KNG7KNG7KNG7KNHLehptQF0oi1ajdegZdB5aiGJoOpqKjqL9aBKqRs+h59EL6EWUQ6+gPHodPYuOoZfQcfQy6kavotfQG+gE2o7eRAvQSdSDetFbaCt6G72D3kW16D0URzVoBpqJZqHZqA7NRfPRIrQ4VHvqBDesTlFonaLQOkWhdYpC6xRF5inKrlOUXacou05RSJ6iCDtFEXaKIuwUJecpSrJTlGSnKMlOUXKeokA7RYF2igLtFAXaKQq0UxRopyjQTlGglRVHq9Ea1IBmohvQWjQLzUaN6Ea0Dt2Ebka3oFvRerQI3YY2oI2oCd2OmtEdaBPajFrQ+SiFtqCtaA6ah+ajO9FdaBtaiO5G21EaLUb3oHvRfagGzUA70E5Ui3ah3SiD9qC9aC7ah/aj+9ED6AA6iB5Eh0K1p97khtXvTw6vQGUdRVk0HR1Dy9DWUO2pk5U17UlTun64gZyqjwYIi6Z0fcSK9cPRqm50Oypacr6BpeIf8djqDz+k+ofPpu6prDP82A/IPjfECYYeH5rPlCYom/9jVzCo+VjzmcpU5oezmMoE5iPmLj9c4P7hjKWXTmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGAyn2Ayn2ALmKALmKALmKALmKAin+AnmKA+n+A+n+AfmOAfmOA3mCA3mCA3mCAzmSATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGATmGg3Cm8FUVs6soohTumlv7pJ6XeCLcjCqRugdQtkLoFUrdA6hZI3QKp+1GfD7kFzUGH0VeRnxb5EFqKHkbtaBv6OnoEPYqWocfQN9AK9KM+b/Nx5OdtfhN9Cz2BdqHdqBP5aZjfRkfRk+gN9BR6Gm1AXSiLFqL9odpTb1McnOE0PcNpeobT9Ayn6RlO0zOcpmc4Tc9wmp7hND3DaXqG0/QMp+kZTtMznKZnOE3PcJqe4TQ9w2l6htP0DKfpGU7TM5ymZzhNz3CanuE0PcNpeobT9Ayn6RlO0zOcpmc4Tc9wmp7hND3DaXqG0/QMp+kZTtMznJhnOBXPcCqe4VQ8w6l4hlOxrNVoHXoGnYcWohiajqaio2g/moSq0bPoGHoOPY9eQC+il1AOHUcvo1dQHnWjV9Fr6HX0BjqBtqM30QJ0EvWgXvQW2oreRu+gd1Eteg/FUQ2agWaiWWg2qkNz0Xy0CC0O1Z56h3vcjzNkeJwhw+MMs8r6AqpF56NZaDaqQ3PQBWgumofmowvRAnQRWogWoYvRYrQE1aNL0KXoMpRAl6Mr0JUoiZaiq9DV6Bq0DF2LlqMV6Dq0El2PVqHVaA1qQDegtagR3YjWoZvQzegWdCtaj25DG9BG1IRuR83oDrQJbUYtKIW2oK3oTnQX2obuRttRGt2D7kX3oR1oJ9qFdqMM2oP2on1oP7ofPYAOoIPoQXQoVHvqXaKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorCYqq4nKaqKymqisJiqricpqorKaqKwmKquJymqispqorC5H5XtEZRVRWUVUVhGVVURlFVFZRVRWEZVVRGUVUVlFVFYRlVVEZRVRWUVUVhGVVURlFVFZRVRWEZVVRGUVUVlFVFYRlVVEZRVRWUVUVhGVVURlFVFZRVRWEZVVRGUVUVlFVFYRlVVEZRVRWUVUVhGVVURlFVFZRVRWEZVVRGUVUVlFVFYRlVVEZRVRWUVUVhGVVURlFVFZRVRWEZVVRGUVUVlFVFYRlVVEZRVRWUVUVhGVVURlFVFZRVRWEZVVRGVJ+UmTJk+K/lfJzCoys4rMrCIzq8jMKjKzisysIjOryMwqMrOKzKwiM6vIzCoys4rMrCIzq8jMKjKzisysIjOryMwqMrOKzKwiM6vIzKpyZv71yj3dyVO7ym9Rryn+90+K/y3d8/0bpR8/NzR6hvPyGZLyGdLpGS54z5T/sFOl3+wHxd/7C6VfOCm1JbrDfLT4hSuL//1e8b9XlX6PSanXp5V++aTN1xT/+0fF/14b/QZ/84PvZlLqVyeXv9vUBdOiH/hb5U3Q8p82MxoyPJT6xc8fbfbz82iz09Gv+rgfwPz5s826PtVPbfglHin+B0GdVcaMEDNDfCFEbYjzQ8wKMTtEXYg5IS4IMTfEvBDzQ1wYYkGIi0IsDLEoxMUhFodYEqI+xCUhLg1xWYhEiMtDXBHiyhDJEEtDXBXi6hDXhFgW4toQy0OsCHFdiJUhrg+xKsTqEGtCNIS4IcTaEI0hbgyxLsRNIW4OcUuIW0OsD3FbiA0hNoZoCnF7iOYQd4TYFGJziJYQqRBbQmwNcWeIu0JsC3F3iO0h0iHuCXFviPtC7AixM8SuELtDZELsCbE3xL4Q+0PcH+KBEAdCHAzxYIhDAdpThVKYVa6klet5dAF9Kbywf3g17sMLdWeLB9dHpctE8RddFKZn5cp6LoXbU7/8V7FAiZ5I+qWun99C5fP6pOsvvT75lb+KL6yf1xdUFBiXfP7C+ky8sP725y+sn/yFFZ3IT30GX2Cfv7D+8l9Yf6fypOsnJ3eFT7r+u//Tr7jpxZ/wx1M+8qX3z4sHf/YTvwaPRf+fp30aL8Zo2NM17afzqvz81fj5q/F/fDX+KvOtsXC+NRbOt8bC+dZYON8aC+dbY+F8ayycb42F862xcL41Fs63xsL51lg43xoL51tj4XxrLJxvjYXzrbFwvjUWzrfGwvnWWDjfGgvnW2PhfGssnG+NhfOtsXC+NRbOt8bC+dZYON8aC+dbY+F8ayycb42F862xcL41Fs63xsL51lg43xoL51tj4XxrLJxvjYXzrbFwvjUWzrfGwvnWWDjfGgvnW2PhfGssnG+NhfOtsXC+NRbOt8bC+dZYON8aC+dbY+F8ayycb42F862xcL41Fs63xsL51lg43xoL51tj4XxrLJxvjYXzrbFwvjUWzrfGwvnWWDjfGgvnW2PhfGssnG+NhfOtsXC+NRbOt8bC+dZYON8aC+dbY+F8ayycb42F862xcL41Fs63xsL51lg43xoL51tj4XxrLJxvjYXzrbFwvjUWzrfGwvnWWDjfGgvnW2Ol+dbfI8yGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsKw2woDLOhMMyGwjAbCsNsKAyzoTDMhsIwGwrDbCgMs6EwzIbCMBsqhdmvnXvi0wuTo1v8/0sp26J9gec/aIFSf1Q8SGWid5Ynusr9xxej2vCfRT1KdPBfopI5Ovh+8afUd73yw08ROvfhQamLojct/vsppb/zSalfib50afSlX4q+9CfFg2tLVWIf78lPLY5+ysmpH/yqXw6bjNSS6McazzVNa6d0fZz365ff3D+ZVuInfOd+f+lbjR5v/evB/6vSX8r6qM96pniwYVr4l1H5SKXoL3vjtA/99dxeWrsYKP2+0Tf8Xbq0D/2f+zj3Tn7UrZJfL/1BUUv0u9F3d+7Nea28Oa+VN+e18ua8Vt6c18qb81p5c14rb85r5e14rbwdr5W347XylrtW3nLXylvuWnnLXStvsmvlTXatvMmulTfZtfImu1beZNfKm+xaeSNdK2+da+Wtc628da6Vt8618ma5Vt4e18rb41p5e1wrb1Ns5e1xrbw9rpW3x7Xy9rhW3h7XytvjWnl7XCtvj2vl7XGtvD2ulbfHtfL2uFbeHtfK2+NaeXtcK28fa+XtY628fayVt8618mayVt5M1sqbyVp5M1krbyZr5c1krbyZrJW31bXy1rJW3lrWylvLWnlrWStvLWstv4HrN0qvxygbnio/Hr/8oz/+qXA+pc2nwvEkvfbUYOnP+NPinzGLVPhQuBQzdfOvfRCc/2ryJxCXf//PuSV87g+M/qBrpn0Csfb+ub/GzRd/ZPjyeXa15cTePCv6ld/xyhdd1f516ao0VPqBXyz+vO6uYEz4500HK5O/D/2frEz1KjO8ynzux0zjjjCEq8zeKtO4v9AQrjJ7+/DI7cOTtso4rTJF+/Dw7OOMwT489PoRs66fbLL1ceZYf5HxVXvqN1l/z7D+nmH9PcP6e4b19wxLnRnW3zOsv2dYf8+w/p5h/T3D+nuG9fcM6+8Z1t8zrL9nWDDNsP6eYf09w/p7hvX3DOvvGdbfM6y/Z1h/z7D+nmH9PcP6e4b19wzr7xnW3zOsv2dYf8+w/p5h/T3D+nuG9fcM6+8Z1t8zrL9nWH/PsP6eYf09w/p7hvX3DOvvGdbfM6y/Z1h/z7D+nmH9PcOacYb19wzr7xnW3zOsv2dYf8+w/p5h/T3D+nuG9fcM6+8Z1t8zrL9nWH/PsP6eYf09w/p7hvX3DIvTGbbeM2y9Z9h6z7D1nmHrPcPWe4at9wxb7xm23jNsvWfYes+w9Z5h6z3D1nuGrfcMW+8Ztt4zbL1n2HrPsPWeYes9w9Z7hq33DFvvmfIi+m8VozK1IepjuqdGfeRvlx5WU/xC+Wc9PjU8w0tKbeQHU9Nge+ofhB1WuUX6F+d6wV/54AqeqvnoFqtylY/qqWujnxM1ZolSh/UPS7/vzKL/0ZRSvk7avLKUiZNS700uxVPxAj85+pnDxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfQfx3EP8dxH8H8d9B/HcQ/x3Efwfx30H8dxD/HcR/B/HfUY7/kR/38eFREN96Loj/3dQP4jtVSuTTH/Oz414qHjwcHbwQtTJ8mtyzURXPx8q9WDz49eggmg/+cnTwvxcP/mZ08Hzx4N3o4PXiwS/xGXTdxYPf+OgPo8sXD4aig+PFgywfTxc9ie3vFQ9SV0RXqcPRl14rHjwWHTwXtWbRwctR9xcdvBr1cdHBK8WDv/9Z+3i7zz/Q7qM/0M4PmPvUP96uPTVaelVE6xqvTg7+nlYxIl3F2G4VA75VfN+rGOmtYlC3ikHdKgZ1qxj+rWJst4rh3yqGeKsYE65ipLeKkd4qhnirGPCtYhi3iiHeKkZsqxixrWLAt4rB4CpGeqsY6a1ipLeKQd0qBoqrGBquYvi3qvwv+DvWwB3UwB3WwB3WwB3lGvh3f9yu2icxhKoskn14beyzP5b6C215Ratc/51Vrk98dPWzs53VnvpH5wabxStwcC4tLn7hH0ZfqKw3Vk6iZcWDX4y+ckP0zxcdzCgebI+u65UFxduKB3+neJC6OroY/lr0pbroG50WnkaVvcZ/WTz4o6ldwdLh/cWDnsnh+fRgdD5FX/m3URER3TC7JvqtX4u+FLVt3578keda5RRbWDx4JPo5lfXDaB3y9cnB66ayR3juxZBaFv0RndGXVhUPnogOro7+dqODyk5n1Iu+NTk8DS8uHiyL/q9+L/p3i36ja6Pf6G9EPzarePA4S5iV3cLKSmHlzPxPxYO/PTl8nf6L4sFL0Vf2R/8K0cFlxYMT0cH/WTz469HvHLW1o9H/53uil+fkruA94T9ik7Byit4Z/YZTwlO0cmbOLx48xYZk5RStnJCV8zBVPHiGs66SWHdE/5ejr1TWbM9l1v9R/MKO6AuVbdpoGD8YHVRWZe8rHvxmdFCJsSui0zc6J5ZHf8+/wx2JSjSdW2RNrYh+0u9HP/ZvigfnR1+6LvrSH0ZfqizSfozN09TK6Jf9y+hLNxcP/lM4Ik9dH/3Yf46+9J+j3zv6h/l30d9adFBZ9q1srM4tHvzWtCBoUquiX/9fox+LhhH/z5QwaSq5ck3xYEqYIqnV0S+7cUqQFak10ZemERZbigdVUz8qI1IN0c+eEf26G6KjL0Q/69x14z9Gf1/hFSC1Nvo5s6Kf3Rgd1UVHN0ZHc6OfFhX886ODSuRXkv7y4sGC6CuVgF9UPPjl6K/g30cv/g8eVJC6KfqhSop/OKErq7Uf3p+tLNtWQveB4sFl0cGfFQ+uDu8XpNZF3/Ty6EuVDeoPrbD+8CJcE/0DRgeVa2zlclm5gFaugH/+nnPqpuhPvTP6UuViVrl0fWgvOXVz9LN3REe3REc7o59VWVGuXMX+dfFgX/STbo1+0v3hZSy1PvrSQa5jc4oHQ9HB/1U8uCf6DeLRqzw6mF08eDA6OL948JXooHJpOneRaU+d4bm+bXQvbXQvbXQvbXQvbXQvbXQvbXQvbXQvbXQvbdTFbfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybfQybXQvbXQvbXQvbXQvbXQvbXQvbXQvbfQgbfQgbXQrbXQkbfQZbXQWbXQWbfQubfQubfQubXQrbXQkbXQkbXQkbfQgbfQnbfQSbfQEbfQnbfQgbfQLbfQ1bXQkbXQkbXQkbfQZbXRAbXRAbfQubeWO5H/9mJOWylylMk6pTEg+PBipjEHOTaDXlhqd+SiOatAMNBMtRIvQLDQb1aHFaE6o9tQYH0Dze5PD86KsoyiLpqNjaBnaGqo99V0++Gtq6Tu7HdWjJtSMWtClKIHmoStREi1F29DdKI2uRcvRdWgluhddj1ajnagBrUFr0W6UQTeiPWgvugUdQuvRPnQAHUQb0FVoE9oYqj31jz84dydt7gjO2jOctWc4T89wnp7hPD3DeXqmfJ7+XumPuCuqJ6J2pikqI/ZFRweiowdKd8r+CS+h7/MS+j7fzPd5CX2fb+37fGvf51v7Pt/a98vf2v9WWfZ5sZR1kzZ/pfh9TY9WVZ+Nfvz3Sz8eDYB/9Vz3+mdTox/4g9IPZIs/77og9r/L9/1dvu/v8p1+l+/0u3yn3+U7/W75O/3Dn8m3+UZt8n+IvvIZeb/vz+A7C1N3RmfjL3Z9/hbDT/sthv+UDPpDXst/+P+zd++BTZX348cLFKWQUnohbUpLVQS5NlCw3AmBkELLabm03JoUyiWoWxWFEy9RvMUgpiVNuIMghbgr3ZdsbA0Zu2/syza3oU67abbOuau7b9919/1ycp7G5/1DHTov6Pr94/vJq1bbQc7n+Xw+z5NzcC0/gxz0DK7sZ3BlP4Mr+xlc2c/oV3Zn8scm3uFVTyb+4YuJONaXOkCpKt99oxPcN3SZX3x1v7GPC1/K3PdNv4RfYwD8ui7YNzYbvpSr8o1Niy++9BIXbFX4FS/Bd+WV973ke7znWnsC19oTuLqewNX1BK6uJ3B1PaFfXc9pn07R3nvjk88jfx7X+HO4xp/Dz30O1/hz+C2ew2/xHH6L5/BbPKf/FnH82KfwY5/Cj30KP/Yp/Nin8GOfwo99Cj/2Kf3Hfj9VvqT2r+3JucsP8Ps8id/nSfw+T+L3eRK/z5P4fZ7E7/Mkfp8n9d+nCz/2WfzYZ/Fjn8WPfRY/6Fn8Es/ixz6LH/us/mN/eMm1k3Y/kA++Rk79L75VyruwdOqtmN7ivP1C8sLSPghxwiedotQm95npvlc6xaN9WOKz2r/6o+TWttZpKS2Jb1Wu1F7dr726Qns1R/uLEP1Y6sDfx5MX93WQCRoNjYFKITM0EZoKzYCyoZnQLGg2NBcqhmzQAsgOLYQWQYuhIVA1lAflQwXQUqgWKoFWQoOgLKgeckDroPXQJsgFXQVdDY2AroVyoZHQKGgsVAiNhyZAw6FJUBk0GZoCXQ8NhMqhaVAmNB3KgeZAFmgzZIXmQfOhCqgKUqAaaAm0DCqClkN10ApoFWSAVkNrICfUAK2FjFAjtAHaCI2DKmWpyouifK1aqFWvP8Z22S5sl+3CltgubIntwpbYLmxA6LoFug3aCo2FCiE3dDt0B1QK3QlNgiZDHqgcuhuaBt0DHYH80FGoPzQbehh6AOoHpUGPQcegWyEbdCXkgzKgm6CboWqoBsqDtkBBqA0aAG2DVGgZVATVQsehu6AT0HboXqgeckBZ0H3Q/VAY2gk1Qg9Ch6FDkBd6CKqEdkADoUGQAcqEsqEcKBcyQgVQMVQCNUMt0C4oAO2B9kIHoUegVigE7Yb2QfuhA7JU5SfJunSTVoM6+iX/0tKUcf2Sf+tpygPJ0+Y/TVW9n/e95meHtGL3Cz79CR5fTPyb6mjlZ8l/V7uvhF8+t92Ay7YBqbwBqbwB6awBib0Bl0MDLoAGXBwNSAwNuAAakAoakAoacDE2YHlowPLQgIu/ARdHAxaLBiwBDVgCGrB0NODCaUDCbEDCbMAi04CLqgEXVQMWkgak+Qak+QakugYksAYk4QYsHQ1YEBqQQhqQQhqwWDQg6TcghTQgvTRgGWtAMtX1KFQDBaE2qBA6Dh2BTkBZ0FEoDD0GHZOlKj/HXFDFhEhFS6JiQqTqxdMv3pV7Zr3zHt+bN+/RBnrdvt65z5s793kJn2udh5Z/HhqseWhDdQ2GsqAhUDaUA+VCedBQyAjlQwWQCSqEhkFFUDE0HCqBroKuhq6BRkDXQiOhUdB10GhoDDQWGgeNhyZApZAZmghNgsqgydAU6HqoHJoKTYOmQzOgmdAsaDY0B7JAcyErNA+aD9mgBZAdqoAWQougSqgKWgwpUDVUAy2BlkLLoOVQLVQHrYBWQqug1dAaqB5yQE6oAVoLrYMaofXQBmgjtAlyQZtlqYk6Qx7ZXJM8gnUjdBP0Puj9UCXUBN0M3QJVQ3nQFuhW6DZoKzQW2gap0DLIDd0O3QGVQndCd0GToMmQB7obmgbdA22H7oXqIQd0H3Q/9AD0IOSFHoJskA/aAZVDs6GHoQFQEZQB9Yf6QTuhRigNuhJ6BPJDzVALtAsKQK1QEApBu6E90F5oH7QfOgAdhA5Bh6Fa6FGoEDoCHYUeg45BNVAbdBw6AWVBYSgbKoYKoBJoEJQLDYQyoRzIABllqcqvUkdYd0lvyb+gdviLno1/nXqmQ5q8P6kqv+l5imnVCunf6tb/rd+mHsjaM9+p8mlf/538INaqf0qXXBKq8ntteq8NiIYlD5/84VIfa/aPxBcsaObe4M3s/ph6OGu8b/JSTquKa1//P/4mf0l8/aDvVe6q933tF/lr4sXIvq/4G6W6ikv41VTlT6l74f3B13svvP+me+F1izt86JdWKWZrpZjClWIKV4q5WymmaaWYppVimlaKCV0pZmulmNCVYtJWilleKeZupZi7lWLuVoq5WynmbqWYu5Vi7laKuVsp5m6lmLuVYu5WirlbKeZupZi7lWLuVoq5WynmbqX63O3Pyb8q7VPCf+rn05/5/B2f/jHoj2hHNBZpR5K/q33nX1IH6A/79Bl5YfIv+6+9o7fXPXrTDstf1ecS8867aAbXO3vzvWmzt1TOug319216JfQ3zMu/jXm5rv6QHyqFamSpyt9T6/bT4g3+aLrvEhbw1Gfy3+yV/DUWcO2WDjf09fWu5K9/JdduEXE+/dLelKryD/HJLv2dUonmo1J/S/4T84/nkqvNjdD7oPdDTdCj0C3QbdBWaCxUCLmh26E7oFLoTmgSNBnyQOXQ3dA06B7oCOSHjkL9odnQw9ADUD8oDXoMOgbdCtmgKyEflAHdBN0MVUM1UB60BQpCbdAAaBukQsugIqgWOg7dBZ2AtkP3QvWQA8qC7oPuh8LQTqgRehA6DB2CvNBDUCW0A3oEaoZaoF1QAGqFQtBuaA+0F9oH7YcOQAehgdAgyABlQtlQDpQLGaECqBgqkaUq/0qmWHx49Ue+l7eazmKr6Sy2ms5iq+kstprOYpvtLDaezmLj6Sw2ns5iK+0stqHOYhvqLLahzmLT7Sw2pc5iU+osNqXOYtPtLEqZs9iiOostqrPYojqLLaqz2KI6iy2qs9ii0jUQKoemQtOgTGg6NAPKhnKgmdAsaDY0B7JAcyErNA8qhuZDNmgBZIcqoIXQIqgSqoIWQ0MgBaqGaqA8KB8qgJZAS6FlUBG0HKqF6qASaAW0EloFDYIM0GpoDZQF1UMOyAk1QGshI7QOaoTWQxugjdAmyAVtlqUqaempD5d8M9338gdJelJiDCkxhpQYQ0qMISXGkBJjSIkxpMQYUmIMKTGGlBhDSowhJcaQEmNIiTGkxBhSYgwpMYaUGENKjCElxpASY0iJMaTEGFJiDCkxhpQYQ0qMISXGkBJjSIkxpMQYUmIMKTGGlBhDSowhJcaQEmNIiTGkxBhSYgwpMYaUGENKjCElxpASY0iJMaTEGFJiDCkxhpQYQ0qMISXGkBJjSIkxpMQYUmIMKTGGlBhDSowhJcaQEmNIiTGkxBhSYgwpMYaUGENKjCElxpASY0iJMaTEGFJiDCkxhpQYQ0qMISXGkBJjSIkxpMQYUmIMKTGGlBhDSowhJcaQEmNIiTGkxBhSYgwpMYaUGNNTYh8tJaZ6wxeT37ITOiRLVfqm90x2PyGqSmVKv5dzqar0S35DT3oo7yenVF2joRHQDGgxVAeNhDZDPU9wPJf8ldPTX+nBDKrSP13ep/ua/C9+LfkvXpH8Bm/i+3dL2bcCA4kKNEsVaNEr0MZVoBGuwPCgAm1qBZqlCrToFRgXVKCZr0CjX4GGtgLNfAXavwq0fxVoaCvQ9legfa9Aw16B1rACbWMFxhMVaJIrMMSpQDNfgYa9Ag17BcY2FWi1KzAcqUCrXYGWuQKjkgo0yRUYclRgyFGhN1lXpstHHmuQXmqQXmqwjOkaDGVBQ6BsKAfKhfKgoZARyocKIBNUCA2DiqBiaDhUAl0FXQ1dA42AroVGQqOg66DR0BhoLDQOGg9NgEohMzQRmgSVQZOhKdD1UDk0FZoGTYdmQDOhWdBsaA5kgeZCVmgeNB+yQQsgO1QBLYQWQZVQFbQYUqBqqAZaAi2FlkHLoVqoDloBrYRWQauhNVA95ICcUAO0FloHNULroQ3QRmgT5II2y1KVAenyfQnP47I/j8v+PC7787jszyPlnUcSOI8kcB5J4DzS2nmkhPNICeeREs4jAZ5HgjiPBHEeCeI8EuB5pIvzSBfnkS7OI12cR7o4j3RxHuniPNKFroFQOTQVmgZlQtOhGVA2lAPNhGZBs6E5kAWaC1mheVAxNB+yQQsgO1QBLYQWQZVQFbQYGgIpUDVUA+VB+VABtARaCi2DiqDlUC1UB5VAK6CV0CpoEGSAVkNroCyoHnJATqgBWgsZoXVQI7Qe2gBthDZBLmizLFXJSJdPOpWjrC9HWV+Osr4chXw5CvlyFPLlKOTLUciXo5AvR6tQjrK+HGV9Ocr6cpT15Sjry1HWl6OsL0dZX46yvhxlfTnK+nKU9eUo68tR1pejrC9HWV+Osr4cZX05yvpyvawfmP5vHytc9SHff34Qc1Di5ySb6ce0g6CGdHFXh79qykRrMR5X03hcTeORtXUNhrKgIVA2lAPlQnnQUMgI5UMFkAkqhIZBRVAxNBwqga6CroaugUZA10IjoVHQddBoaAw0FhoHjYcmQKWQGZoITYLKoMnQFOh6qByaCk2DpkMzoJnQLGg2NAeyQHMhKzQPmg/ZoAWQHaqAFkKLoEqoCloMKVA1VAMtgZZCy6DlUC1UB62AVkKroNXQGqgeckBOqAFaC62DGqH10AZoI7QJckGbZanKYLQWHbjsO3DZd+Cy78Bl34GU14Ek0IEk0IEk0IG01oGU0IGU0IGU0IEE2IEE0YEE0YEE0YEE2IF00YF00YF00YF00YF00YF00YF00YF0oWsgVA5NhaZBmdB0aAaUDeVAM6FZ0GxoDmSB5kJWaB5UDM2HbNACyA5VQAuhRVAlVAUthoZAClQN1UB5UD5UAC2BlkLLoCJoOVQL1UEl0ApoJbQKGgQZoNXQGigLqocckBNqgNZCRmgd1AithzZAG6FNkAvaLEtVstKlZ1qnnmStP9z6T9pB6otvR6NVnVGffjeamE+6PY12B5tPa//RIal9k+STv1IP6ko9qEh7oFu6dvDfpR0uuiH5Rkqr2u6Tnr72E+0kqrbXPjjxYka6T3qwW6d2mjfdJz3aLPU4t6HawVrt19aeOzRN++E9T9VKPaoteZp3VLpP//jBrdoL7QFMO/BMrNTjn7QHfh3Ec6C0x059XXuhPQ/tM9qLPyZ+9y0+6Wlqv028uKC9SD1sS3v22i7tReq5aKlnbKUeefSrxH8m5JOej3Ypz0ASdW/VqeTfZna6fDj21mSDciN0E/QQ9D7o/VATdDNUDeVBW6Ct0FhoG6RCyyA3dDt0B1QK3QndBU2C7obugbZD90L1kAPyQfdBD0APQl7oVsgGVUI7oHJoNvQwNAAqgvpDV0L9oJ1QI5QGZUCHoMNQLeSHHoUKoSPQUegx6BhUAwWhNug4dALKgsKyVCUHF6wLl6gLf40uXKIuXKIuvE1deDO4cPm68BZ24U3rwhvahQvdhTetCxe6Cxe6Cxe6Cxe6Cxe6Cxe6C299Fy50Fy5fFy50Fy4SFy4SFy4SF1KCC0nAhSTgwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwiXjwpvdhTe7C292Fy4uF976LlxqLlwILlwILlyGLlwWLlyULlyULv2SyU1P3VDvvnTfy/fR0z6MrHw0eUO9vOS35CcfL9hH/5aqP4rveDh5w6Gh8ois6rPajxkkwyAjU8ZgGVkyhsjIlpEjI1dGnoyhMowy8mUUyDDJKJQxTEaRjGIZw2WUyLhKxtUyrpExQsa1MkbKGCXjOhmjZYyRMVbGOBnjZUyQUSrDLGOijEkyymRMljFFxvUyymVMlTFNxnQZM2TMlDFLxmwZc2RYZMyVYZUxT8Z8GTYZC2TYZVTIWChjkYxKGVUyFstQZFTLqJGxRMZSGctkLJdRK6NOxgoZK2WskrFaxhoZ9TIcMpwyGmSslbFORqOM9TI2yNgoY5MMl4zNElTFmN7zVI5t6dKKsxmf6Nysf3wuH3sDQ9EOD0U7PBRjF12DoSxoCJQN5UC5UB40FDJC+VABZIIKoWFQEVQMDYdKoKugq6FroBHQtdBIaBR0HTQaGgONhcZB46EJUClkhiZCk6AyaDI0BboeKoemQtOg6dAMaCY0C5oNzYEs0FzICs2D5kM2aAFkhyqghdAiqBKqghZDClQN1UBLoKXQMmg5VAvVQSugldAqaDW0BqqHHJATaoDWQuugRmg9tAHaCG2CXNBmWapSkP5WPpq2p+dzY0jjRgfoxpDGjQ7QjQ7QjS7Pjd7NjSGNG72bG72bG72bG72bG72bG72bG0MaN3o3N4Y0bvRubnRkbnR5bvRnbvRnbgxp3Oh+3ehw3ehp3eh33RjSuDGkcaPfdWNI40an6kb/6Ub/6Ub/6UZf7kZ370bH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UbH6UYf6Ubn6EZ36EY/6EY/6Ebf6kbf6kbf6kan6kZv6kZv6kY36tY7TlP6v7n3jHajlQe10qv3JjRV4t4ZWjV6SPsjea/eCLr3JjS+N/8mNBvRsmzUW5ZC/aiT/rUM7ZLcqgxLl+8e887dNOZSbv92mdw9RrsTy3fTL/FdebndRuaS7h5T9LYUbCoKNhUFm4qCTUXBpqJgU1GwqSjYVBRsKgo2FQWbioJNRcGmomBTUbCpKNhUFGwqCjYVBZuKgk1FwaaiYFNRsKko2FQUbCoKNhUFm4qCTUXBpqJgU1GwqSjYVBRsKgo2FQWbioJNRcGmomBTUbCpKNhUFGwqCjYVBZuKgk1FwaaiYFNRsKko2FQUbCoKNhUFm4qCTUXBpqJgU1GwqSjYVBRsKgo2FQWbioJNRcGmomBTUbCpKNhUFGwqCjYVBZuqF2zF/65g663Tqt4Lz+nQ6u6QtqT11mm+t7VOuxF12o16nTY8vefewH/v59Mf2vql5HZcSc9Z9TatdLvq312c79zz599jj51P5JGqI6/3mnpHHj//Hnns/NU4TdyGjYI2bBS0YaOgDRsFbdgkacO2QRu2DdqwbdCGjZA2bCK0YROhDZsIbdgyacOWQhu2FNqwpdCGLZM2bDC0YYOhDRsMbdhgaMMGQxs2GNqwwdCGDQZdA6FyaCo0DcqEpkMzoGwoB5oJzYJmQ3MgCzQXskLzoGJoPmSDFkB2qAJaCC2CKqEqaDE0BFKgaqgGyoPyoQJoCbQUWgYVQcuhWqgOKoFWQCuhVdAgyACthtZAWVA95ICcUAO0FjJC66BGaD20AdoIbYJc0GZZqnJNqgToeTyA8slkCTAi+Q96skMZmtgytEtlaKzK0FiVoZUqQ4NUhgapDA1SGZquMrRLZWjBytCClaGVKkMrVYZWqgzNUxkaqzI0QWVonsrQ2pShtSlDY1WGhqwMrVQZWqkytFJlaJDK0MiVoVkrQ9NVprdS12q1mzbMPZB84sRIHB+YgPf/BLz/JyDP6hoMZUFDoGwoB8qF8qChkBHKhwogE1QIDYOKoGJoOFQCXQVdDV0DjYCuhUZCo6DroNHQGGgsNA4aD02ASiEzNBGaBJVBk6Ep0PVQOTQVmgZNh2ZAM6FZ0GxoDmSB5kJWaB40H7JBCyA7VAEthBZBlVAVtBhSoGqoBloCLYWWQcuhWqgOWgGthFZBq6E1UD3kgJxQA7QWWgc1QuuhDdBGaBPkgjbLUpVRb/oWRSINV532/SdbFdu0r7z6VoVSrX0cp9p32exZvIu2KrTtlQ9oX3mN3vHFxIvvpftecfPiOnF7PP091BfVTF/URH2xhvdFPdEXFURfVAl9Ub/01df30RdXbB9IVmxjemeo7/oZqvaw4g5f71b3ZTUkGovbXNbhNpd1uM1lHW5zWYfbXNbhNpd1uM1lHW5zWYfbXNbps9pxb8HVrU3jj2nZTWsXPpjee71flnsmvdf523Kdv3wKD1slbv3yG5+uPwAy+cWqL0vfoWO2BFWZkPzu/0tcMV/y6Z9IbkmWDKWvcq+hix7/eCk3G/pb4nvH+5KPiqwa5nulmw89mvgna3zyTYjMmAaYMQ0wYxpgxjTAjGmAGdMAM6YBZkwDzJgGmDENMGMaYMY0wIxpgBnTADOmAWZMA8yYBpgxDTBjGmDGNMCMaYAZ0wAzpgFmTAPMmAaYMQ0wYxpgxjTAjGmAGdMAM6YBZkwDzJgGmDENMGMaYMY0wIxpgBnTADOmAWZMA8yYBpgxDTBjGmDGNMCMaYAZ0wAzpgFmTAPMmAaYMQ0wYxpgxjTAjGmAGdMAM6YBZkwDzJgGmDENMGMaYMY0wIxpgBnTADOmAWZMA8yYBpgxDTBjGmDGNMCMaYAZ0wAzpgFmTAPMmAaYMQ0wYxpgxjTAjGmAGdMAM6YBZkwDzJgGmDENMGMaYMY0wIxpgBnTADOmAWZMA8yYBpgxDTBjGmDGNMCMaYAZ0wCzPg2YKG6Xnlb1G9+eVL+lKpOSX+85FVaPRzjX48Ho9Xigcz0eaV6Ph3XX4/Hj9Xj0cz0ekF2PB0HX4/Hc9Xjkdz0e+V2PR3fX4/Hc9XicdD0eJ12PR3fX42Hk9XhUuK6boRpoCxSE2qABUBFUCx2HTkD3QllQGNoJNUIPQoehQ5AX2iFLVcrkJqLq+9IiomO0jBEyZshYLKNOxkgZm2VcJaNChl1GvgyTjDEylsswy5goY7KMlTKmyCiXsUbGNBlTZThlzJLRIGOtjLky5slYJ2OjjE0yxslYIEFVJif/arWjqWt6ZnyfS6aKKfJTBxQzLk+z/ra4HreTOICTqgdwGvUATqMewGnUA9hq0nULdBu0FRoLFUJu6HboDqgUuhOaBE2GPFA5dDc0DboHOgL5oaNQf2g29DD0ANQPSoMeg45Bt0I26ErIB2VAN0E3Q9VQDZQHbYGCUBs0ANoGqdAyqAiqhY5Dd0EnoO3QvVA95ICyoPug+6EwtBNqhB6EDkOHIC/0EFQJ7YAGQoMgA5QJZUM5UC5khAqgYqgEaoZaoF1QANoD7YUOQo9ArVAI2g3tg/ZDB2SpSnny3iKbtY2Scz79fr5f973cJSs3aP/kG4kX12gvvul7hZnXxc13auiQauYvbtlf3iqYermM5nvuq3LRyE6/98opbQbYO7zzvRuGd9rw9lPa39fbOcXTdps+rf3Qy36cpyrTerZzle241l7tEnsnPmnWu1n7qm+GbyHNvr7PlU1/+XZSYXHHqdTtpI4nN0tnJN8c2t9Vi3hP6LfKfD7xnUXaN8wURb2+lExO1u5l0NXQaKgcGgHNgBZDddBIaDNkl6Uqs7RTXz3N1Be2aie/ZuN/wRT8L5iC/wVT8L9gCv4XTMH/Al0z9vZJ65Om/R++vBiqg0ZCmyG7LFWZg5YohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYohJYopLdEllRpdGkf5Hr10kirgQPaEvveqJFeo4B/04ulN2uP/C2rpVVl7uXSt751R0y0Nmrw29Su1mhvjz6v+L797+lbew+d+OQu1YoTGTacyLDhRIYN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YBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYBANYFBvAD/Y2wD2NoBvVQOoDdF/4ftvHF6nFlIVe0eqvnf0IdEb6l8sQWVRglxdglWrBKtyCdb2ElQIJfrV/WE+rLIg8cLbL5lGE1ddP9/LT61UXNrRk5n6271qu096jOVPtD9i7eTJ4MSLGdqL1IMtO7VrTXsxPPGiFI+6HKq9k7V3zk8TL6ZpP/xniRdDtBc/T7ywai9M2t+99s3azWZv1V78IvFih/biJe3NiUdmFiZeHNReaE/cPKq9+HXixde1F79JvPiM9uKPid99i096rOZvEy8uaC9+l3jxjPbiu4kXu8QjOBOtuE969GZe4sXntP/Fv0r8Z0LJv4Q0pVr7Rf+QeLFCe3Hx0zmHaJel9qLnFgmfSP7Bf0Q7YKndTHd38r7qH8U9fb/fR14ede2EdkD9IT9UCtXIUpWTeJ8Nx/tsON5nw/E+G4732XC8z4bjfTZcf5+1477xL2z1vXzf+BeS3/Cxy3eZ0eZNI173g1961xvf5bfe/PetM6ryPz1PcKhPZppTF48dv5McO0b+3RX4tl9478bLLJGmqn7qe80jNW/nxXUp11TvpXSpl9LHk5dIWsJN2n9XO7FxQfuOvokXn++5F/4U7c+0X+KFX/uedO2Nob24IvEiqL24Unt/ai8GaFeJ9iIj8WJG8gd8IvkDtFsfrZFvffQUhgNPoc1+CgvzU2isn9IX39OYknViStaJ+UgnZmadmJl1ohPvxAStE3OVTkzQOjFl6cRcpRNzlU5MfDoxeevE5K0Tk7dOTFk6MWXpxJSlE1O5TkzlOjGV68RUrhNTuU5MYDoxo+vEjK4TM7pOTOU6MZXr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'
|
|
3435
|
+
)
|
|
3436
|
+
DATA = pickle.loads(zlib.decompress(base64.b64decode(DATA)))
|
|
3437
|
+
MEMO = (
|
|
3438
|
+
b'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'
|
|
3439
|
+
)
|
|
3440
|
+
MEMO = pickle.loads(zlib.decompress(base64.b64decode(MEMO)))
|
|
3441
|
+
Shift = 0
|
|
3442
|
+
Reduce = 1
|
|
3443
|
+
def Lark_StandAlone(**kwargs):
|
|
3444
|
+
return Lark._load_from_dict(DATA, MEMO, **kwargs)
|